|
# distutils: language = c++ |
|
|
|
from libcpp.string cimport string |
|
from libcpp.vector cimport vector |
|
from s3client cimport S3Client, get_error_list |
|
from s3client cimport init_api as _init_api |
|
from s3client cimport shutdown_api as _shutdown_api |
|
|
|
|
|
ERROR_LIST = get_error_list() |
|
ERROR_MAP = {k:v.decode('utf-8') for k,v in ERROR_LIST} |
|
|
|
def init_api(log_level): |
|
log_level = log_level.lower() |
|
_init_api(log_level.encode('utf-8')) |
|
|
|
def shutdown_api(): |
|
_shutdown_api() |
|
|
|
class S3Error(Exception): |
|
def __init__(self, error_name, error_message): |
|
self.error_name = error_name |
|
self.error_message = error_message |
|
|
|
cdef class PyS3Client: |
|
cdef S3Client *client |
|
|
|
def __cinit__(self, string ak, string sk, string endpoint, bint verify_ssl, bint enable_https, bint use_dual_stack, int threads_num): |
|
self.client = new S3Client(ak, sk, endpoint, verify_ssl, enable_https, use_dual_stack, threads_num) |
|
|
|
def __dealloc__(self): |
|
del self.client |
|
|
|
def get_object(self, string bucket, string key, string range): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.get_object(bucket, key, error_type, error_message, result, range) |
|
if ret == 0: |
|
return result |
|
else: |
|
error_name = ERROR_MAP.get(error_type, 'Undefined') |
|
raise S3Error(error_name, error_message) |
|
|
|
def multipart_download_concurrency(self, string bucket, string key, string filename): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.multipart_download_concurrency(bucket, key, filename, error_type, error_message) |
|
if ret == 0: |
|
return ret |
|
else: |
|
error_name = ERROR_MAP.get(error_type, 'Undefined') |
|
raise S3Error(error_name, error_message) |
|
|
|
def put_object(self, string bucket, string key, string data): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.put_object(bucket, key, data, error_type, error_message) |
|
if ret == 0: |
|
return data.size() |
|
else: |
|
error_name = ERROR_MAP.get(error_type, 'Undefined') |
|
raise S3Error(error_name, error_message) |
|
|
|
|
|
def multipart_upload_concurrency(self, string bucket, string key, string filename): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.multipart_upload_concurrency(bucket, key, filename, error_type, error_message) |
|
if ret == 0: |
|
return ret |
|
else: |
|
error_name = ERROR_MAP.get(error_type, 'Undefined') |
|
raise S3Error(error_name, error_message) |
|
|
|
def delete(self, string bucket, string key): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.delete_obj(bucket, key, error_type, error_message) |
|
return ret |
|
|
|
def contains(self, string bucket, string key): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.contains(bucket, key, error_type, error_message) |
|
return ret |
|
|
|
def list(self, string bucket, string key): |
|
cdef string error_message, result |
|
cdef int error_type |
|
ret = self.client.list(bucket, key, error_type, error_message) |
|
return ret |
|
|