U
    4Je                     @  sp  d Z ddlmZ ddlZddlZddl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 dd	lmZmZ dd
lmZmZ ddddddZdddddZdddddZdddddZdddddZdddddZ ddddd Z!dd!dd"d#Z"dd$dd%d&Z#dd'dd(d)Z$dd*dd+d,Z%G d-d. d.Z&G d/d0 d0Z'G d1d2 d2Z(G d3d4 d4Z)G d5d6 d6e)Z*G d7d8 d8e*Z+G d9d: d:e*Z,G d;d< d<e*Z-G d=d> d>e*Z.G d?d@ d@e*Z/G dAdB dBe*Z0G dCd dZ1G dDdE dEZ2G dFdG dGZ3G dHdI dIe3Z4G dJdK dKe3Z5G dLdM dMe5Z6G dNdO dOe6Z7G dPdQ dQe5Z8dS )Rz%Implementation of the Result classes.    )annotationsN)datetime	timedelta)AnyCallableDictListOptionalSequenceTupleUnion   )MYSQL_CHARACTER_SETS)DbDoc)decode_from_bytes
deprecated)ConnectionType
FieldTypesColumnbytesr   )columnpayloadreturnc              
   C  s   t |dkrd S |  tjkr.t|d d S ztj|   |W S  tk
