
    ɯeiC,                    V   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j                  d      Z ej                  d      Z ej                  e      Z G d d      Z	 	 d	 	 	 	 	 dd	Z	 	 	 	 dd
ZddZd Zdddej.                  f	 	 	 	 	 	 	 	 	 ddZddZddZy)    )annotationsN)StringIO)Sequencez^\s*\-\-z^\s*$c                  "    e Zd ZdZddZdddZy)SQLDelimiterzClass that wraps a SQL delimiter string.

    Since split_statements is a generator this mutable object will allow it change while executing.
    c                    | j                   S )Nsql_delimiter)selfs    _/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/util_text.py__str__zSQLDelimiter.__str__   s    !!!    c                    || _         y)z'Initializes SQLDelimiter with a string.Nr	   )r   r
   s     r   __init__zSQLDelimiter.__init__   s
    *r   N)returnstr);)r
   r   r   None)__name__
__module____qualname____doc__r   r    r   r   r   r      s    
"+r   r   c              #    K   |
t               }d}d}d}d}d}| j                         }t        |t              rt	        d      g }	|dk7  rWd}
d}t        |      }|j                  }|r||k7  rt        j                  |      }t        j                  d|d         rt        j                  d|       }nt        j                  d|       }t        j                  d|d	         rt        j                  | d
      }nt        j                  | d      }|}	 |
|k\  ru||
k  rn|s7|s5|s3|	j                  |||
 df       t        |	      dk(  r|	d   d   dk(  rg }	n/|s|s|r|	j                  |||
 df       n|s|	j                  |||
 df       n|rA||
d j                  d      r&d}|s|	j                  |||
dz    df       |
dz  }
|
}n|
dz  }
n|r?||
d j                  d      r$d}|	j                  |||
dz    df       |
dz  }
|
}ny|
dz  }
nr|rx||
   dk(  r|
|dz
  k  r||
dz      |dfv r|
dz  }
nM||
   |k(  rF|
|dz
  k  r||
dz      |k7  s|
|dz
  k(  r$d}|	j                  |||
dz    df       |
dz  }
|
}n|
dz  }
n|
dz  }
n||
   dv rd}||
   }|
dz  }
n||
   dv r"|	j                  |||
dz    df       |
dz  }
|
}n||
d j                  d      rI|	j                  |||
 df       |s|	j                  ||
d df       n|	j                  d       |dz   }
|
}n]||
d j                  d      rQ||d j                  d      s=|s|	j                  |||
dz    df       n|	j                  |||
 df       |
dz  }
|
}d}n||
d j                  d      r$|	j                  |||
dz    df       |
dz  }
|
}d}n|
dkD  r%j                  ||
dz
  |
t        |      z          r	n j                  ||
|
t        |      z          rj                  ||
|
t        |      z   dz          r|	j                  |||
 dz   df       |
t        |      z  }
	 ||
   dk(  r|
dz  }
|	d	   d   dz   |	d	   d   f|	d	<   t        j                  ||
d       st        j                  ||
d       r|s|	j                  ||
d df       |}
|
|k  r||
   dv r|
dz  }
|
|k  r||
   dv rt!        |	       |
}g }	n|
dk(  r||
   dk(  r|t        |	      dkD  rt!        |	       g }	|j#                         j%                  |      r|j#                         dt        |        n|j#                         j#                         df n|
dz  }
r| j                         }|dk7  rWt        |	      dkD  rt!        |	       yy# t        $ r Y Jw xY ww)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)bufremove_comments	delimiterin_quotech_quote
in_commentin_double_dollarsprevious_delimiterline	statementcolcol0len_liner
   escaped_delimRE_STARTRE_ENDs                    r   split_statementsrH   !   s      N	HHJ<<>D$=>>I
