a
    còfc~  ã                   @   sR  d Z ddlZddlZddlZddlZddlmZmZmZ zddl	m
Z
 W n ey^   eZ
Y n0 ddlmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZ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'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZC e Ed¡ZFe EdejG¡ZHe EdejG¡ZIe Ed¡ZJg d¢ZKeKg d¢ ZLe MeN¡ Oe P¡ ¡ dZQdZRdZSdZTddgZddgZUdZVeWedƒ�rôejX�rôdZVdd „ ZYd!d"„ ZZd#d$„ Z[d4d%d&„Z\d'd(„ Z]d)d*„ Z^d+d,„ Z_d-d.„ Z`d/d0„ Zad1d2„ Zbg d3¢ZcdS )5z$MySQL X DevAPI Python implementationé    N)Ú	parse_qslÚunquoteÚurlparse)ÚJSONDecodeErroré   )ÚClientÚSession)ÚAuthÚLockContentionÚOPENSSL_CS_NAMESÚSSLModeÚTLS_VERSIONSÚTLS_CIPHER_SUITES)ÚSchemaÚ
CollectionÚTableÚView)ÚDbDoc)ÚErrorÚInterfaceErrorÚDatabaseErrorÚNotSupportedErrorÚ	DataErrorÚIntegrityErrorÚProgrammingErrorÚOperationalErrorÚInternalErrorÚ	PoolErrorÚTimeoutError)ÚColumnÚRowÚResultÚBufferingResultÚ	RowResultÚ	SqlResultÚ	DocResultÚ
ColumnType)Ú	StatementÚFilterableStatementÚSqlStatementÚFindStatementÚAddStatementÚRemoveStatementÚModifyStatementÚSelectStatementÚInsertStatementÚDeleteStatementÚUpdateStatementÚCreateCollectionIndexStatementÚExprÚReadStatementÚWriteStatement)Ú
ExprParserz,(?![^\(\)]*\))z!^\(address=(.+),priority=(\d+)\)$z^\(address=(.+)[,]*\)$z"^([a-zA-Z][a-zA-Z0-9+\-.]+)://(.*))ússl-certússl-caússl-keyússl-crlútls-versionsútls-ciphersuites)ÚuserÚpasswordÚschemaÚhostÚportÚroutersÚsocketússl-modeÚauthzuse-pureúconnect-timeoutúconnection-attributesÚcompressionúcompression-algorithmsúdns-srvzVThe '{list}' list must not contain repeated values, the value '{value}' is duplicated.zdThe given tls-version: '{}' is not recognized as a valid TLS protocol version (should be one of {}).zHThe given tls_version: '{}' are no longer allowed (should be one of {}).zINo supported TLS protocol version found in the 'tls-versions' list '{}'. zTLSv1.2úTLSv1.3ÚTLSv1zTLSv1.1FÚHAS_TLSv1_3Tc           	      C   s„  |   dd¡} d| vo.|  d¡dko.|  d¡dk oD|  d¡oD|  d¡}g }t |r^| dd… n| ¡}d	}|D ]Ö}i }t |¡}|r¨| d¡}t	| d
¡ƒ|d< |d7 }n t
 |¡}|rÈ| d¡}d|d< td |¡ƒ}|jsêtd |¡ƒ‚z|j|j|jd� W n6 t�y6 } ztd |¡dƒ‚W Y d}~n
d}~0 0 | |¡ qld	|  k �r`t|ƒk �rnn n
tddƒ‚|�r|d|iS |d	 S )zÛParses a list of host, port pairs

    Args:
        path: String containing a list of routers or just router

    Returns:
        Returns a dict with parsed values of host, port and priority if
        specified.
    ú Ú ú,ú:r   ú[ú]éÿÿÿÿr   é   Úpriorityéd   z//{0}zInvalid address: {0})r@   rA   zInvalid URI: {0}i¢  Nz\You must either assign no priority to any of the routers or give a priority for every routeri   rB   )ÚreplaceÚcountÚ
