o
    }l~il:                     @  s0  d Z ddlmZ ddl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mZmZ ddlmZ ddlmZ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# errddl$Z$ddl%m&Z& ddl'm(Z( ddl)m*Z* edZ+edZ,G dd dej-e"Z.G dd de#e	e+e,f Z/dddZ0dS )zEHelpers for applying Google Cloud Firestore changes in a transaction.    )annotations)TYPE_CHECKINGAnyAsyncGenerator	AwaitableCallableGenericOptional)Concatenate	ParamSpecTypeVar)
exceptionsgapic_v1)retry_async)_helpersasync_batch)AsyncDocumentReference)
AsyncQuery)_CANT_BEGIN_CANT_COMMIT_CANT_ROLLBACK_EXCEED_ATTEMPTS_TEMPLATE_WRITE_READ_ONLYMAX_ATTEMPTSBaseTransaction_BaseTransactionalN)AsyncStreamGenerator)DocumentSnapshot)ExplainOptionsTPc                      s   e Zd ZdZedfd) fddZd* fd	d
Zd+d,ddZd)ddZd-ddZ	e
jjdfddd.ddZe
jjdfdddd/d'd(Z  ZS )0AsyncTransactionaO  Accumulate read-and-write operations to be sent in a transaction.

    Args:
        client (:class:`~google.cloud.firestore_v1.async_client.AsyncClient`):
            The client that created this transaction.
        max_attempts (Optional[int]): The maximum number of attempts for
            the transaction (i.e. allowing retries). Defaults to
            :attr:`~google.cloud.firestore_v1.transaction.MAX_ATTEMPTS`.
        read_only (Optional[bool]): Flag indicating if the transaction
            should be read-only or should allow writes. Defaults to
            :data:`False`.
    FreturnNonec                   s"   t t| | t| || d S N)superr!   __init__r   )selfclientmax_attempts	read_only	__class__ r/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/google/cloud/firestore_v1/async_transaction.pyr&   I   s   zAsyncTransaction.__init__	write_pbslistc                   s"   | j rtttt| | dS )a
  Add `Write`` protobufs to this transaction.

        Args:
            write_pbs (List[google.cloud.firestore_v1.                write.Write]): A list of write protobufs to be added.

        Raises:
            ValueError: If this transaction is read-only.
        N)
_read_only
ValueErrorr   r%   r!   _add_write_pbs)r'   r/   r+   r-   r.   r3   M   s   
zAsyncTransaction._add_write_pbsNretry_idbytes | Nonec                   sT   | j rt| j}t|| jjj| jj| 	|d| jj
dI dH }|j| _dS )zBegin the transaction.

        Args:
            retry_id (Optional[bytes]): Transaction ID of a transaction to be
                retried.

        Raises:
            ValueError: If the current transaction has already begun.
        )databaseoptionsrequestmetadataN)in_progressr   format_idr2   _client_firestore_apibegin_transaction_database_string_options_protobuf_rpc_metadatatransaction)r'   r4   msgtransaction_responser-   r-   r.   _begin\   s   
zAsyncTransaction._beginc                   sR   | j sttz| jjj| jj| jd| jjdI dH  W | 	  dS | 	  w )zRoll back the transaction.

        Raises:
            ValueError: If no transaction is in progress.
            google.api_core.exceptions.GoogleAPICallError: If the rollback fails.
        )r6   rD   r8   N)
r;   r2   r   r>   r?   rollbackrA   r=   rC   	_clean_up)r'   r-   r-   r.   	_rollbacks   s   	zAsyncTransaction._rollbackc                   s^   | j stt| jjj| jj| j| jd| jj	dI dH }| 
  t|j| _|j| _| jS )a  Transactionally commit the changes accumulated.

        Returns:
            List[:class:`google.cloud.firestore_v1.write.WriteResult`, ...]:
            The write results corresponding to the changes committed, returned
            in the same order as the changes were applied to this transaction.
            A write result contains an ``update_time`` field.

        Raises:
            ValueError: If no transaction is in progress.
        )r6   writesrD   r8   N)r;   r2   r   r>   r?   commitrA   
_write_pbsr=   rC   rI   r0   write_resultscommit_time)r'   commit_responser-   r-   r.   _commit   s   	zAsyncTransaction._commit)	read_time
referencesretry"retries.AsyncRetry | object | Nonetimeoutfloat | NonerR   datetime.datetime | None%AsyncGenerator[DocumentSnapshot, Any]c                  s<   t ||}|dur||d< | jj|fd| i|I dH S )a  Retrieves multiple documents from Firestore.

        Args:
            references (List[.AsyncDocumentReference, ...]): Iterable of document
                references to be retrieved.
            retry (google.api_core.retry.Retry): Designation of what errors, if any,
                should be retried.  Defaults to a system-specified policy.
            timeout (float): The timeout for this request.  Defaults to a
                system-specified value.
            read_time (Optional[datetime.datetime]): If set, reads documents as they were at the given
                time. This must be a timestamp within the past one hour, or if Point-in-Time Recovery
                is enabled, can additionally be a whole minute timestamp within the past 7 days. If no
                timezone is specified in the :class:`datetime.datetime` object, it is assumed to be UTC.

        Yields:
            .DocumentSnapshot: The next document snapshot that fulfills the
            query, or :data:`None` if the document does not exist.
        NrR   rD   )r   make_retry_timeout_kwargsr>   get_all)r'   rS   rT   rV   rR   kwargsr-   r-   r.   r[      s
   zAsyncTransaction.get_all)explain_optionsrR   ref_or_query#AsyncDocumentReference | AsyncQueryOptional[float]r]   Optional[ExplainOptions]Optional[datetime.datetime]NAsyncGenerator[DocumentSnapshot, Any] | AsyncStreamGenerator[DocumentSnapshot]c                  s   t ||}|dur||d< t|tr,|durtd| jj|gfd| i|I dH S t|trC|dur9||d< |jdd| i|S td)aP  
        Retrieve a document or a query result from the database.

        Args:
            ref_or_query (AsyncDocumentReference | AsyncQuery):
                The document references or query object to return.
            retry (google.api_core.retry.Retry): Designation of what errors, if any,
                should be retried.  Defaults to a system-specified policy.
            timeout (float): The timeout for this request.  Defaults to a
                system-specified value.
            explain_options
                (Optional[:class:`~google.cloud.firestore_v1.query_profile.ExplainOptions`]):
                Options to enable query profiling for this query. When set,
                explain_metrics will be available on the returned generator.
                Can only be used when running a query, not a document reference.
            read_time (Optional[datetime.datetime]): If set, reads documents as they were at the given
                time. This must be a timestamp within the past one hour, or if Point-in-Time Recovery
                is enabled, can additionally be a whole minute timestamp within the past 7 days. If no
                timezone is specified in the :class:`datetime.datetime` object, it is assumed to be UTC.

        Yields:
            DocumentSnapshot: The next document snapshot that fulfills the query,
            or :data:`None` if the document does not exist.

        Raises:
            ValueError: if `ref_or_query` is not one of the supported types, or
            explain_options is provided when `ref_or_query` is a document
            reference.
        NrR   z^When type of `ref_or_query` is `AsyncDocumentReference`, `explain_options` cannot be provided.rD   r]   zSValue for argument "ref_or_query" must be a AsyncDocumentReference or a AsyncQuery.r-   )	r   rZ   
isinstancer   r2   r>   r[   r   stream)r'   r^   rT   rV   r]   rR   r\   r-   r-   r.   get   s.   &

zAsyncTransaction.get)r"   r#   )r/   r0   r"   r#   r$   )r4   r5   r"   r#   )r"   r0   )
rS   r0   rT   rU   rV   rW   rR   rX   r"   rY   )r^   r_   rT   rU   rV   r`   r]   ra   rR   rb   r"   rc   )__name__
__module____qualname____doc__r   r&   r3   rG   rJ   rQ   r   methodDEFAULTr[   rf   __classcell__r-   r-   r+   r.   r!   ;   s$    

 "r!   c                      s6   e Zd ZdZd fddZdddZdddZ  ZS )_AsyncTransactionalal  Provide a callable object to use as a transactional decorater.

    This is surfaced via
    :func:`~google.cloud.firestore_v1.async_transaction.transactional`.

    Args:
        to_wrap (Coroutine[[:class:`~google.cloud.firestore_v1.async_transaction.AsyncTransaction`, ...], Any]):
            A coroutine that should be run (and retried) in a transaction.
    to_wrap8Callable[Concatenate[AsyncTransaction, P], Awaitable[T]]r"   r#   c                   s   t t| | d S r$   )r%   rn   r&   )r'   ro   r+   r-   r.   r&     s   z_AsyncTransactional.__init__rD   r!   argsP.argsr\   P.kwargsr   c                   sV   |   |j| jdI dH  |j| _| jdu r| j| _| j|g|R i |I dH S )a{  Begin transaction and call the wrapped coroutine.

        Args:
            transaction
                (:class:`~google.cloud.firestore_v1.async_transaction.AsyncTransaction`):
                A transaction to execute the coroutine within.
            args (Tuple[Any, ...]): The extra positional arguments to pass
                along to the wrapped coroutine.
            kwargs (Dict[str, Any]): The extra keyword arguments to pass
                along to the wrapped coroutine.

        Returns:
            T: result of the wrapped coroutine.

        Raises:
            Exception: Any failure caused by ``to_wrap``.
        )r4   N)rI   rG   r4   r=   
