o
    gح                     @   s  d Z ddlZddlZddlZddlmZ ddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZmZmZm Z m!Z!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z' ddl(Z(ddl)m*Z* ddl(m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1 G dd de2eZ3G dd de2eZ4G dd de2eZ5e5j6de5j7de5j8de5j9de5j:de5j;diZ<G dd de2eZ=e=j>de=j?diZ@G d d! d!e2eZAG d"d# d#e'd$d%ZBG d&d' d'e'd$d%ZCd(ZDd)ZEd*ZF			d?d+e!e2 d,e!e2 d-e!eG d.ee"eGe2f ddf fd/d0ZHddd$e=j>fd+e!e2 d1e!e2 d2eId3e=d.eGf
d4d5ZJe5j8e=j>fd1e!eee2e2f   d6e#e5e2f d3e#e=e2f d.e!e2 fd7d8ZKG d9d: d:ZLG d;d< d<ZMG d=d> d>ZNdS )@z6 Classes for interacting with Salesforce Bulk 2.0 API     N)OrderedDict)ThreadPoolExecutor)closing)Enum)partial)sleep)	AnyAnyStrDict	GeneratorListMutableMappingOptionalTupleUnion)LiteralNotRequired	TypedDict)chunked)Session   )SalesforceBulkV2ExtractErrorSalesforceBulkV2LoadErrorSalesforceOperationError)call_salesforcec                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )		Operationinsertupsertupdatedelete
hardDeletequeryqueryAllN)
__name__
__module____qualname__r   r   r   r   hard_deleter!   	query_all r(   r(   P/home/ubuntu/webapp/venv/lib/python3.10/site-packages/simple_salesforce/bulk2.pyr   (   s    r   c                   @   $   e Zd ZdZdZdZdZdZdZdS )JobStateOpenAbortedFailedUploadComplete
InProgressJobCompleteN)	r#   r$   r%   openabortedfailedupload_completein_progressjob_completer(   r(   r(   r)   r+   4       r+   c                   @   r*   )ColumnDelimiter	BACKQUOTECARETCOMMAPIPE	SEMICOLONTABN)	r#   r$   r%   r:   r;   r<   r=   r>   r?   r(   r(   r(   r)   r9   ?   r8   r9   `^,|;	c                   @   s   e Zd ZdZdZdS )
LineEndingLFCRLFN)r#   r$   r%   rG   rH   r(   r(   r(   r)   rF   T   s    rF   
z
c                   @   s   e Zd ZdZdZdZdS )ResultsTypefailedResultssuccessfulResultsunprocessedRecordsN)r#   r$   r%   r4   
successfulunprocessedr(   r(   r(   r)   rJ   a   s    rJ   c                   @   s   e Zd ZU eed< eed< dS )QueryParameters
maxRecordslocatorN)r#   r$   r%   int__annotations__strr(   r(   r(   r)   rP   i   s   
 rP   F)totalc                   @   s6   e Zd ZU eed< eed< ee ed< ee ed< dS )QueryResultrR   number_of_recordsrecordsfileN)r#   r$   r%   rU   rT   rS   r   r(   r(   r(   r)   rW   p   s
   
 rW   i  @
   iP  filenamerY   max_recordsreturnc                 c   s   | r	t | ddnt |dd}| rtj| nt|}|p|}t||}t|td }d}d}g }	| rt| dd[}
|
	 }|
D ]7}|d7 }|t
|d7 }||ksX||krs|	rf|d |d	|	 fV  |g}	d}t
|d}qA|	| qA|	r||d	|	 fV  W d
   d
S W d
   d
S 1 sw   Y  d
S |d
usJ |dd }|ddd
 D ]7}|d7 }|t
|d7 }||ks||kr|	r|d |d	|	 fV  |g}	d}t
|d}q|	| q|	r||d	|	 fV  d
S d
S )zSplit a CSV file into chunks to avoid exceeding the Salesforce
    bulk 2.0 API limits.

    Arguments:
        * filename -- csv file
        * max_records -- the number of records per chunk, None for auto size
    T)r\   skip_header)datar_   i   r   utf-8encodingr    N)