r } z,t	j
|  t	j
|d  W Y d S d }~X Y nX d S )Nr   hex)lenget_type
ColumnTypeSTRINGr   ColumnProtoTypeconverter_mapget_proto_typeKeyErrorsysstderrwriteencode)r   r   err r(   1/tmp/pip-unpacked-wheel-7_167w8m/mysqlx/result.pyfrom_protobuf/   s    r*   )r   r   c                 C  s   | d d S )Nr   r(   r   r(   r(   r)   bytes_from_protobuf>   s    r,   floatc                 C  s    t | dksttd| d S )N   z<fr   r   AssertionErrorstructunpackr+   r(   r(   r)   float_from_protobufC   s    r3   c                 C  s    t | dksttd| d S )N   z<dr   r/   r+   r(   r(   r)   double_from_protobufH   s    r5   zTuple[int, bytes]c                 C  s   t | dkrtdd}d}d}| D ]j}t|tr6|nt|}|d@ dk}|d@ }||K }||O }|r~|| |d d  f  S |d7 }|d7 }q$tdd S )Nr   zPayload is empty      r      zPayload too short)r   
ValueError
isinstanceintordEOFError)r   curishiftitemcharZeosZcur_bitsr(   r(   r)   varint_from_protobuf_streamM   s     
rC   r;   c                 C  s$   t | \}} t| dkr td|S )Nr   Payload too longrC   r   r9   r   r?   r(   r(   r)   varint_from_protobufc   s    rG   c                 C  sL   t | \}} t| dkr td|d@ r@| }|d? }|dO }n|d? }|S )Nr   rD   r   l            rE   rF   r(   r(   r)   varsint_from_protobufk   s    
rH   zList[bytes]c                 C  s   g }zxt | \}} t| |k rLt| dkrD|dkrDt|dkrDg W S td|| d |  | |d  } t| dkrzW qW q tk
r   Y qY qX q|S )Nr   r   zInvalid Set encoding)rC   r   r9   append)r   Zset_pbZ	field_lenr(   r(   r)   set_from_protobuf{   s     rJ   zdecimal.Decimalc                 C  s$  g }d }t | d tr| d n
t| d }| dd  } | D ]}t |trL|nt|}|d@ d? }|d@ }|dk r|| |dk r|| n0|dkrd} qn|dkrd} qntd	q:|dkrd}|dkst qq:|dkrd}|dkst qq:td
| q:t||| fS )Nr   r      r.      
         zInvalid BCDzInvalid BCD: )r:   r;   r<   rI   r9   r0   decimalDecimal)r   digitssignZscalerA   rB   Zhigh_bcdZlow_bcdr(   r(   r)   decimal_from_protobuf   s:    "


rT   r   c                 C  s   d}d}d}d}t | \}} t | \}} t | \}} z4t | \}} t | \}} t | \}} t | \}} W n tk
r|   Y nX t|||||||S )Nr   )rC   r9   r   )r   hourminutessecondsusecondsyearmonthdayr(   r(   r)   datetime_from_protobuf   s    r\   r   c                 C  s   d}d}d}d}| d dk}| dd  } z4t | \}} t | \}} t | \}} t | \}} W n tk
rp   Y nX |r|r|d9 }n(|r|d9 }n|r|d9 }n|r|d9 }t||||dS )Nr   r   r   )hoursrV   rW   microseconds)rC   r9   r   )r   rU   rV   rW   rX   negater(   r(   r)   time_from_protobuf   s8    


   r`   c                   @  s   e Zd ZdZdS )
Collations!   N)__name__
__module____qualname__ZUTF8_GENERAL_CIr(   r(   r(   r)   ra      s   ra   c                   @  s8  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%e&d$d%d&d'd(Z'e&d)d$d*d+d,Z(e&d-d.d/d0d1Z)e&d-d.d/d2d3Z*e&d-d.d/d4d5Z+e&d-d.d/d6d7Z,e&d-d.d/d8d9Z-e&d-d.d/d:d;Z.d<S )=r   r         r.         r8   r4   	   rM      rN   rO      rL                                                       rb   "   #   r   Optional[str])needler   c                 C  s*   t |  D ]\}}||kr|  S qd S N)varsitems)clsr   keyvaluer(   r(   r)   	to_string  s    
zColumnType.to_stringstr)r   r   c                 C  s   t | | d S r   )getattrupper)r   r   r(   r(   r)   from_string  s    zColumnType.from_stringr;   bool)col_typer   c                 C  s   || j | jfkS r   )CHARVARCHARr   r   r(   r(   r)   is_char  s    zColumnType.is_charc                 C  s   || j | jfkS r   )BINARY	VARBINARYr   r(   r(   r)   	is_binary%  s    zColumnType.is_binaryc                 C  s   || j | j| j| jfkS r   )TEXTTINYTEXT
MEDIUMTEXTLONGTEXTr   r(   r(   r)   is_text,  s    zColumnType.is_textc                 C  s   || j | j| j| j| jfkS r   )REALDOUBLEFLOATDECIMALNUMERICr   r(   r(   r)   is_decimals5  s    zColumnType.is_decimalsc                 C  s    || j | j| j| j| j| jfkS r   )BITTINYINTSMALLINT	MEDIUMINTINTBIGINTr   r(   r(   r)   
is_numeric?  s    zColumnType.is_numericc                 C  s   || j | jfkS r   )SETENUMr   r(   r(   r)   is_finite_setJ  s    zColumnType.is_finite_setN)/rc   rd   re   r   r   r   r   r   r   r   r   r   r   r   JSONr   BYTESTIMEDATEDATETIME	TIMESTAMPr   r   GEOMETRYXMLZYEARr   r   r   r   ZTINYBLOBZBLOBZ
MEDIUMBLOBZLONGBLOBr   r   r   r   classmethodr   r   r   r   r   r   r   r   r(   r(   r(   r)   r      sf   	
r   c                   @  sr   e Zd ZU dZdZdZdZdZdZdZ	dZ
d	Zd
ZdZeeeeeee	eeeeeeeeee
eeeeeiZded< dS )r   r   rf   rh   ri   r8   rM   rN   rL   rm   rn   ro   z!Dict[int, Callable[[bytes], Any]]r    N)rc   rd   re   SINTUINTr   r   r   r   r   r   r   r   r   rH   rG   r,   r\   r`   r3   r5   rJ   rT   r    __annotations__r(   r(   r(   r)   r   R  sD   
           r   c                   @  sR   e Zd ZdddddZdddd	Zeddd
dZejdddddZdS )Flagsr;   None)r   r   c                 C  sV   i | _ i | _| jj D ]2\}}|dr,qt|tr|| j |< || j|< q|| _d S )N__)	Z_allowed_flags_flag_names	__class____dict__r   
startswithr:   r;   _value)selfr   r   valr(   r(   r)   __init__o  s    


zFlags.__init__r   r   c              	   C  s   d}g }| j }tddD ]d}|dK }||@ }|rz|| j|  W q tk
rz   tj| j  tj| jj	  Y qX qd
|S )Nr   r   ?   ,)r   rangerI   r   r"   r#   r$   r%   r   r   join)r   maskZ
flag_namesr   _flagr(   r(   r)   __str__z  s    zFlags.__str__c                 C  s   | j S r   r   r   r(   r(   r)   r     s    zFlags.value)r   r   c                 C  s
   || _ d S r   r   )r   r   r(   r(   r)   r     s    N)rc   rd   re   r   r   propertyr   setterr(   r(   r(   r)   r   n  s   r   c                   @  s    e Zd ZdZdZdZdZdZdS )ColumnFlagsrm   r}   @   r6      N)rc   rd   re   ZNOT_NULLZPRIMARY_KEYZ
