o
    RDiC,                     @  s   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m	Z	 d dl
mZ edZedZeeZG dd dZ			d1d2ddZd3ddZd4ddZdd Zd d!d!ejfd5d(d)Zd6d*d+Zd7d/d0ZdS )8    )annotationsN)StringIO)Sequencez^\s*\-\-z^\s*$c                   @  s&   e Zd ZdZdddZddd	d
ZdS )SQLDelimiterzClass that wraps a SQL delimiter string.

    Since split_statements is a generator this mutable object will allow it change while executing.
    returnstrc                 C  s   | j S )Nsql_delimiter)self r   V/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/util_text.py__str__   s   zSQLDelimiter.__str__;r	   Nonec                 C  s
   || _ dS )z'Initializes SQLDelimiter with a string.Nr   )r
   r	   r   r   r   __init__   s   
zSQLDelimiter.__init__N)r   r   )r   )r	   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    
r   Fbufr   remove_commentsbool	delimiterSQLDelimiter | Nonec                 c  sv   |du rt  }d}d}d}d}d}|  }t|trtdg }	|dkr+d}
d}t|}|j}|r7||krpt|}t	d|d rMt
d| }nt
d| }t	d|d	 rft
| d
}nt
| d}|}	 |
|kr||
k r|s|s|s|	|||
 df t|	dkr|	d d dkrg }	n|s|s|r|	|||
 df n|s|	|||
 df nf|r||
d drd}|s|	|||
d  df |
d7 }
|
}nA|
d7 }
n;|r||
d drd}|	|||
d  df |
d7 }
|
}n|
d7 }
n|rt||
 dkr3|
|d k r3||
d  |dfv r3|
d7 }
n||
 |krn|
|d k rJ||
d  |ksQ|
|d krhd}|	|||
d  df |
d7 }
|
}n|
d7 }
n|
d7 }
n||
 dv rd}||
 }|
d7 }
n||
 dv r|	|||
d  df |
d7 }
|
}n||
d dr|	|||
 df |s|	||
d df n|	d |d }
|
}nN||
d dr||d ds|s|	|||
d  df n|	|||
 df |
d7 }
|
}d}n||
d dr.|	|||
d  df |
d7 }
|
}d}n|
dkrD|	||
d |
t|  rn|	||
|
t|  r|	||
|
t| d  r|	|||
 d df |
t|7 }
z||
 dkr|
d7 }
|	d	 d d |	d	 d f|	d	< W n
 ty   Y nw t	||
d st	||
d r|s|	||
d df |}
|
|k r||
 dv r|
d7 }
|
|k r||
 dv st|	V  |
}g }	n;|
dkr||
 dkrt|	dkrt|	V  g }	| |r| dt|  n|  dfV  n|
d7 }
qq|  }|dks&t|	dkr9t|	V  dS dS )aa  Splits a stream into SQL statements (ends with a semicolon) or commands (!...).

    Args:
        buf: Unicode data stream.
        remove_comments: Whether or not to remove all comments (Default value = False).
        delimiter: The delimiter string that separates SQL commands from each other.

    Yields:
        A SQL statement or a command.
    NFz#Input data must not be binary type. r   z\wz^[^\w$]?z^.?z[^\w$]?$z.?$T   z*/   z$$\)'") 	z--)
Tz/*zfile://r   >!)r   readline
isinstancebytes	TypeErrorlenr	   reescapematchcompileappend
startswith
IndexErrorCOMMENT_PATTERN_REEMPTY_LINE_RE_concatenate_statementsstripendswith)r   r   r   in_quotech_quote
in_commentin_double_dollarsprevious_delimiterline	statementcolcol0len_liner	   escaped_delimRE_STARTRE_ENDr   r   r   split_statements!   s$  



 
 


{  rD   statement_listlist[tuple[str, bool]]r   tuple[str, bool | None]c                 C  sb   g }d}| D ]!\}}| | |du r'|r't| dkr'|dd  dv }qd| |fS )a  Concatenate statements.

    Each statement should be a tuple of statement and is_put_or_get.

    The is_put_or_get is set to True if the statement is PUT or GET otherwise False for valid statement.
    None is set if the statement is empty or comment only.

    Args:
        statement_list: List of statement parts.

    Returns:
        Tuple of statements and whether they are PUT or GET.
    N   )PUTGETr   )r/   r*   r5   upperjoin)rE   valid_statement_listis_put_or_gettextis_statementr   r   r   r4      s   
r4   region
str | Noneaccountr   c                 C  s   ddd}| dkrd} | r1| d	d
kr|d
| d	 }|| r#dnd}| d	|  d| }|S d}| d	d
krE||d	d rEd}| d| }|S )z,Constructs hostname from region and account.rr   r   r   c                 S  s   |   dS )Nzcn-)lowerr0   )rT   r   r   r   _is_china_region   s   z,construct_hostname.<locals>._is_china_regionz	us-west-2r   .r   cncomz.snowflakecomputing.r   N)rT   r   r   r   )findsplit)rQ   rS   rV   top_level_domainhostr   r   r   construct_hostname   s   
 r^   c                 C  sT   |  d}t|dkr&|d dkr |d d|d d }|S |d }|S | }|S )NrW   r   globalr   -)r[   r*   rfind)rS   	url_partsparsed_accountr   r   r   parse_account  s   
rd   
   r   lengthintprefixsuffixchoicesSequence[str]c                   s,   d  fddt| D }d |||gS )aB  Our convenience function to generate random string for object names.

    Args:
        length: How many random characters to choose from choices.
        prefix: Prefix to add to random string generated.
        suffix: Suffix to add to random string generated.
        choices: A generator of things to choose from.
    r   c                   s   g | ]	}t   qS r   )randomRandomchoice).0_rj   r   r   
<listcomp>   s    z!random_string.<locals>.<listcomp>)rL   range)rf   rh   ri   rj   random_partr   rq   r   random_string  s   ru   c                 C  s   | r
t | dS d S )Nutf-8)base64	b64encodedecode)xr   r   r   _base64_bytes_to_str$  s   r{   rO   str | bytesr(   c                 C  s2   t | tr
| d} tjdd}||  | S )Nrv   F)usedforsecurity)r'   r   encodehashlibmd5updatedigest)rO   r   r   r   r   get_md5_for_integrity(  s
   


r   )FN)r   r   r   r   r   r   )rE   rF   r   rG   )rQ   rR   rS   r   r   r   )
rf   rg   rh   r   ri   r   rj   rk   r   r   )r   rR   )rO   r|   r   r(   )
__future__r   rw   r   loggingrl   r+   stringior   typingr   r.   r2   r3   	getLoggerr   _loggerr   rD   r4   r^   rd   ascii_lowercaseru   r{   r   r   r   r   r   <module>   s6   


 
1