"*t9!//!]6H%HIIm4M xx}Q/0::-&AB::]O&<=xx}R01h$?@c$:;!.h#:%h?P!(($tC.$)?@y>Q.9Q<?b3H(*I'X9J!(($tC.$)?@,!(($tC.%)@A:((.!&J*!(($tcAg*>)FG1HCD1HC":((.(-%$$d4#'&:E%BC1HCD1HCI%hl*S1W(D)991HC#Y(*hl* qMX5(Q,. $)!(($tcAg*>)EFq" q1HC9
*#H#CyH1HC#Y+-$$d4#'&:D%AB1HCD#$Z**40$$d4nd%;<*!(($st*e)<=!((6"Q,CD#$Z**40de9O9O: +!(($tcAg*>)FG!(($tC.%)@A1HCD!%J#$Z**40$$d4#'&:D%AB1HCD(,% Qw NN4a#M8J2J#KL"..cC#m:L4L)MN||DsS5G/G!/K$LM$$d4ns&:D%AB3}--C9+1HC-6r]1-=-CYr]STEU,VIbM *//ST
;}?R?RST
@  /%,,d34j%-@A&.T#Y+-Eq .T#Y+-E1)<<D "IAX$s)s"29~)5i@@$&	  ::<00? 

%:M(:':;!ZZ\egu	% %
 1HCu v ||~] "*` 9~%i00 9 & s8   QW#W  A'W*B7W#W 	W	WWWc                    g }d}| D ]N  \  }}|j                  |       ||st        |j                               dk\  s:|dd j                         dv }P dj	                  |      j                         |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   )r0   r+   r6   upperjoin)statement_listvalid_statement_listis_put_or_gettextis_statements        r   r5   r5      s      M, ?l##D) \c$**,6G16L !HNN,>M? 77'(..0-??r   c                   d
d}| dk(  rd} | r@|j                  d      dkD  r|d|j                  d       } ||       rdnd}| d|  d| }|S d}|j                  d      dkD  r ||j                  d      d	         rd}| d| }|S )z,Constructs hostname from region and account.c                @    | j                         j                  d      S )Nzcn-)lowerr1   )rs    r   _is_china_regionz,construct_hostname.<locals>._is_china_region   s     wwy##E**r   z	us-west-2r   .r   cncomz.snowflakecomputing.r   )rW   r   r   bool)findsplit)regionaccountrX   top_level_domainhosts        r   construct_hostnamerc      s    +
 <<q a',,s"34G#3F#;4!F8#78H7IJ K	 !<<q %5gmmC6H6K%L#./?.@AKr   c                    | j                  d      }t        |      dkD  r+|d   dk(  r|d   d|d   j                  d       }|S |d   }|S | }|S )NrY   r   globalr   -)r^   r+   rfind)r`   	url_partsparsed_accounts      r   parse_accountrj     sq    c"I 9~Q<8#&q\!il.@.@.EFN 	 'q\N  !r   
   r   c                    dj                  t        |       D cg c]%  }t        j                         j	                  |      ' c}      }dj                  |||g      S c c}w )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   )rN   rangerandomRandomchoice)lengthprefixsuffixchoices_random_parts         r   random_stringrw     sN     ''E&MRq6==?11':RSK77FK011 Ss   *Ac                R    | r$t        j                  |       j                  d      S d S )Nutf-8)base64	b64encodedecode)xs    r   _base64_bytes_to_strr~   $  s%    236A%%g.==r   c                    t        | t              r| j                  d      } t        j                  d      }|j                  |        |j                         S )Nry   F)usedforsecurity)r(   r   encodehashlibmd5updatedigest)rR   r   s     r   get_md5_for_integrityr   (  s@    ${{7#
++e
,CJJt::<r   )FN)r8   r   r9   r\   r:   zSQLDelimiter | None)rO   zlist[tuple[str, bool]]r   ztuple[str, bool | None])r_   
str | Noner`   r   r   r   )
rq   intrr   r   rs   r   rt   zSequence[str]r   r   )r   r   )rR   zstr | bytesr   r)   )
__future__r   rz   r   loggingrn   r,   stringior   typingr   r/   r3   r4   	getLoggerr   _loggerr   rH   r5   rc   rj   ascii_lowercaserw   r~   r   r   r   r   <module>r      s    "     	   RZZ, 

8$
'

H
%+ +  "%)m1	m1m1 #m1`@*@@2.$ #33	222 2 	2
 	2$>r   