_count_csvospathgetsizesys	getsizeofminMAX_INGEST_JOB_FILE_SIZEr2   readlinelenencodejoinappend
splitlines)r\   rY   r]   total_recordscsv_data_size_max_records	max_bytesrecords_size
bytes_sizebuffbisheaderliner(   r(   r)   
_split_csv   sv   "r}   r`   r_   line_endingc                 C   s   | r"t | dd}tdd |D }W d   n1 sw   Y  n|r<tt| dd }tdd t||D }ntd	|rF|d8 }|S )
z*Count the number of records in a CSV file.ra   rb   c                 s       | ]}d V  qdS r   Nr(   .0_r(   r(   r)   	<genexpr>       z_count_csv.<locals>.<genexpr>Nr   c                 s   r   r   r(   r   r(   r(   r)   r      r   z(Either filename or data must be provided)r2   sumrepr_line_ending_charrefinditer
ValueError)r\   r`   r_   r~   rz   countpatr(   r(   r)   re      s"   re   column_delimiterc                 C   sb   | sdS t dd dd | D D }t }tj||||d}|  | D ]}|| q%| S )z*Converts list of dicts to CSV like object.Nc                 s   s    | ]
}|D ]}|V  qqd S Nr(   )r   sir(   r(   r)   r      s    z'_convert_dict_to_csv.<locals>.<genexpr>c                 S   s   g | ]}|  qS r(   )keys)r   dr(   r(   r)   
<listcomp>   s    z(_convert_dict_to_csv.<locals>.<listcomp>)
fieldnames	delimiterlineterminator)setioStringIOcsv
DictWriterwriteheaderwriterowgetvalue)r`   r   r~   r   dict_to_csv_filewriterrowr(   r(   r)   _convert_dict_to_csv   s   r   c                
   @   sR   e Zd ZdZ		ddededeeeef  dee fddZd	ed
dfddZ	dS )SFBulk2HandlerzBulk 2.0 API request handler
    Intermediate class which allows us to use commands,
     such as 'sf.bulk2.Contacts.insert(...)'
    This is really just a middle layer, whose sole purpose is
    to allow the above syntax
    N
session_id	bulk2_urlproxiessessionc                 C   sF   || _ |pt | _|| _|s|dur|| j_dd| j  dd| _dS )a  Initialize the instance with the given parameters.

        Arguments:

        * session_id -- the session ID for authenticating to Salesforce
        * bulk2_url -- 2.0 API endpoint set in Salesforce instance
        * proxies -- the optional map of scheme to proxy server
        * session -- Custom requests session, created in calling code. This
                     enables the use of requests Session features not otherwise
                     exposed by simple_salesforce.
        Napplication/jsonzBearer 1)Content-TypeAuthorizationzX-PrettyPrint)r   requestsr   r   r   r   headers)selfr   r   r   r   r(   r(   r)   __init__   s   zSFBulk2Handler.__init__namer^   SFBulk2Typec                 C   s   t || j| j| jdS )N)object_namer   r   r   )r   r   r   r   )r   r   r(   r(   r)   __getattr__   s   zSFBulk2Handler.__getattr__NN)
r#   r$   r%   __doc__rU   r   r   r   r   r   r(   r(   r(   r)   r      s$    
!r   c                   @   s  e Zd ZdZdZdZdZdZdedede	eef d	e
fd
dZ		dCdee dee de	eef fddZdee dedefddZdejejdfdedee dededee defddZ	dDdedededeej fdd Zdededefd!d"Zdedefd#d$Zdededefd%d&Zdeded'edefd(d)Zdededefd*d+Z d,e!de!fd-d.Z"d/e#fded0ed1e$de%fd2d3Z&d/e#d4fd5eded0ed1e$d6e$de%fd7d8Z'	dEded9ed:ee ddfd;d<Z(ded=edefd>d?Z)	4dFd@eded=ed6e$ddf
dAdBZ*dS )G_Bulk2ClientzBulk 2.0 API clientr   ztext/csv; charset=UTF-8iQ g       @r   r   r   r   c                 C   s   || _ || _|| _|| _dS )a  
        Arguments:

        * object_name -- the name of the type of SObject this represents,
                         e.g. `Lead` or `Contact`
        * bulk2_url -- 2.0 API endpoint set in Salesforce instance
        * headers -- bulk 2.0 API headers
        * session -- Custom requests session, created in calling code. This
                     enables the use of requests Session features not otherwise
                     exposed by simple_salesforce.
        N)r   r   r   r   r   r   r   r   r   r(   r(   r)   r   4  s   
z_Bulk2Client.__init__Nrequest_content_typeaccept_content_typer^   c                 C   s,   t | j}|p
| j|d< |p| j|d< |S )z$Get headers for bulk 2.0 API requestr   ACCEPT)copydeepcopyr   JSON_CONTENT_TYPE)r   r   r   r   r(   r(   r)   _get_headersK  s   z_Bulk2Client._get_headersjob_idis_queryc                 C   s8   |sd}|r| j d }n| j d }|r| d| }|S )z"Construct bulk 2.0 API request URLrd   r!   ingest/)r   )r   r   r   urlr(   r(   r)   _construct_request_urlV  s   
z#_Bulk2Client._construct_request_url	operationr!   r   r~   external_id_fieldc              	   C   s   |||d}|r||d< |t jt jfv }| d|}|r/| | j| j}	|s*td||d< n| | j| j}	| j|d< d|d< t	|d	| j
|	tj|d
dd}
|
jtdS )as  Create job

        Arguments:

        * operation -- Bulk operation to be performed by job
        * query -- SOQL query to be performed by job
        * column_delimiter -- The column delimiter used for CSV job data
        * line_ending -- The line ending used for CSV job data
        * external_id_field -- The external ID field in the object being updated
        )r   columnDelimiter