UNIQUE_KEYZMULTIPLE_KEYZAUTO_INCREMENTr(   r(   r(   r)   r     s
   r   c                   @  s   e Zd ZdZdS )DatetimeColumnFlagsr   N)rc   rd   re   r   r(   r(   r(   r)   r     s   r   c                   @  s   e Zd ZdZdS )UIntColumnFlagsr   N)rc   rd   re   ZZEROFILLr(   r(   r(   r)   r     s   r   c                   @  s   e Zd ZdZdS )DoubleColumnFlagsr   Nrc   rd   re   UNSIGNEDr(   r(   r(   r)   r     s   r   c                   @  s   e Zd ZdZdS )FloatColumnFlagsr   Nr   r(   r(   r(   r)   r     s   r   c                   @  s   e Zd ZdZdS )BytesColumnFlagsr   N)rc   rd   re   Z	RIGHT_PADr(   r(   r(   r)   r     s   r   c                   @  s   e Zd ZdZdZdZdS )BytesContentTyper   rf   rg   N)rc   rd   re   r   r   r   r(   r(   r(   r)   r     s   r   c                   @  s  e Zd ZdZdJdddddddddddddddd	Zd
dddZddddZddddZddddZddddZ	ddddZ
ed
dddZed
dddZed
dddZed
dddZed
dd d!Zeddd"d#Zeddd$d%Zeddd&d'Zed
dd(d)Zed
dd*d+Zd
dd,d-Zd
dd.d/Zd
dd0d1Zd
dd2d3Zd
dd4d5Zddd6d7Zddd8d9Zddd:d;Zddd<d=Zd
dd>d?Zd
dd@dAZ dBddCdDZ!dEddFdGZ"dBddHdIZ#dS )Kr   a_  Represents meta data for a table column.

    Args:
        col_type (int): The column type.
        catalog (str): The catalog.
        schema (str): The schema name.
        table (str): The table name.
        original_table (str): The original table name.
        name (str): The column name.
        original_name (str): The original table name.
        length (int): The column length,
        collation (str): The collation name.
        fractional_digits (int): The fractional digits.
        flags (int): The flags.
        content_type (int): The content type.

    .. versionchanged:: 8.0.12
    Nr;   r   Optional[int]r   )r   catalogschematableoriginal_tablenameoriginal_namelength	collationfractional_digitsflagscontent_typer   c                 C  s  t || _t || _t || _t || _t || _|| _d | _|| _|| _	|	| _
|
| _|| _|| _d| _d| _d| _d| _d | _d | _d | _| j
dkr| j
ttkrtd| j
 t| j
 }|d | _|d | _d| jkpd| jk| _|   | jtjtjtjtjtjfk| _d S )NFr   zNo mapping found for collation r   binaryZ_bin)r   _schema_name_original_name_table_original_table_proto_type	_col_type_catalog_lengthZ
_collation_fractional_digits_flags_content_type_number_signed
_is_padded
_is_binary	_is_bytes_collation_name_character_set_name
_zero_fillr   r   r9   	_map_typer   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   infor(   r(   r)   r     sH    








zColumn.__init__r   r   c                 C  s   t | j| j| jt | jdS )N)r   r   r   r   )r   r   r   r   r   r   r(   r(   r)   r     s    zColumn.__str__c                 C  sj   | j tjkrtj| _nD| j tjkr,tj| _n.| j tjkrBtj| _n| jrRtj| _ntj	| _| j
d@ | _dS )z
Map bytes.r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r)   
_map_bytes  s    



zColumn._map_bytesc                 C  sN   | j dkrtj| _n6| jtj@ dkr.tj| _n| j dkrBtj| _ntddS )zMap datetime.rM   r   rp   z#Datetime mapping scenario unhandledN)	r   r   r   r   r   r   r   r   r9   r   r(   r(   r)   _map_datetime  s    