startswithÚendswithÚ	_SPLIT_REÚsplitÚ_PRIORITY_REÚmatchÚgroupÚintÚ
_ROUTER_REr   ÚformatÚhostnamer   ÚupdaterA   Ú
ValueErrorr   ÚappendÚlen)	ÚpathÚarrayrB   Zaddress_listZpriority_countÚaddressÚrouterr_   Úerr© rn   úL/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysqlx/__init__.pyÚ_parse_address_listb   sF    
ÿÿþ




& þrp   c                 C   s   ddi}t  | ¡}|r| ¡ nd| f\}} |dvr@td |¡ƒ‚|dkrPd|d< |  d	¡d
d
d… \}}| d¡d
d
d… \}}| d¡}||d
…  d¡dkr¼|dkr¼| dd¡\}|d< | 	d¡}|rÖ|rÖd|vrätd | ¡ƒ‚| 
dd¡\}	}
t|	ƒt|
ƒ |d< |d< | d¡�r(t|ƒ|d< n$| d¡�r>tdƒ‚n| t|ƒ¡ d}t|dƒD ] \}}| dd¡ ¡ }||v �rŠtd |¡ƒ‚||v �r¢td |¡ƒ‚|tv �rÀt| 	d¡ƒ||< n8| ¡ }|d v �rÜd||< n|d!v �rðd"||< n|||< �qZ|S )#a¶  Parses the connection string and returns a dictionary with the
    connection settings.

    Args:
        uri: mysqlx URI scheme to connect to a MySQL server/farm.

    Returns:
        Returns a dict with parsed values of credentials and address of the
        MySQL server/farm.

    Raises:
        :class:`mysqlx.InterfaceError`: If contains a duplicate option or
                                        URI scheme is not valid.
    r?   rO   Úmysqlx)rq   ú
mysqlx+srvzScheme '{0}' is not validrr   TrJ   ú@NrU   ú?ú/ú)rT   r   r   z()rQ   zMalformed URI '{0}'r=   r>   )ru   z..Ú.rC   z\.zWindows Pipe is not supported)r=   r>   rJ   Ú_ú-zInvalid option: '{0}'zDuplicate option: '{0}')Ú1Útrue)Ú0ÚfalseF)Ú_URI_SCHEME_REr_   Úgroupsr   rc   Ú	partitionÚrfindÚfindÚrsplitÚstripr]   r   rZ   re   rp   r   rX   ÚlowerÚ	_SSL_OPTS)ÚuriÚsettingsr_   ÚschemeÚuserinfoÚtmpr@   Z	query_strÚposr=   r>   Zinvalid_optionsÚkeyÚvalÚoptZval_strrn   rn   ro   Ú_parse_connection_uri•   sL    










