
    Ѯh2                       d Z ddlmZ ddlmZmZ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mZmZmZmZmZmZmZ ddlmZ dd	lmZ erdd
lmZ ddl m!Z! ddl"m#Z#  G d dejH                  e      Z% G d de      Z&ddZ'y)zEHelpers for applying Google Cloud Firestore changes in a transaction.    )annotations)TYPE_CHECKINGAnyCallable	GeneratorOptional)
exceptionsgapic_v1)retry)_helpersbatch)_CANT_BEGIN_CANT_COMMIT_CANT_ROLLBACK_EXCEED_ATTEMPTS_TEMPLATE_WRITE_READ_ONLYMAX_ATTEMPTSBaseTransaction_BaseTransactional)DocumentReference)Query)DocumentSnapshot)ExplainOptions)StreamGeneratorc                       e Zd ZdZedfd fdZd fdZdddZddZddZ	e
j                  j                  df	 	 	 	 	 	 	 dd	Ze
j                  j                  dfdd
	 	 	 	 	 	 	 	 	 ddZ xZS )TransactionaD  Accumulate read-and-write operations to be sent in a transaction.

    Args:
        client (:class:`~google.cloud.firestore_v1.client.Client`):
            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`.
    Fc                Z    t         t        |   |       t        j                  | ||       y N)superr   __init__r   )selfclientmax_attempts	read_only	__class__s       w/home/www/academy-backend.kofcorporation.com/venv/lib/python3.12/site-packages/google/cloud/firestore_v1/transaction.pyr    zTransaction.__init__:   s$    k4)&1  |Y?    c                b    | j                   rt        t              t        t        |   |       y)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!   	write_pbsr%   s     r&   r+   zTransaction._add_write_pbs>   s'     ??-..k4/	:r'   Nc                T   | j                   r*t        j                  | j                        }t	        |      | j
                  j                  j                  | j
                  j                  | j                  |      d| j
                  j                        }|j                  | _        y)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_idr*   _client_firestore_apibegin_transaction_database_string_options_protobuf_rpc_metadatatransaction)r!   retry_idmsgtransaction_responses       r&   _beginzTransaction._beginM   s     $$TXX.CS/!#||::LL LL9911(; \\//  M  
 (33r'   c                >   | j                   st        t              	 | j                  j                  j                  | j                  j                  | j                  d| j                  j                         | j                          y# | j                          w xY w)zRoll back the transaction.

        Raises:
            ValueError: If no transaction is in progress.
            google.api_core.exceptions.GoogleAPICallError: If the rollback fails.
        )r.   r<   r0   N)
r3   r*   r   r6   r7   rollbackr9   r5   r;   	_clean_up)r!   s    r&   	_rollbackzTransaction._rollbackd   sy     ^,,	LL''00 $ = =#'88 33 1  NNDNNs   AB
 
Bc                   | j                   st        t              | j                  j                  j                  | j                  j                  | j                  | j                  d| j                  j                        }| j                          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.
        )r.   writesr<   r0   )r3   r*   r   r6   r7   commitr9   
_write_pbsr5   r;   rC   listwrite_resultscommit_time)r!   commit_responses     r&   _commitzTransaction._commit{   s     \**,,55<< LL99//#xx
 \\// = 
 	!/"?"?@*66!!!r'   c                l    t        j                  ||      } | j                  j                  |fd| i|S )ao  Retrieves multiple documents from Firestore.

        Args:
            references (List[.DocumentReference, ...]): 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.

        Yields:
            .DocumentSnapshot: The next document snapshot that fulfills the
            query, or :data:`None` if the document does not exist.
        r<   )r   make_retry_timeout_kwargsr6   get_all)r!   
referencesr   timeoutkwargss        r&   rP   zTransaction.get_all   s7    ( 33E7C#t||##JKDKFKKr'   )explain_optionsc                  t        j                  ||      }t        |t              r-|t	        d       | j
                  j                  |gfd| i|S t        |t              r|||d<    |j                  dd| i|S t	        d      )a  Retrieve a document or a query result from the database.

        Args:
            ref_or_query (DocumentReference | Query):
                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.

        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.
        z^When type of `ref_or_query` is `AsyncDocumentReference`, `explain_options` cannot be provided.r<   rT   zIValue for argument "ref_or_query" must be a DocumentReference or a Query. )	r   rO   
isinstancer   r*   r6   rP   r   stream)r!   ref_or_queryr   rR   rT   rS   s         r&   getzTransaction.get   s    @ 33E7Cl$56* <  (4<<''SDSFSSe,*,;()&<&&B4B6BB[ r'   returnNone)r,   rI   r\   r]   r   )r=   zbytes | Noner\   r]   )r\   rI   )rQ   rI   r   retries.Retry | object | NonerR   zfloat | Noner\   z&Generator[DocumentSnapshot, Any, None])
rY   zDocumentReference | Queryr   r^   rR   zOptional[float]rT   zOptional[ExplainOptions]r\   zJStreamGenerator[DocumentSnapshot] | Generator[DocumentSnapshot, Any, None])__name__
__module____qualname____doc__r   r    r+   r@   rD   rM   r
   methodDEFAULTrP   rZ   __classcell__r%   s   @r&   r   r   ,   s     -9E @;4.."@ 08/F/F $	LL -L 	L
 
0L4 08/F/F#'	/ 59/// -/ !	/ 2/ 
T/r'   r   c                  4     e Zd ZdZd fdZddZddZ xZS )_TransactionalaY  Provide a callable object to use as a transactional decorater.

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

    Args:
        to_wrap (Callable[[:class:`~google.cloud.firestore_v1.transaction.Transaction`, ...], Any]):
            A callable that should be run (and retried) in a transaction.
    c                ,    t         t        |   |       y r   )r   rh   r    )r!   to_wrapr%   s     r&   r    z_Transactional.__init__   s    nd,W5r'   c                    |j                          |j                  | j                         |j                  | _        | j                  | j                  | _         | j
                  |g|i |S )am  Begin transaction and call the wrapped callable.

        Args:
            transaction
                (:class:`~google.cloud.firestore_v1.transaction.Transaction`):
                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:
            Any: result of the wrapped callable.

        Raises:
            Exception: Any failure caused by ``to_wrap``.
        )r=   )rC   r@   r=   r5   
current_idrj   )r!   r<   argsrS   s       r&   _pre_commitz_Transactional._pre_commit   sb    & 	DMM2 &//==  OODMt||K9$9&99r'   c                   | j                          |j                  st        j                  nd}d}	 t	        |j
                        D ],  } | j                  |g|i |}	 |j                          |c S  t        j                  |j
                        }	t        |	      |# |$ r}|}Y d}~fd}~ww xY w# t        $ r |j                           w xY w)a  Execute the wrapped callable within a transaction.

        Args:
            transaction
                (:class:`~google.cloud.firestore_v1.transaction.Transaction`):
                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:
            Any: The result of the wrapped callable.

        Raises:
            ValueError: If the transaction does not succeed in
                ``max_attempts``.
        rV   N)_resetr)   r	   Abortedrange_max_attemptsrn   rM   r   r4   r*   BaseExceptionrD   )
r!   r<   rm   rS   retryable_exceptionslast_excattemptresultexcr>   s
             r&   __call__z_Transactional.__call__  s    & 	(3(>(>ZB 	 	 !:!:; #)))+GGG#'')!M	# ,22;3L3LMCS/x/ , #"H#  	 !!#		s;   .B5 !B!2B5 5,B5 !B2&B-(B5 -B22B5 5Cr[   )r<   r   r\   r   )r<   r   )r_   r`   ra   rb   r    rn   rz   re   rf   s   @r&   rh   rh      s    6:8/r'   rh   c                    t        |       S )a  Decorate a callable so that it runs in a transaction.

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

    Returns:
        Callable[[:class:`~google.cloud.firestore_v1.transaction.Transaction`, ...], Any]:
        the wrapped callable.
    )rh   )rj   s    r&   transactionalr|   =  s     '""r'   N)rj   r   r\   rh   )(rb   
__future__r   typingr   r   r   r   r   google.api_corer	   r
   r   retriesgoogle.cloud.firestore_v1r   r   *google.cloud.firestore_v1.base_transactionr   r   r   r   r   r   r   r   "google.cloud.firestore_v1.documentr   google.cloud.firestore_v1.queryr   'google.cloud.firestore_v1.base_documentr   'google.cloud.firestore_v1.query_profiler   *google.cloud.firestore_v1.stream_generatorr   
WriteBatchr   rh   r|   rV   r'   r&   <module>r      so    L " D D 0 , 5	 	 	 A 1 HFJr%""O rjY' Yx#r'   