zColumn._map_datetimec                 C  sb   | j dkrtj| _nD| j dkr(tj| _n0| j dkr<tj| _n| j dkrPtj| _ntj| _d| _dS )zMap int type.r.   ri   rj   rk   TN)	r   r   r   r   r   r   r   r   r   r   r(   r(   r)   _map_int_type'  s    







zColumn._map_int_typec                 C  sh   | j dkrtj| _nD| j dkr(tj| _n0| j dkr<tj| _n| j dkrPtj| _ntj| _| jd@ | _	dS )zMap uint type.rg   rh   r4   rM   r   N)
r   r   r   r   r   r   r   r   r   r   r   r(   r(   r)   _map_uint_type5  s    







zColumn._map_uint_typec                 C  sF  | j tjkr|   n*| j tjkr0|   n| j tjkrXtj| _| j	t
j@ dk| _n| j tjkrtj| _| j	t
j@ dk| _n| j tjkrtj| _| j	t
j@ dk| _n| j tjkr|   n| j tjkrtj| _nn| j tjkr|   nX| j tjkrtj| _n@| j tjkrtj| _n(| j tjkr2tj| _ntd| j  dS )z	Map type.r   zUnknown column type N)r   r   r   r   r   r   r   r   r   r   r   r   Z_is_number_signedr   r   r   r   r   r   r   r   r   r   r9   r   r(   r(   r)   r   C  s4    





zColumn._map_typec                 C  s   | j S )z@str: The schema name.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   schema_namea  s    zColumn.schema_namec                 C  s   | j p
| jS )z?str: The table name.

        .. versionadded:: 8.0.12
        r   r   r   r(   r(   r)   
table_namei  s    zColumn.table_namec                 C  s   | j p
| jS )z@str: The table label.

        .. versionadded:: 8.0.12
        r   r   r   r(   r(   r)   table_labelq  s    zColumn.table_labelc                 C  s   | j p
| jS )z@str: The column name.

        .. versionadded:: 8.0.12
        r   r   r   r(   r(   r)   column_namey  s    zColumn.column_namec                 C  s   | j p
| jS )zAstr: The column label.

        .. versionadded:: 8.0.12
        r   r   r   r(   r(   r)   column_label  s    zColumn.column_labelc                 C  s   | j S )z@int: The column type.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   type  s    zColumn.typec                 C  s   | j S )zBint. The column length.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   r     s    zColumn.lengthc                 C  s   | j S )zMint: The column fractional digits.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   r     s    zColumn.fractional_digitsc                 C  s   | j S )zCstr: The collation name.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   collation_name  s    zColumn.collation_namec                 C  s   | j S )zGstr: The character set name.

        .. versionadded:: 8.0.12
        r   r   r(   r(   r)   character_set_name  s    zColumn.character_set_namec                 C  s   | j S )zUReturns the schema name.

        Returns:
            str: The schema name.
        r   r   r(   r(   r)   get_schema_name  s    zColumn.get_schema_namec                 C  s   | j p
| jS )zSReturns the table name.

        Returns:
            str: The table name.
        r  r   r(   r(   r)   get_table_name  s    zColumn.get_table_namec                 C  s   | j p
| jS )zUReturns the table label.

        Returns:
            str: The table label.
        r  r   r(   r(   r)   get_table_label  s    zColumn.get_table_labelc                 C  s   | j p
| jS )zUReturns the column name.

        Returns:
            str: The column name.
        r  r   r(   r(   r)   get_column_name  s    zColumn.get_column_namec                 C  s   | j p
| jS )zWReturns the column label.

        Returns:
            str: The column label.
        r  r   r(   r(   r)   get_column_label  s    zColumn.get_column_labelc                 C  s   | j S )zaReturns the column proto type.

        Returns:
            int: The column proto type.
        )r   r   r(   r(   r)   r!     s    zColumn.get_proto_typec                 C  s   | j S )zUReturns the column type.

        Returns:
            int: The column type.
        r
  r   r(   r(   r)   r     s    zColumn.get_typec                 C  s   | j S )zYReturns the column length.

        Returns:
            int: The column length.
        r  r   r(   r(   r)   
get_length  s    zColumn.get_lengthc                 C  s   | j S )zoReturns the column fractional digits.

        Returns:
            int: The column fractional digits.
        r  r   r(   r(   r)   get_fractional_digits  s    zColumn.get_fractional_digitsc                 C  s   | j S )z[Returns the collation name.

        Returns:
            str: The collation name.
        r  r   r(   r(   r)   get_collation_name  s    zColumn.get_collation_namec                 C  s   | j S )zcReturns the character set name.

        Returns:
            str: The character set name.
        r  r   r(   r(   r)   get_character_set_name  s    zColumn.get_character_set_namer   c                 C  s   | j S )zxReturns `True` if is a number signed.

        Returns:
            bool: Returns `True` if is a number signed.
        )r   r   r(   r(   r)   is_number_signed	  s    zColumn.is_number_signedUnion[bool, int]c                 C  s   | j S )zfReturns `True` if is padded.

        Returns:
            bool: Returns `True` if is padded.
        )r   r   r(   r(   r)   	is_padded  s    zColumn.is_paddedc                 C  s   | j S )zdReturns `True` if is bytes.

        Returns:
            bool: Returns `True` if is bytes.
        )r   r   r(   r(   r)   is_bytes  s    zColumn.is_bytes)NNNNNNNNNNN)$rc   rd   re   __doc__r   r   r   r   r   r   r   r   r  r  r  r  r	  r  r   r   r  r  r  r  r  r  r  r!   r   r  r  r  r  r  r  r  r(   r(   r(   r)   r     sj              (6
c                   @  sX   e Zd ZdZddddddZdd	d
dZdddddZeddddddZdS )RowzRepresents a row element returned from a SELECT query.

    Args:
        resultset (mysqlx.SqlResult or mysqlx.RowResult): The result set.
        fields (`list`): The list of fields.
    z!Union[BufferingResult, RowResult]zSequence[FieldTypes]r   )	resultsetfieldsr   c                 C  s   || _ || _d S r   )_fields
