# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. from pyarrow.includes.libarrow cimport CStatus, IsPyError, RestorePyError from pyarrow.includes.common cimport c_string class ArrowException(Exception): pass class ArrowInvalid(ValueError, ArrowException): pass class ArrowMemoryError(MemoryError, ArrowException): pass class ArrowKeyError(KeyError, ArrowException): def __str__(self): # Override KeyError.__str__, as it uses the repr() of the key return ArrowException.__str__(self) class ArrowTypeError(TypeError, ArrowException): pass class ArrowNotImplementedError(NotImplementedError, ArrowException): pass class ArrowCapacityError(ArrowException): pass class ArrowIndexError(IndexError, ArrowException): pass class ArrowSerializationError(ArrowException): pass # Compatibility alias ArrowIOError = IOError # This function could be written directly in C++ if we didn't # define Arrow-specific subclasses (ArrowInvalid etc.) cdef int check_status(const CStatus& status) nogil except -1: if status.ok(): return 0 with gil: if IsPyError(status): RestorePyError(status) return -1 # We don't use Status::ToString() as it would redundantly include # the C++ class name. message = frombytes(status.message(), safe=True) detail = status.detail() if detail != nullptr: message += ". Detail: " + frombytes(detail.get().ToString(), safe=True) if status.IsInvalid(): raise ArrowInvalid(message) elif status.IsIOError(): # Note: OSError constructor is # OSError(message) # or # OSError(errno, message, filename=None) # or (on Windows) # OSError(errno, message, filename, winerror) errno = ErrnoFromStatus(status) winerror = WinErrorFromStatus(status) if winerror != 0: raise IOError(errno, message, None, winerror) elif errno != 0: raise IOError(errno, message) else: raise IOError(message) elif status.IsOutOfMemory(): raise ArrowMemoryError(message) elif status.IsKeyError(): raise ArrowKeyError(message) elif status.IsNotImplemented(): raise ArrowNotImplementedError(message) elif status.IsTypeError(): raise ArrowTypeError(message) elif status.IsCapacityError(): raise ArrowCapacityError(message) elif status.IsIndexError(): raise ArrowIndexError(message) elif status.IsSerializationError(): raise ArrowSerializationError(message) else: message = frombytes(status.ToString(), safe=True) raise ArrowException(message) # This is an API function for C++ PyArrow cdef api int pyarrow_internal_check_status(const CStatus& status) \ nogil except -1: return check_status(status)