@@ -180,7 +180,9 @@ cdef class BuilderManager:
180
180
builder.append_nulls(count - builder.length())
181
181
182
182
# Append the next value.
183
- builder.append_raw(doc_iter, value_t)
183
+ status = builder.append_raw(doc_iter, value_t)
184
+ if not status.ok():
185
+ raise ValueError (" Could not append raw value" )
184
186
185
187
# Recurse into documents.
186
188
if value_t == BSON_TYPE_DOCUMENT:
@@ -271,9 +273,11 @@ cdef class _ArrayBuilderBase:
271
273
while bson_iter_next(& doc_iter):
272
274
bson_iter_key(& doc_iter)
273
275
value_t = bson_iter_type(& doc_iter)
274
- self .append_raw(& doc_iter, value_t)
276
+ status = self .append_raw(& doc_iter, value_t)
277
+ if not status.ok():
278
+ raise ValueError (" Could not append raw value of type" , value_t)
275
279
276
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
280
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
277
281
pass
278
282
279
283
cdef shared_ptr[CArrayBuilder] get_builder(self ):
@@ -309,14 +313,13 @@ cdef class StringBuilder(_ArrayBuilderBase):
309
313
self .builder.reset(new CStringBuilder(pool))
310
314
self .type_marker = BSON_TYPE_UTF8
311
315
312
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
316
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
313
317
cdef const char * value
314
318
cdef uint32_t str_len
315
319
if value_t == BSON_TYPE_UTF8:
316
320
value = bson_iter_utf8(doc_iter, & str_len)
317
- self .builder.get().Append(value, str_len)
318
- else :
319
- self .builder.get().AppendNull()
321
+ return self .builder.get().Append(value, str_len)
322
+ return self .builder.get().AppendNull()
320
323
321
324
cdef shared_ptr[CArrayBuilder] get_builder(self ):
322
325
return < shared_ptr[CArrayBuilder]> self .builder
@@ -328,14 +331,13 @@ cdef class CodeBuilder(StringBuilder):
328
331
self .builder.reset(new CStringBuilder(pool))
329
332
self .type_marker = BSON_TYPE_CODE
330
333
331
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
334
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
332
335
cdef const char * bson_str
333
336
cdef uint32_t str_len
334
337
if value_t == BSON_TYPE_CODE:
335
338
bson_str = bson_iter_code(doc_iter, & str_len)
336
- self .builder.get().Append(bson_str, str_len)
337
- else :
338
- self .builder.get().AppendNull()
339
+ return self .builder.get().Append(bson_str, str_len)
340
+ return self .builder.get().AppendNull()
339
341
340
342
cdef shared_ptr[CArrayBuilder] get_builder(self ):
341
343
return < shared_ptr[CArrayBuilder]> self .builder
@@ -353,11 +355,10 @@ cdef class ObjectIdBuilder(_ArrayBuilderBase):
353
355
self .builder.reset(new CFixedSizeBinaryBuilder(dtype, pool))
354
356
self .type_marker = BSON_TYPE_OID
355
357
356
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
358
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
357
359
if value_t == BSON_TYPE_OID:
358
- self .builder.get().Append(bson_iter_oid(doc_iter).bytes)
359
- else :
360
- self .builder.get().AppendNull()
360
+ return self .builder.get().Append(bson_iter_oid(doc_iter).bytes)
361
+ return self .builder.get().AppendNull()
361
362
362
363
cdef shared_ptr[CArrayBuilder] get_builder(self ):
363
364
return < shared_ptr[CArrayBuilder]> self .builder
@@ -374,22 +375,27 @@ cdef class Int32Builder(_ArrayBuilderBase):
374
375
self .builder.reset(new CInt32Builder(pool))
375
376
self .type_marker = BSON_TYPE_INT32
376
377
377
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
378
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
378
379
cdef double dvalue
380
+ cdef int64_t ivalue
379
381
380
382
if (value_t == BSON_TYPE_INT32 or value_t == BSON_TYPE_BOOL or value_t == BSON_TYPE_INT64):
381
- # The builder will surface overflow errors.
382
- self .builder.get().Append(< int32_t> bson_iter_as_int64(doc_iter))
383
- elif value_t == BSON_TYPE_DOUBLE:
383
+ # Check for overflow errors.
384
+ ivalue = bson_iter_as_int64(doc_iter)
385
+ if ivalue > INT_MAX or ivalue < INT_MIN:
386
+ raise OverflowError (" Overflowed Int32 value" )
387
+ return self .builder.get().Append(ivalue)
388
+ if value_t == BSON_TYPE_DOUBLE:
384
389
# Treat nan as null.
385
390
dvalue = bson_iter_as_double(doc_iter)
386
391
if isnan(dvalue):
387
- self .builder.get().AppendNull()
388
- else :
389
- # The builder will surface overflow errors.
390
- self .builder.get().Append(< int32_t> bson_iter_as_int64(doc_iter))
391
- else :
392
- self .builder.get().AppendNull()
392
+ return self .builder.get().AppendNull()
393
+ # Check for overflow errors.
394
+ ivalue = bson_iter_as_int64(doc_iter)
395
+ if ivalue > INT_MAX or ivalue < INT_MIN:
396
+ raise OverflowError (" Overflowed Int32 value" )
397
+ return self .builder.get().Append(ivalue)
398
+ return self .builder.get().AppendNull()
393
399
394
400
cdef shared_ptr[CArrayBuilder] get_builder(self ):
395
401
return < shared_ptr[CArrayBuilder]> self .builder
@@ -403,22 +409,20 @@ cdef class Int64Builder(_ArrayBuilderBase):
403
409
self .builder.reset(new CInt64Builder(pool))
404
410
self .type_marker = BSON_TYPE_INT64
405
411
406
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
412
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
407
413
cdef double dvalue
408
414
409
415
if (value_t == BSON_TYPE_INT64 or
410
416
value_t == BSON_TYPE_BOOL or
411
417
value_t == BSON_TYPE_INT32):
412
- self .builder.get().Append(bson_iter_as_int64(doc_iter))
413
- elif value_t == BSON_TYPE_DOUBLE:
418
+ return self .builder.get().Append(bson_iter_as_int64(doc_iter))
419
+ if value_t == BSON_TYPE_DOUBLE:
414
420
# Treat nan as null.
415
421
dvalue = bson_iter_as_double(doc_iter)
416
422
if isnan(dvalue):
417
- self .builder.get().AppendNull()
418
- else :
419
- self .builder.get().Append(bson_iter_as_int64(doc_iter))
420
- else :
421
- self .builder.get().AppendNull()
423
+ return self .builder.get().AppendNull()
424
+ return self .builder.get().Append(bson_iter_as_int64(doc_iter))
425
+ return self .builder.get().AppendNull()
422
426
423
427
cdef shared_ptr[CArrayBuilder] get_builder(self ):
424
428
return < shared_ptr[CArrayBuilder]> self .builder
@@ -432,14 +436,13 @@ cdef class DoubleBuilder(_ArrayBuilderBase):
432
436
self .builder.reset(new CDoubleBuilder(pool))
433
437
self .type_marker = BSON_TYPE_DOUBLE
434
438
435
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
439
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
436
440
if (value_t == BSON_TYPE_DOUBLE or
437
441
value_t == BSON_TYPE_BOOL or
438
442
value_t == BSON_TYPE_INT32 or
439
443
value_t == BSON_TYPE_INT64):
440
- self .builder.get().Append(bson_iter_as_double(doc_iter))
441
- else :
442
- self .builder.get().AppendNull()
444
+ return self .builder.get().Append(bson_iter_as_double(doc_iter))
445
+ return self .builder.get().AppendNull()
443
446
444
447
cdef shared_ptr[CArrayBuilder] get_builder(self ):
445
448
return < shared_ptr[CArrayBuilder]> self .builder
@@ -466,11 +469,10 @@ cdef class DatetimeBuilder(_ArrayBuilderBase):
466
469
def unit (self ):
467
470
return self .dtype
468
471
469
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
472
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
470
473
if value_t == BSON_TYPE_DATE_TIME:
471
- self .builder.get().Append(bson_iter_date_time(doc_iter))
472
- else :
473
- self .builder.get().AppendNull()
474
+ return self .builder.get().Append(bson_iter_date_time(doc_iter))
475
+ return self .builder.get().AppendNull()
474
476
475
477
cdef shared_ptr[CArrayBuilder] get_builder(self ):
476
478
return < shared_ptr[CArrayBuilder]> self .builder
@@ -485,11 +487,10 @@ cdef class Date64Builder(_ArrayBuilderBase):
485
487
self .builder.reset(new CDate64Builder(pool))
486
488
self .type_marker = ARROW_TYPE_DATE64
487
489
488
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
490
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
489
491
if value_t == BSON_TYPE_DATE_TIME:
490
- self .builder.get().Append(bson_iter_date_time(doc_iter))
491
- else :
492
- self .builder.get().AppendNull()
492
+ return self .builder.get().Append(bson_iter_date_time(doc_iter))
493
+ return self .builder.get().AppendNull()
493
494
494
495
@property
495
496
def unit (self ):
@@ -509,17 +510,16 @@ cdef class Date32Builder(_ArrayBuilderBase):
509
510
self .builder.reset(new CDate32Builder(pool))
510
511
self .type_marker = ARROW_TYPE_DATE32
511
512
512
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
513
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
513
514
cdef int64_t value
514
515
cdef int32_t seconds_val
515
516
516
517
if value_t == BSON_TYPE_DATE_TIME:
517
518
value = bson_iter_date_time(doc_iter)
518
519
# Convert from milliseconds to days (1000*60*60*24)
519
520
seconds_val = value // 86400000
520
- self .builder.get().Append(seconds_val)
521
- else :
522
- self .builder.get().AppendNull()
521
+ return self .builder.get().Append(seconds_val)
522
+ return self .builder.get().AppendNull()
523
523
524
524
@property
525
525
def unit (self ):
@@ -539,8 +539,8 @@ cdef class NullBuilder(_ArrayBuilderBase):
539
539
for i in range (count):
540
540
self .append_null()
541
541
542
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
543
- self .builder.get().AppendNull()
542
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
543
+ return self .builder.get().AppendNull()
544
544
545
545
cdef shared_ptr[CArrayBuilder] get_builder(self ):
546
546
return < shared_ptr[CArrayBuilder]> self .builder
@@ -554,11 +554,10 @@ cdef class BoolBuilder(_ArrayBuilderBase):
554
554
self .builder.reset(new CBooleanBuilder(pool))
555
555
self .type_marker = BSON_TYPE_BOOL
556
556
557
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
557
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
558
558
if value_t == BSON_TYPE_BOOL:
559
- self .builder.get().Append(bson_iter_bool(doc_iter))
560
- else :
561
- self .builder.get().AppendNull()
559
+ return self .builder.get().Append(bson_iter_bool(doc_iter))
560
+ return self .builder.get().AppendNull()
562
561
563
562
cdef shared_ptr[CArrayBuilder] get_builder(self ):
564
563
return < shared_ptr[CArrayBuilder]> self .builder
@@ -577,22 +576,20 @@ cdef class Decimal128Builder(_ArrayBuilderBase):
577
576
else :
578
577
self .supported = 0
579
578
580
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
579
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
581
580
cdef uint8_t dec128_buf[16 ]
582
581
cdef bson_decimal128_t dec128
583
582
584
583
if self .supported == 0 :
585
584
# We do not support big-endian systems.
586
- self .builder.get().AppendNull()
587
- return
585
+ return self .builder.get().AppendNull()
588
586
589
587
if value_t == BSON_TYPE_DECIMAL128:
590
588
bson_iter_decimal128(doc_iter, & dec128)
591
589
memcpy(dec128_buf, & dec128.low, 8 );
592
590
memcpy(dec128_buf + 8 , & dec128.high, 8 )
593
- self .builder.get().Append(dec128_buf)
594
- else :
595
- self .builder.get().AppendNull()
591
+ return self .builder.get().Append(dec128_buf)
592
+ return self .builder.get().AppendNull()
596
593
597
594
cdef shared_ptr[CArrayBuilder] get_builder(self ):
598
595
return < shared_ptr[CArrayBuilder]> self .builder
@@ -615,19 +612,17 @@ cdef class BinaryBuilder(_ArrayBuilderBase):
615
612
def subtype (self ):
616
613
return self ._subtype
617
614
618
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
615
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
619
616
cdef const char * val_buf
620
617
cdef uint32_t val_buf_len
621
618
cdef bson_subtype_t subtype
622
619
623
620
if value_t == BSON_TYPE_BINARY:
624
621
bson_iter_binary(doc_iter, & subtype, & val_buf_len, < const uint8_t ** > & val_buf)
625
622
if subtype != self ._subtype:
626
- self .builder.get().AppendNull()
627
- else :
628
- self .builder.get().Append(val_buf, val_buf_len)
629
- else :
630
- self .builder.get().AppendNull()
623
+ return self .builder.get().AppendNull()
624
+ return self .builder.get().Append(val_buf, val_buf_len)
625
+ return self .builder.get().AppendNull()
631
626
632
627
cdef shared_ptr[CArrayBuilder] get_builder(self ):
633
628
return < shared_ptr[CArrayBuilder]> self .builder
@@ -646,8 +641,9 @@ cdef class DocumentBuilder(_ArrayBuilderBase):
646
641
self .type_marker = BSON_TYPE_DOCUMENT
647
642
self .field_map = dict ()
648
643
649
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
644
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
650
645
self .count += 1
646
+ return CStatus_OK()
651
647
652
648
cpdef uint64_t length(self ):
653
649
return self .count
@@ -675,8 +671,8 @@ cdef class ListBuilder(_ArrayBuilderBase):
675
671
self .count = 0
676
672
self .type_marker = BSON_TYPE_ARRAY
677
673
678
- cdef void append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t) except * :
679
- self .builder.get().Append(self .count)
674
+ cdef CStatus append_raw(self , bson_iter_t * doc_iter, bson_type_t value_t):
675
+ return self .builder.get().Append(self .count)
680
676
681
677
cpdef void append_count(self ):
682
678
self .count += 1
0 commit comments