r�   c              	      s   t ˆ  ¡ ƒ t¡}|r*td d |¡¡ƒ‚dˆ v rLˆ d D ]}t|dƒ q:ndˆ v r\tˆ ƒ dˆ v rÜz"ˆ d  ¡ ˆ d< t	 
ˆ d ¡ W n( ttfy®   td ˆ d ¡ƒ‚Y n0 ˆ d t	jkrÜt‡ fdd	„tD ƒƒrÜtd
ƒ‚dˆ v rôdˆ vrôtdƒ‚dˆ v �rdˆ v�rtdƒ‚dˆ v�r:ˆ  d¡t	jt	jfv �r:tdƒ‚dˆ v �rdˆ  d¡t	jt	jfv�rdtdƒ‚dˆ v �r¼z"ˆ d  ¡ ˆ d< t 
ˆ d ¡ W n* ttf�yº   td ˆ d ¡ƒ‚Y n0 dˆ v �rúˆ d  ¡  ¡ }|dv�ròtd ˆ d ¡ƒ‚|ˆ d< dˆ v �rztˆ d tƒ�rFˆ d  ¡  d¡}|�r<| d¡ˆ d< ndˆ d< ntˆ d ttfƒ�sbtdƒ‚ˆ  d¡dk�rzdˆ d< dˆ v �rŒtˆ ƒ dˆ v �rúzFtˆ d tƒ�r¸tˆ d ƒˆ d< tˆ d tƒ�rÖˆ d d k �rÚt‚W n t�yø   td!ƒ‚Y n0 d"ˆ v �rZtˆ d" tƒ�std#ƒ‚ˆ  d$¡�r0td%ƒ‚ˆ  d&¡�rDtd'ƒ‚ˆ  d¡�rxtd(ƒ‚ndˆ v �rxˆ  d&¡�sxdˆ d&< d)ˆ v �rŠtˆ ƒ d*ˆ v �rœtˆ ƒ dS )+an  Validates the settings to be passed to a Session object
    the port values are converted to int if specified or set to 33060
    otherwise. The priority values for each router is converted to int
    if specified.

    Args:
        settings: dict containing connection settings.

    Raises:
        :class:`mysqlx.InterfaceError`: On any configuration issue.
    zInvalid option(s): '{0}'z', 'rB   i$�  r@   rD   zInvalid SSL Mode '{0}'c                 3   s   | ]}|ˆ v V  qd S )Nrn   )Ú.0r�   ©rˆ   rn   ro   Ú	<genexpr>ö   ó    z%_validate_settings.<locals>.<genexpr>z)SSL options used with ssl-mode 'disabled'r:   r8   zCA Certificate not providedr9   r7   zClient Certificate not providedzCannot verify Server without CAz$Must verify Server if CA is providedrE   zInvalid Auth '{0}'rH   )Ú	preferredÚrequiredÚdisabledz†The connection property 'compression' acceptable values are: 'preferred', 'required', or 'disabled'. The value '{0}' is not acceptablerI   z[]rP   Nz@Invalid type of the connection property 'compression-algorithms'r—   rG   rF   r   zEThe connection timeout value must be a positive integer (including 0)rJ   z(The value of 'dns-srv' must be a booleanrC   z<Using Unix domain sockets with DNS SRV lookup is not allowedrA   z;Specifying a port number with DNS SRV lookup is not allowedzASpecifying multiple hostnames with DNS SRV look up is not allowedr;   r<   ) ÚsetÚkeysÚ
differenceÚ
_SESS_OPTSr   rc   ÚjoinÚ_validate_hostsr…   r   ÚindexÚAttributeErrorrf   ZDISABLEDÚanyr†   ÚgetZVERIFY_IDENTITYZ	VERIFY_CAr	   r„   Ú
isinstanceÚstrr]   ÚlistÚtupleÚ_validate_connection_attributesra   Ú	TypeErrorÚboolÚ_validate_tls_versionsÚ_validate_tls_ciphersuites)rˆ   Zinvalid_optsrl   rH   Zcompression_algorithmsrn   r’   ro   Ú_validate_settings×   s°    ÿÿÿ
ÿ
ÿ


þÿ
ÿÿ



ÿ



r«   c                 C   sâ   d| v rˆ| d rˆz6t | d ƒ| d< | d dk s:| d dkrDtddƒ‚W n@ tyb   tddƒ‚Y n& ty†   td | d ¡dƒ‚Y n0 d| v rÊ| d rÊzt | d ƒ| d< W qÞ tyÆ   td	ƒ‚Y qÞ0 nd
| v rÞ|rÞ|| d< dS )zØValidate hosts.

    Args:
        settings (dict): Settings dictionary.
        default_port (int): Default connection port.

    Raises:
        :class:`mysqlx.InterfaceError`: If priority or port are invalid.
    rV   r   rW   z1Invalid priority value, must be between 0 and 100i§  zInvalid priorityzInvalid priority: {}rA   zInvalid portr@   N)ra   r   Ú	NameErrorrf   rc   r   )rˆ   Údefault_portrn   rn   ro   r�   H  s(    
ÿÿ
r�   c           	      C   sÎ  i }d| vrdS | d }t |tƒrü|dkr6i | d< dS | d¡rJ| d¡sb|dvrbtd |¡ƒ‚n–|dv rˆ|dv r|d	| d< ni | d< dS |d
d…  d¡}|D ]X}|dkr¬qž| d¡}|d }t|ƒd
krÒ|d
 nd}||v rîtd |¡ƒ‚qž|||< qž�n"t |tƒ�r:|D ]*}|| }t |tƒ�s,t	|ƒ}|||< �qnät |t