_resultset)r   r!  r"  r(   r(   r)   r   *  s    zRow.__init__r   r   c                 C  s
   t | jS r   )reprr#  r   r(   r(   r)   __repr__0  s    zRow.__repr__zUnion[int, str]r   indexr   c                 C  sd   t |tr| j|n|}|dkr<t |tr<td| d|t| jksR|dk rZtd| j| S )z\Returns the value of a column by name or index.

        .. versionchanged:: 8.0.12
        r   Column name '' not foundr   zIndex out of range)r:   r   r$  index_ofr9   r   r#  
IndexError)r   r(  	int_indexr(   r(   r)   __getitem__3  s    zRow.__getitem__8.0.12)	str_indexr   c                 C  sH   | j |}|t| jkr"td|dkr:td| dt| j| S )zReturns the value using the column name.

        Args:
            str_index (str): The column name.

        .. deprecated:: 8.0.12
        zArgument out of ranger   r)  r*  )r$  r+  r   r#  r,  r9   r   )r   r0  r-  r(   r(   r)   
get_string?  s    	zRow.get_stringN)	rc   rd   re   r  r   r&  r.  r   r1  r(   r(   r(   r)   r   "  s   r   c                   @  s   e Zd ZdZdddddZddd	d
ZddddZddddZdddddZdddddddZ	dddddZ
dddddZdddd d!Zd"S )#
BaseResultzProvides base functionality for result objects.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
    r   r   
connectionr   c                 C  sH   || _ d| _d| _d| _g | _g | _|d kr4d | _n|j| _|  d S NFr   r   )	_connection_closed_rows_affected_generated_id_generated_ids	_warnings	_protocolprotocolZfetch_active_resultr   r4  r(   r(   r)   r   W  s    zBaseResult.__init__r;   r   c                 C  s   | j S )zReturns the number of affected items for the last operation.

        Returns:
            int: The number of affected items.
        r8  r   r(   r(   r)   get_affected_items_counte  s    z#BaseResult.get_affected_items_countz List[Dict[str, Union[int, str]]]c                 C  s   | j S )zZReturns the warnings.

        Returns:
            `list`: The list of warnings.
        )r;  r   r(   r(   r)   get_warningsm  s    zBaseResult.get_warningsc                 C  s
   t | jS )zcReturns the number of warnings.

        Returns:
            int: The number of warnings.
        )r   r;  r   r(   r(   r)   get_warnings_countu  s    zBaseResult.get_warnings_countr   r   r   c                 C  s
   || _ dS )z Sets if resultset fetch is done.N)r7  r   r   r(   r(   r)   
set_closed}  s    zBaseResult.set_closedr   )levelcodemsgr   c                 C  s   | j |||d dS )zAppend a warning.

        Args:
            level (int): The warning level.
            code (int): The warning code.
            msg (str): The warning message.
        )rF  rG  rH  N)r;  rI   )r   rF  rG  rH  r(   r(   r)   append_warning  s    zBaseResult.append_warning	List[int])generated_idsr   c                 C  s
   || _ dS )zSets the generated ids.Nr:  )r   rK  r(   r(   r)   set_generated_ids  s    zBaseResult.set_generated_ids)generated_idr   c                 C  s
   || _ dS )zSets the generated insert id.Nr9  )r   rN  r(   r(   r)   set_generated_insert_id  s    z"BaseResult.set_generated_insert_id)totalr   c                 C  s
   || _ dS )z!Sets the number of rows affected.Nr?  )r   rQ  r(   r(   r)   set_rows_affected  s    zBaseResult.set_rows_affectedN)rc   rd   re   r  r   r@  rA  rB  rE  rI  rM  rP  rR  r(   r(   r(   r)   r2  P  s   
r2  c                      st   e Zd ZdZddddd fddZd	d
ddZeddd
ddZedd	d
ddZdd
ddZ	  Z
S )Resulta  Allows retrieving information about non query operations performed on
    the database.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
                                                   ids (`list`): A list of IDs.
    NzOptional[ConnectionType]zOptional[List[int]]r   )r4  idsr   c                   s*   t  | || _|d k	r&| j|  d S r   )superr   _idsr6  Zclose_result)r   r4  rT  r   r(   r)   r     s    zResult.__init__r;   r   c                 C  s   | j S )zjReturns the last insert id auto generated.

        Returns:
            int: The last insert id.
        rO  r   r(   r(   r)   get_autoincrement_value  s    zResult.get_autoincrement_valuer/  r   c                 C  s&   | j dkst| j dkrdS | j d S )zdReturns ID of the last document inserted into a collection.

        .. deprecated:: 8.0.12
        Nr   )rV  r   r   r(   r(   r)   get_document_id  s    zResult.get_document_idc                 C  s   | j S )zIReturns the generated insert id.

        .. deprecated:: 8.0.12
        rO  r   r(   r(   r)   get_generated_insert_id  s    zResult.get_generated_insert_idrJ  c                 C  s   | j S )zReturns the generated ids.rL  r   r(   r(   r)   get_generated_ids  s    zResult.get_generated_ids)NN)rc   rd   re   r  r   rX  r   rY  rZ  r[  __classcell__r(   r(   rW  r)   rS    s   
  	rS  c                      s   e Zd ZdZddd fddZddd	d
dZeddddZddddZdddddZ	ddddZ
dddddZddddZddd d!Zddd"d#d$Zddd"d%d&Z  ZS )'BufferingResultzProvides base functionality for buffering result objects.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
                                                   ids (`list`): A list of IDs.
    r   r   r3  c                   s<   t  | g | _d| _d| _g | _d| _d| _|   d S r5  )	rU  r   _columns	_has_data_has_more_results_items