lineEndingexternalIdFieldNameNz Query is required for query jobsr!   objectCSVcontentTypePOSTF	allow_nanr   methodr   r   r`   object_pairs_hook)r   r!   r'   r   r   r   CSV_CONTENT_TYPEr   r   r   r   jsondumpsr   )r   r   r!   r   r~   r   payloadr   r   r   resultr(   r(   r)   
create_jobg  sH   

	z_Bulk2Client.create_job      ?waitc           
      C   s   t j  t j| jd }|rtjntj}d}d}t| t j  |k ri| ||}|d }|tj	tj
tjfv rL|tj	krJ|dpB|}	td|	 |S || jk r^|t|d  }|d7 }t| t j  |k s#td	| )
z"Wait for job completion or timeout)secondsg        r   stateerrorMessagezJob failure. Response content: g     @@r   zJob timeout. Job status: )datetimenow	timedeltaDEFAULT_WAIT_TIMEOUT_SECONDSr+   r6   r2   r   get_jobr7   r3   r4   getr   MAX_CHECK_INTERVAL_SECONDSmathexp)
r   r   r   r   expiration_time
job_statusdelay_timeout	delay_cntjob_infoerror_messager(   r(   r)   wait_for_job  s<   

z_Bulk2Client.wait_for_jobc                 C   s   |  ||tjS )zAbort query/ingest job)_set_job_stater+   r3   )r   r   r   r(   r(   r)   	abort_job  s   z_Bulk2Client.abort_jobc                 C   s   |  |dtjS )zClose ingest jobF)r   r+   r5   )r   r   r(   r(   r)   	close_job  s
   z_Bulk2Client.close_jobc                 C   s2   |  ||}|  }t|d| j|d}|jtdS )zDelete query/ingest jobDELETEr   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r(   r(   r)   
delete_job  s   z_Bulk2Client.delete_jobr   c              	   C   sF   |  ||}|  }d|i}t|d| j|tj|ddd}|jtdS )zSet job stater   PATCHFr   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r(   r(   r)   r     s    	z_Bulk2Client._set_job_statec                 C   s,   |  ||}t|d| j| jd}|jtdS )zGet job infoGETr   r   )r   r   r   r   r   r   )r   r   r   r   r   r(   r(   r)   r     s   z_Bulk2Client.get_jobbc                 C   s4   t |tr|ddS t |tr|ddS td)zB
        https://github.com/airbytehq/airbyte/issues/8300
         rd           zExpected str or bytes)
isinstancerU   replacebytes	TypeError)r   r   r(   r(   r)   filter_null_bytes  s   z_Bulk2Client.filter_null_bytesrd   rR   r]   c           	      C   s   |  |dd }d|i}|r|dkr||d< | | j| j}t|d| j||d}|jdd	}|dkr5d	}t|jd
 }||| 	|j
ddS )Get results for a query jobT/resultsrQ   nullrR   r   )r   r   r   r   paramsSforce-Locatorrd   Sforce-NumberOfRecordsra   )rR   rX   rY   )r   r   r   r   r   r   r   r   rS   r  contentdecode)	r   r   rR   r]   r   r  r   r   rX   r(   r(   r)   get_query_results)  s<   z_Bulk2Client.get_query_results   rg   
chunk_sizec              	   C   sT  t j|std| | |dd }d|i}|r#|dkr#||d< | | j| j}tt	|d| j
||ddh}	tjd	|d
ddN}
|	jdd}|dkrPd}t|	jd }|	j|dD ]
}|
| | q]t j|
jr|||
jdW  d   W  d   S td|
j d| d1 sw   Y  W d   dS 1 sw   Y  dS )r  Path does not exist: Tr  rQ   r  rR   r   )r   r   r   r   r  streamwbz.csvF)dirsuffixr   r  rd   r  r  )rR   rX   rZ   N7The IO/Error occured while verifying binary data. File  doesn't exist, url: , )rf   rg   existsr   r   r   r   r   r   r   r   tempfileNamedTemporaryFiler   r   rS   iter_contentwriter  isfiler   )r   rg   r   rR   r]   r  r   r  r   r   bosrX   chunkr(   r(   r)   download_job_dataO  sr   		 4z_Bulk2Client.download_job_datar`   content_urlc                 C   s   |st dt|d}|tkrt d| d|p"| |dd }| | j| j}t|d| j	||dd}|j
tjkrLt d	|j
 d