ƒ�sP|dv �rl|�r`i | d< nd	| d< dS t |tƒ�rŽ|D ]}d||< �q|n�t |tƒ�r|D ]b}|dk�r°�qž| d¡}|d }t|ƒd
k�rØ|d
 nd}||v �rötd |¡ƒ‚n|||< �qžnt |t
ƒ�std |¡ƒ‚|�rÂ|D ]˜}|| }t |tƒ�sNtd |¡ƒ‚t|ƒdk�rjtd |¡ƒ‚| d¡�r„td |¡ƒ‚t |tƒ�s td ||¡ƒ‚t|ƒdk�r(td ||¡ƒ‚�q(|| d< dS )z»Validate connection-attributes.

    Args:
        settings (dict): Settings dictionary.

    Raises:
        :class:`mysqlx.InterfaceError`: If attribute name or value exceeds size.
    rG   NrO   rR   rS   )ÚFalser}   ÚTruer{   z`The value of 'connection-attributes' must be a boolean or a list of key-value pairs, found: '{}')r®   r}   Fr   rT   rP   ú=r   z0Duplicate key '{}' used in connection-attributes)r   r   zOconnection-attributes must be Boolean or a list of key-value pairs, found: '{}'z(Attribute name '{}' must be a stringtypeé    z4Attribute name '{}' exceeds 32 characters limit sizerx   zEKey names in connection-attributes cannot start with '_', found: '{}'z0Attribute '{}' value: '{}' must be a string typei   z=Attribute '{}' value: '{}' exceeds 1024 characters limit size)r¢   r£   rZ   r[   r   rc   r]   rh   ÚdictÚreprr¨   r˜   r¤   )	rˆ   Ú
attributesZ
conn_attrsZconn_attributesÚattrZattr_name_valÚ	attr_nameZattr_valÚ
attr_valuern   rn   ro   r¦   g  sª    	
ÿþ

þ



þþÿÿþþþ
r¦   c           	      C   sâ  g }d| vrdS | d }t |tƒrœ| d¡r6| d¡sFtd |¡ƒ‚nT|dd…  d¡}|D ]<}| ¡ }|d	krtq\q\||v rŽttjd
|d�ƒ‚| 	|¡ q\n€t |t
ƒrä|s²tdƒ‚|D ]*}||v rÖttjd
|d�ƒ‚q¶| 	|¡ q¶n8t |tƒ�r|D ]}| 	|¡ qôntd d t¡|¡ƒ‚|�s*tdƒ‚g }g }g }|D ]:}|tv �rR| 	|¡ |tv �rh| 	|¡ n
| 	|¡ �q:|�r°|dgk�ržt�sžtt |t¡ƒ‚| ¡  || d< n.|�rÈtt |t¡ƒ‚n|�rÞtt |t¡ƒ‚dS )z¬Validate tls-versions.

    Args:
        settings (dict): Settings dictionary.

    Raises:
        :class:`mysqlx.InterfaceError`: If tls-versions name is not valid.
    r;   NrR   rS   z(tls-versions must be a list, found: '{}'r   rT   rP   rO   Útls_versions©r¤   ÚvaluezKAt least one TLS protocol version must be specified in 'tls-versions' list.zMtls-versions should be a list with one or more of versions in {}. found: '{}'z, rK   )r¢   r£   rZ   r[   r   rc   r]   r„   ÚDUPLICATED_IN_LIST_ERRORrg   r¤   r˜   rœ   r   ÚDEPRECATED_TLS_VERSIONSÚTLS_V1_3_SUPPORTEDr   ÚTLS_VER_NO_SUPPORTEDÚsortÚTLS_VERSION_DEPRECATED_ERRORÚTLS_VERSION_ERROR)	rˆ   r¸   Ztls_versions_settingsZtls_versÚtls_verZtls_versionZuse_tls_versionsZdeprecated_tls_versionsZnot_tls_versionsrn   rn   ro   r©   Ô  sˆ    	