current_idro   )r'   rD   rq   r\   r-   r-   r.   _pre_commit  s   
z_AsyncTransactional._pre_commitc           
        s   |    |jstjnd}d}zCt|jD ]2}| j|g|R i |I dH }z| I dH  |W   W S  |yG } z|}W Y d}~qd}~ww t	|j}	t
|	| tya   | I dH   w )a  Execute the wrapped callable within a transaction.

        Args:
            transaction
                (:class:`~google.cloud.firestore_v1.async_transaction.AsyncTransaction`):
                A transaction to execute the callable within.
            args (Tuple[Any, ...]): The extra positional arguments to pass
                along to the wrapped callable.
            kwargs (Dict[str, Any]): The extra keyword arguments to pass
                along to the wrapped callable.

        Returns:
            T: The result of the wrapped callable.

        Raises:
            ValueError: If the transaction does not succeed in
                ``max_attempts``.
        r-   N)_resetr1   r   Abortedrange_max_attemptsru   rQ   r   r<   r2   BaseExceptionrJ   )
r'   rD   rq   r\   retryable_exceptionslast_excattemptresultexcrE   r-   r-   r.   __call__0  s*   

z_AsyncTransactional.__call__)ro   rp   r"   r#   )rD   r!   rq   rr   r\   rs   r"   r   )rg   rh   ri   rj   r&   ru   r   rm   r-   r-   r+   r.   rn     s
    

rn   ro   rp   r"   c                 C  s   t | S )a  Decorate a callable so that it runs in a transaction.

    Args:
        to_wrap
            (Callable[[:class:`~google.cloud.firestore_v1.async_transaction.AsyncTransaction`, ...], Awaitable[Any]]):
            A callable that should be run (and retried) in a transaction.

    Returns:
        Callable[[:class:`~google.cloud.firestore_v1.transaction.Transaction`, ...], Awaitable[Any]]:
        the wrapped callable.
    )rn   )ro   r-   r-   r.   async_transactionale  s   r   )ro   rp   r"   rp   )1rj   
__future__r   typingr   r   r   r   r   r   r	   typing_extensionsr
   r   r   google.api_corer   r   r   retriesgoogle.cloud.firestore_v1r   r   (google.cloud.firestore_v1.async_documentr   %google.cloud.firestore_v1.async_queryr   *google.cloud.firestore_v1.base_transactionr   r   r   r   r   r   r   r   datetime0google.cloud.firestore_v1.async_stream_generatorr   'google.cloud.firestore_v1.base_documentr   'google.cloud.firestore_v1.query_profiler   r   r    AsyncWriteBatchr!   rn   r   r-   r-   r-   r.   <module>   s*   $	( Hc