|j  dS )zUpload job dataz Data is required for ingest jobsra   z
Data size z7 exceeds the max file size accepted by Bulk V2 (100 MB)Fz/batchesPUTr   z&Failed to upload job data. Error Code z. Response content: N)r   rn   ro   rl   r   r   r   r   r   r   status_codehttpCREATEDr  r	  )r   r   r`   r  	data_sizer   r   r   r(   r(   r)   upload_job_data  s@   

z_Bulk2Client.upload_job_dataresults_typec                 C   s<   |  |dd | }| | j| j}t|d| j|d}|jS )zGet record resultsFr   r   r   )r   r   r   r   r   r   text)r   r   r&  r   r   r   r(   r(   r)   get_ingest_results  s&   z_Bulk2Client.get_ingest_resultsrZ   c           
   	   C   s   |  |dd | }| | j| j}tt|d| j|d.}t|d}|j|dD ]
}	|	| 
|	 q*W d   n1 s?w   Y  W d   n1 sNw   Y  tj|sdtd| d	| d
dS )z!Download record results to a fileFr   r   r   r  r  Nr  r  r  )r   r   r   r   r   r   r   r2   r  r  r  rf   rg   r  r   )
r   rZ   r   r&  r  r   r   r   r  r  r(   r(   r)   download_ingest_results  sP   	 z$_Bulk2Client.download_ingest_resultsr   )r   r   )r  )+r#   r$   r%   r   r   r   r   r   rU   r
   r   r   r   r   boolr   r9   r<   rF   rG   r   r   r   floatr   r+   r7   r   r   r   r   r   r   r	   r  DEFAULT_QUERY_PAGE_SIZErS   rW   r
  r  r%  r(  r)  r(   r(   r(   r)   r   +  s4   





>
&








*
A
)
r   c                   @   s"  e Zd ZdZdededeeef defddZej	e
jdd	fd
edeeeeef f dede
dee dedeeef fddZdddej	e
jddd	fd
edee dee dee dede
dee dededeeeef  fddZdddej	e
jdd	fdee deeeeef   dee dede
dee dedeeeef  fddZddddej	e
jd	fdee deeeeef   dee dedede
dedeeeef  fddZddddej	e
jd	fdee deeeeef   dedee dede
dedeeeef  fdd Zdddej	e
jd	fdee deeeeef   dee dede
dedeeeef  fd!d"Zdddej	e
jd	fdee deeeeef   dee dede
dedeeeef  fd#d$Zeej	e
jd	fd%ed&edede
dedeeeef ddf fd'd(Zeej	e
jd	fd%ed&edede
dedeeddf fd)d*Zeej	e
jd	fd%ed+ed&edede
dedee fd,d-Z	d;d.ed/ed0ee defd1d2Z	d;d.ed0ee defd3d4Z 	d;d.ed0ee defd5d6Z!	d;d.ed0ee defd7d8Z"	d;d.ed0ee deeee# f fd9d:Z$dS )<r   z#Interface to Bulk 2.0 API functionsr   r   r   r   c                 C   s,   || _ || _|| _|| _t||||| _dS )a   Initialize the instance with the given parameters.

        Arguments:

        * object_name -- the name of the type of SObject this represents,
                         e.g. `Lead` or `Contact`
        * bulk2_url -- API endpoint set in Salesforce instance
        * headers -- bulk API headers
        * session -- Custom requests session, created in calling code. This
                     enables the use of requests Session features not otherwise
                     exposed by simple_salesforce.
        N)r   r   r   r   r   _clientr   r(   r(   r)   r     s   
zSFBulk2Type.__init__N   r   r`   r   r~   r   r   r^   c                 C   s   t |tr
|\}}n	t||dd}|}| jj||||d}	|	d }
z<|	d tjkrW| j|
| | j|
 | j	|