ÿÿÿÿ
ÿÿ
þ



ÿ
ÿÿ
ÿr©   c                 C   sì  g }d| vrdS | d }t |tƒrŠ| d¡r6| d¡sFtd |¡ƒ‚qÖ|dd…  d¡}|sdtd	ƒ‚|D ]}| ¡  ¡ }|rh| 	|¡ qhnLt |t
ƒr¤d
d„ |D ƒ}n2t |tƒrÈ|D ]}|r²| 	|¡ q²ntd |¡ƒ‚|  dd¡du ròtdd… n| d dd… }|jdd� |d }g }i }g }	tdt |¡d … D ]"}
| t|
 ¡ |	 t|
 ¡ �q8|D ]p}d|v �r„||	v �r„| 	|¡ nJ||v �rÀ|| }||v �r´ttjd|d�ƒ‚n
| 	|¡ ntd |¡ƒ‚�q`|�sàtd	ƒ‚|| d< dS )z´Validate tls-ciphersuites.

    Args:
        settings (dict): Settings dictionary.

    Raises:
        :class:`mysqlx.InterfaceError`: If tls-ciphersuites name is not valid.
    r<   NrR   rS   z,tls-ciphersuites must be a list, found: '{}'r   rT   rP   z;No valid cipher suite found in the 'tls-ciphersuites' list.c                 S   s   g | ]}|r|‘qS rn   rn   )r‘   Útls_csrn   rn   ro   Ú
<listcomp>D  s   ÿz._validate_tls_ciphersuites.<locals>.<listcomp>zLtls-ciphersuites should be a list with one or more ciphersuites. Found: '{}'r;   T)Úreverser   ry   Útls_ciphersuitesr¹   z;The value '{}' in cipher suites is not a valid cipher suite)r¢   r£   rZ   r[   r   rc   r]   r„   Úupperrg   r¤   r˜   r¡   r   r¿   rž   re   r   Úextendr   rŸ   r»   )rˆ   rÆ   Ztls_ciphersuites_settingsZtls_cssrÃ   r¸   Znewer_tls_verZtranslated_namesZiani_cipher_suites_namesZossl_cipher_suites_namesrÂ   ÚnameZtranslated_namern   rn   ro   rª   &  sx    	

ÿÿ

þ
ÿÿ

ÿÿÿÿrª   c                  O   s˜   i }| rZt | d tƒr$t| d ƒ}q€t | d tƒr€| d  ¡ D ]\}}||| dd¡< q>n&|r€| ¡ D ]\}}||| dd¡< qf|sŒtdƒ‚t|ƒ |S )aZ  Parses the connection string and returns a dictionary with the
    connection settings.

    Args:
        *args: Variable length argument list with the connection data used
               to connect to the database. It can be a dictionary or a
               connection string.
        **kwargs: Arbitrary keyword arguments with connection data used to
                  connect to the database.

    Returns:
        mysqlx.Session: Session object.

    Raises:
        TypeError: If connection timeout is not a positive integer.
        :class:`mysqlx.InterfaceError`: If settings not provided.
    r   rx   ry   zSettings not provided)r¢   r£   r�   r²   ÚitemsrX   r   r«   )ÚargsÚkwargsrˆ   r�   rŽ   rn   rn   ro   Ú_get_connection_settingsy  s    rÍ   c                  O   s   t | i |¤Ž}t|ƒS )a°  Creates a Session instance using the provided connection data.

    Args:
        *args: Variable length argument list with the connection data used
               to connect to a MySQL server. It can be a dictionary or a
               connection string.
        **kwargs: Arbitrary keyword arguments with connection data used to
                  connect to the database.

    Returns:
        mysqlx.Session: Session object.
    )rÍ   r   )rË   rÌ   rˆ   rn   rn   ro   Úget_session�  s    rÎ   c                 C   sR  t | ttfƒstdƒ‚t| ƒ}t |ttfƒs4tdƒ‚t |tƒrjzt |¡}W q� tyf   tdƒ‚Y q�0 n&i }| ¡ D ]\}}||| 	dd¡< qvt |tƒs¢tdƒ‚i }d|v �rH| 
d¡}t |tƒsÌtdƒ‚| 
dd	¡|d< | 
d
d¡|d
< | 
dd¡|d< | 
dd¡|d< t|ƒdk�r(td |¡ƒ‚t|ƒdk�rHtd | ¡ ¡ƒ‚t||ƒS )a8  Creates a Client instance with the provided connection data and settings.

    Args:
        connection_string: A string or a dict type object to indicate the             connection data used to connect to a MySQL server.

            The string must have the following uri format::

                cnx_str = 'mysqlx://{user}:{pwd}@{host}:{port}'
                cnx_str = ('mysqlx://{user}:{pwd}@['
                           '    (address={host}:{port}, priority=n),'
                           '    (address={host}:{port}, priority=n), ...]'
                           '       ?[option=value]')

            And the dictionary::

                cnx_dict = {
                    'host': 'The host where the MySQL product is running',
                    'port': '(int) the port number configured for X protocol',
                    'user': 'The user name account',
                    'password': 'The password for the given user account',
                    'ssl-mode': 'The flags for ssl mode in mysqlx.SSLMode.FLAG',
                    'ssl-ca': 'The path to the ca.cert'
                    "connect-timeout": '(int) milliseconds to wait on timeout'
                }

        options_string: A string in the form of a document or a dictionary             type with configuration for the client.

            Current options include::

                options = {
                    'pooling': {
                        'enabled': (bool), # [True | False], True by default
                        'max_size': (int), # Maximum connections per pool
                        "max_idle_time": (int), # milliseconds that a
                            # connection will remain active while not in use.
                            # By default 0, means infinite.
                        "queue_timeout": (int), # milliseconds a request will
                            # wait for a connection to become available.
                            # By default 0, means infinite.
                    }
                }

    Returns:
        mysqlx.Client: Client object.

    .. versionadded:: 8.0.13
    z(connection_data must be a string or dictz+connection_options must be a string or dictzA'pooling' options must be given in the form of a document or dictry   rx   Zpoolingz<'pooling' options must be given in the form document or dictÚenabledTÚmax_sizeé   Zmax_idle_timer   Zqueue_timeoutz Unrecognized pooling options: {}z#Unrecognized connection options: {})r¢   r£   r²   r   rÍ   ÚjsonÚloadsr   rÊ   rX   Úpoprh   rc   r™   r   )Zconnection_stringZoptions_stringZsettings_dictZoptions_dictr�   rº   Zpooling_options_dictZpooling_optionsrn   rn   ro   Ú
get_client®  sF    2





ÿ
ÿÿÿrÕ   )/r   r   rÕ   rÎ   Úexprr	   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/   r0   r1   r4   r5   r2   r3   )N)dÚ__doc__ÚrerÒ   ÚloggingÚsslÚurllib.parser   r   r   Zjson.decoderr   ÚImportErrorrf   Ú
connectionr   r   Ú	constantsr	   r
   r   r   r   r   Zcrudr   r   r   r   Zdbdocr   Úerrorsr   r   r   r   r   r   r   r   r   r   r   Úresultr   r    r!   r"   r#   r$   r%   r&   Z	statementr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   rÖ   r6   Úcompiler\   ÚVERBOSEr^   rb   r~   r†   r›   Ú	getLoggerÚ__name__Ú
addHandlerÚNullHandlerr»   rÁ   rÀ   r¾   r¼   r½   ÚhasattrrM   rp   r�   r«   r�   r¦   r©   rª   rÍ   rÎ   rÕ   Ú__all__rn   rn   rn   ro   Ú<module>   sZ   
 4(D

ÿ3Bq
mRS$b