_page_size	_position_init_resultr>  rW  r(   r)   r     s    zBufferingResult.__init__r;   zUnion[Row, DbDoc]r'  c                 C  s
   | j | S r   )ra  )r   r(  r(   r(   r)   r.    s    zBufferingResult.__getitem__r   c                 C  s
   t | jS )zint: The total of items.)r   ra  r   r(   r(   r)   count  s    zBufferingResult.countc                 C  sJ   | j | | _t| jdk| _g | _d| _d| _| j | jr@| nd dS )zInitialize the result.r   rq   r   N)	r6  Zget_column_metadatar^  r   Z_has_more_datara  rb  rc  Zset_active_resultr   r(   r(   r)   rd    s    zBufferingResult._init_resultr   zOptional[Union[Row, DbDoc]]dumpingr   c                 C  sn   | j | }|dkrdS dgt|d  }|sdtt|d D ]$}| j| }t||d | ||< q>t| |S )zRead item.

        Args:
            dumping (bool): `True` for dumping.

        Returns:
            :class:`mysqlx.Row`: A `Row` object.
        Nfield)r6  Zread_rowr   r   r^  r*   r   )r   rg  rowrA   r   r   r(   r(   r)   
_read_item  s    	
zBufferingResult._read_itemr  c                 C  sL   | j r
dS d}t| jD ].}| d}|dkr2 qH| j| |d7 }q|S )zSReads the page items.

        Returns:
            int: Total items read.
        Fr   Nr   )r7  r   rb  rj  ra  rI   )r   re  r   rA   r(   r(   r)   _page_in_items  s    

zBufferingResult._page_in_itemsr   )col_namer   c                 C  s0   d}| j D ] }| |kr"|  S |d7 }q
dS )zeReturns the index of the column.

        Returns:
            int: The index of the column.
        r   r   r   )r^  r  )r   rl  r(  colr(   r(   r)   r+    s    

zBufferingResult.index_ofc                 C  s   | j r
dS | dS )zuFetch one item.

        Returns:
            :class:`mysqlx.Row` or :class:`mysqlx.DbDoc`: one result item.
        NF)r7  rj  r   r(   r(   r)   	fetch_one   s    zBufferingResult.fetch_onezList[Union[Row, DbDoc]]c                 C  s   |   s qq | jS )zFetch all items.

        Returns:
            `list`: The list of items of :class:`mysqlx.DbDoc` or
                    :class:`mysqlx.Row`.
        )rk  ra  r   r(   r(   r)   	fetch_all+  s    zBufferingResult.fetch_allrC  c                 C  s
   || _ dS )zdSets if result has data.

        Args:
            flag (bool): `True` if result has data.
        Nr_  rD  r(   r(   r)   set_has_data7  s    zBufferingResult.set_has_datac                 C  s
   || _ dS )zfSets if has more results.

        Args:
            flag (bool): `True` if has more results.
        N)r`  rD  r(   r(   r)   set_has_more_results?  s    z$BufferingResult.set_has_more_results)rc   rd   re   r  r   r.  r   re  rd  rj  rk  r+  rn  ro  rq  rr  r\  r(   r(   rW  r)   r]    s   
	r]  c                   @  s0   e Zd ZdZeddddZddddZdS )		RowResultzAllows traversing the Row objects returned by a Table.select operation.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
    zList[Column]r   c                 C  s   | j S )z`list`: The list of columns.r^  r   r(   r(   r)   columnsO  s    zRowResult.columnsc                 C  s   | j S )zReturns the list of columns.

        Returns:
            `list`: The list of columns.

        .. versionadded:: 8.0.12
        rt  r   r(   r(   r)   get_columnsT  s    zRowResult.get_columnsN)rc   rd   re   r  r   ru  rv  r(   r(   r(   r)   rs  H  s   rs  c                   @  s:   e Zd ZdZddddZddddZddd	d
ZdS )	SqlResultzRepresents a result from a SQL statement.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
    r;   r   c                 C  s   | j S )zReturns the identifier for the last record inserted.

        Returns:
            str: The identifier of the last record inserted.
        rO  r   r(   r(   r)   rX  f  s    z!SqlResult.get_autoincrement_valuer   c                 C  s   | j r
dS d| _|   dS )zjProcess the next result.

        Returns:
            bool: Returns `True` if the fetch is done.
        FT)r7  r`  rd  r   r(   r(   r)   next_resultn  s
    zSqlResult.next_resultc                 C  s   | j S )zReturns True if result has data.

        Returns:
            bool: Returns `True` if result has data.

        .. versionadded:: 8.0.12
        rp  r   r(   r(   r)   has_dataz  s    zSqlResult.has_dataN)rc   rd   re   r  rX  rx  ry  r(   r(   r(   r)   rw  _  s   rw  c                      s(   e Zd ZdZddd fddZ  ZS )	DocResultzAllows traversing the DbDoc objects returned by a Collection.find
    operation.

    Args:
        connection (mysqlx.connection.Connection): The Connection object.
    r   r   rf  c                   s(   t  |}|dkrdS tt|d S )zRead item.

        Args:
            dumping (bool): `True` for dumping.

        Returns:
            :class:`mysqlx.DbDoc`: A `DbDoc` object.
        Nr   )rU  rj  r   r   )r   rg  ri  rW  r(   r)   rj    s    	zDocResult._read_item)rc   rd   re   r  rj  r\  r(   r(   rW  r)   rz    s   rz  )9r  
__future__r   rP   r1   r#   r   r   typingr   r   r   r   r	   r
   r   r   Zcharsetsr   Zdbdocr   Zhelpersr   r   typesr   r   r*   r,   r3   r5   rC   rG   rH   rJ   rT   r\   r`   ra   r   r   r   r   r   r   r   r   r   r   r   r   r2  rS  r]  rs  rw  rz  r(   r(   r(   r)   <module>   sT   ($!d'	  j.H3}&