d| | j
|
d}	t|	d t|	d t||
d	W S td
|	  ty   | j
|
d}	|	d tjtjtjfv r~| j|
d  w )zUpload data to SalesforceT)r`   r~   r_   )r   r~   r   idr   FnumberRecordsFailednumberRecordsProcessed)r0  r1  numberRecordsTotalr   z-Failed to upload job data. Response content: )r   tuplere   r-  r   r+   r2   r%  r   r   r   rS   r   	Exceptionr5   r6   r   )r   r   r`   r   r~   r   r   rV   unpacked_dataresr   r(   r(   r)   _upload_data  sl   

zSFBulk2Type._upload_datar   csv_filerY   
batch_sizeconcurrencyc
              
   C   s  |r|rt d|s|rtj|st |d |tjtjfv rX|dus&J t|ddd#}
|
 	 
t| }t|dkrIt d| d	| W d   n1 sSw   Y  g }t|t}|rgt||d
nt||d}|dkr|D ]}| ||||||	}|| qs|S t||dD ]6}t|t|}t|d}t| j|||||	d}|||}W d   n1 sw   Y  |t| q|S )zUpload csv file to Salesforcez$Cannot include both file and recordsz not found.Nrra   rb   r   zInvalidBatch: The 'z' batch must contain only ids, )r\   r]   )rY   r]   )n)max_workers)r   r~   r   r   )r   rf   rg   r  r   r   r&   r2   rm   rstripsplit_delimiter_charrn   rk   MAX_INGEST_JOB_PARALLELISMr}   r7  rq   r   r   r   mapextendlist)r   r   r8  rY   r9  r   r~   r   r:  r   rz   r{   resultsworkers
split_datar`   r   chunkspoolmulti_thread_worker_resultsr(   r(   r)   _upload_fileR  s   

zSFBulk2Type._upload_filec              
   C   s:   | j tj|t|t|tjt|t	j
d|||||dS )zsoft delete recordsr   r~   r8  rY   r9  r   r~   r   r   )rL  r   r   r   r@  r   r9   r<   r   rF   rG   )r   r8  rY   r9  r   r~   r   r   r(   r(   r)   r     (   zSFBulk2Type.deletec              
   C   s:   | j tj|t|t|tjt|t	j
d|||||dS )zinsert recordsrM  )r8  rY   r9  r   r~   r:  r   )rL  r   r   r   r@  r   r9   r<   r   rF   rG   )r   r8  rY   r9  r:  r   r~   r   r(   r(   r)   r     rO  zSFBulk2Type.insertIdc              
   C   s:   | j tj|t|t|tjt|t	j
d|||||dS )z+upsert records based on a unique identifierrM  rN  )rL  r   r   r   r@  r   r9   r<   r   rF   rG   )r   r8  rY   r   r9  r   r~   r   r(   r(   r)   r     rO  zSFBulk2Type.upsertc              
   C   8   | j tj|t|t|tjt|t	j
d||||dS )zupdate recordsrM  r8  rY   r9  r   r~   r   )rL  r   r   r   r@  r   r9   r<   r   rF   rG   r   r8  rY   r9  r   r~   r   r(   r(   r)   r     &   
zSFBulk2Type.updatec              
   C   rQ  )zhard delete recordsrM  rR  )rL  r   r&   r   r@  r   r9   r<   r   rF   rG   rS  r(   r(   r)   r&   #  rT  zSFBulk2Type.hard_deleter!   r]   c           
      c   p    | j tj|||}|d }| j |d| d}|r6|dkr!d}| j |||}	|	d }|	d V  |sdS dS )aM  bulk 2.0 query

        Arguments:
        * query -- SOQL query
        * max_records -- max records to retrieve per batch, default 50000

        Returns:
        * locator  -- the locator for the next set of results
        * number_of_records -- the number of records in this set
        * records -- records in this set
        r/  TINITrd   rR   rY   N)r-  r   r   r!   r   r
  
r   r!   r]   r   r~   r   r6  r   rR   r   r(   r(   r)   r!   A  0   
zSFBulk2Type.queryc           
      c   rU  )aQ  bulk 2.0 query_all

        Arguments:
        * query -- SOQL query
        * max_records -- max records to retrieve per batch, default 50000

        Returns:
        * locator  -- the locator for the next set of results
        * number_of_records -- the number of records in this set
        * records -- records in this set
        r/  TrV  rd   rR   rY   N)r-  r   r   r'   r   r
  rW  r(   r(   r)   r'   l  rX  zSFBulk2Type.query_allrg   c                 C   s   t j|std| | jtj|||}|d }| j|d| g }	d}
|
rC|
dkr/d}
| j	|||
|}|d }
|	
| |
s)|	S )aq  bulk 2.0 query stream to file, avoiding high memory usage

        Arguments:
        * query -- SOQL query
        * max_records -- max records to retrieve per batch, default 50000

        Returns:
        * locator  -- the locator for the next set of results
        * number_of_records -- the number of records in this set
        * file -- downloaded file
        r  r/  TrV  rd   rR   )rf   rg   r  r   r-  r   r   r!   r   r  rq   )r   r!   rg   r]   r   r~   r   r6  r   rE  rR   r   r(   r(   r)   download  s8   
zSFBulk2Type.downloadr   r&  rZ   c                 C   s&   |s	| j ||S | j ||| dS )z%Retrieve the results of an ingest jobrd   )r-  r(  r)  )r   r   r&  rZ   r(   r(   r)   _retrieve_ingest_records  s   z$SFBulk2Type._retrieve_ingest_recordsc                 C      |  |tj|S )zGet failed record results

        Results Property:
            sf__Id:	[string] ID of the record
            sf__Error:	[Error]	Error code and message
            Fields from the original CSV request data:	various
        )rZ  rJ   r4   r   r   rZ   r(   r(   r)   get_failed_records  s   zSFBulk2Type.get_failed_recordsc                 C   r[  )zGet unprocessed record results

        Results Property:
            Fields from the original CSV request data:	[various]
        )rZ  rJ   rO   r\  r(   r(   r)   get_unprocessed_records  s
   
z#SFBulk2Type.get_unprocessed_recordsc                 C   r[  )zGet successful record results.

        Results Property:
            sf__Id:	[string] ID of the record
            sf__Created: [boolean] Indicates if the record was created
            Fields from the original CSV request data:	[various]
        )rZ  rJ   rN   r\  r(   r(   r)   get_successful_records  s
   z"SFBulk2Type.get_successful_recordsc                 C   sr   t j| j||d ddd}t j| j||d ddd}t j| j||d ddd}t|t|t|dS )aG  Get all ingest record results for job

        Results Property:
            sf__Id:	[string] ID of the record
            sf__Created: [boolean] Indicates if the record was created
            Fields from the original CSV request data:	[various]
            Fields: [various] Fields from the original CSV request data
        )r   rZ   rB   rI   )r   r   )successfulRecordsfailedRecordsrM   )r   
DictReaderr_  rr   r]  r^  rD  )r   r   rZ   successful_recordsfailed_recordsunprocessed_recordsr(   r(   r)   get_all_ingest_records  s8   z"SFBulk2Type.get_all_ingest_recordsr   )%r#   r$   r%   r   rU   r
   r   r   r9   r<   rF   rG   r   r   r   rS   r   r7  r   rL  r   r   r   r   r&   r,  r   r!   r'   rW   rY  rZ  r]  r^  r_  r   rf  r(   r(   r(   r)   r     s   

!

G	

U	
"	
"	
"
 
!
.
/
6



r   )NNN)Or   r   r   r   http.clientclientr"  r   r   r   rf   r   ri   r  collectionsr   concurrent.futuresr   
contextlibr   enumr   	functoolsr   timer   typingr   r	   r
   r   r   r   r   r   r   typing_extensionsr   r   r   r   more_itertoolsr   r   
exceptionsr   r   r   utilr   rU   r   r+   r9   r:   r;   r<   r=   r>   r?   r@  rF   rG   rH   r   rJ   rP   rW   rl   rA  r,  rS   r}   r*  re   r   r   r   r   r(   r(   r(   r)   <module>   s    ,

F



4   F