
                         L   d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZ 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 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ej>                  Zde	ej@                     fdZ! G d de"      Z# G d d      Z$y)z,BigQuery client that exists for some reason.    N)AnyDictListOptionalType)app)flags)main_credential_loader)bigquery_client)bigquery_client_extended)wait_printer)utils)bq_api_utils)bq_gcloud_utils)
bq_loggingreturnc                      t         j                  j                  rt        j                  S t         j
                  j                  rt        j                  S t        j                  S )zGReturns the default wait_printer_factory to use while waiting for jobs.)bq_flagsQUIETvaluer   QuietWaitPrinterHEADLESSTransitionWaitPrinterVerboseWaitPrinter     (platform/bq/frontend/bq_cached_client.py_GetWaitPrinterFactoryFromFlagsr   !   sB    ^^(((---		(	((r   c                      e Zd ZdZi Zeddedeee	f   fd       Z
e	 ddej                  dej                  fd       Ze	 	 ddedej                  dej                  fd       Zedefd	       Zedej                  fd
       Zy)Clientz@Class caching bigquery_client.BigqueryClient based on arguments.config_loggingr   c                 J   dt         ffd}t        j                          | r-t        j                  t
        j                  j                         t        j                  t               t
        j                  j                  r\t        j                  t
        j                  j                        s/t        j                   j                  st#        j$                  d       t
        j&                  j                  r`t
        j&                  j                  t(        _        t-        t(        d      r-t
        j&                  j                  t(        j.                  _        i }d}|D ]  } ||      ||<    t#        j0                  dt        j2                         t#        j4                  d|       t7               |d	<   t
        j8                  j                  r?t;        t
        j8                  j                        5 }|j=                         |d
<   ddd       t
        j>                  j                  dnt
        j>                  j                  |d<   t
        j@                  j                  rt
        j@                  j                  |d<   t#        j0                  d|       |S # 1 sw Y   xY w)zCollect and combine FLAGS and kwds to create BQ Client.

    Args:
      config_logging: if True, set python logging according to --apilog.
      **kwds: keyword arguments for creating BigqueryClient.
    namec                 6    | v r|    S t        t        |       S N)getattrFLAGS)r#   kwdss    r   KwdsOrFlagsz(Client._CollectArgs.<locals>.KwdsOrFlags8   s    4<T$ZAWUD-AAr   )flag_valueszAttempting to use a non-GDU universe domain without setting `use_google_auth`. You might need to set `use_google_auth` to True.python3)credential_filejob_property
project_id
dataset_idtracesyncuse_google_authapiapi_versionquota_project_idrequest_reasonz&Creating client for BQ CLI version: %szGlobal args collected: %swait_printer_factorydiscovery_documentNTenable_resumable_uploadsmax_rows_per_requestzClient args collected: %s)!strbq_utilsProcessBigqueryrcr   ConfigureLoggingr   APILOGr   r   process_configr'   UNIVERSE_DOMAINpresentr   is_gdu_universebq_auth_flagsUSE_GOOGLE_AUTHloggingwarningHTTPLIB2_DEBUGLEVELhttplib2
debuglevelhasattrr+   infoVERSION_NUMBERdebugr   DISCOVERY_FILEopenreadENABLE_RESUMABLE_UPLOADSMAX_ROWS_PER_REQUEST)r!   r(   r)   client_argsglobal_argsr#   fs    `     r   _CollectArgszClient._CollectArgs/   s   B# B
  !!(//"7"78""u5 	  ((,,X-E-E-K-KL--33ooQ
 ##))$88>>h	9	%&.&B&B&H&H#KK %d+k$  LL0(2I2I MM-{;*I*KK&'$$''--.!,-FFH() / ,,22: 	..44 *+
 $$**,4,I,I,O,Ok()LL,k: /.s   5JJ"Ncredentialsc                    | t        j                  d       nmt        j                  j                  r*t        j                  d       t        j                         } n)t        j                  d       t        j                         } | J | S )zA function to lookup the credentials to use for this BQ CLI invocation.

    Args:
      credentials: bypass the credential lookup and use these instead.

    Returns:
      The credentials ot use for this BQ CLI invocation.
    zCredentials passed in directlyz$Credentials loaded using Google Authz%Credentials loaded using oauth2client)rF   rL   rD   rE   r   r
   GetCredentialsFromFlagscredential_loader)rX   s    r   GetCredentialszClient.GetCredentialsw   sn     ll34		&	&	,	,ll9:*BBDkll:;%==?k"""r   c                     t        j                  d|       t        j                  | fi |}t        j                         } |ddt        j                  |      i|S )aK  Build a new BigqueryClient configured from kwds and FLAGS.

    Args:
      config_logging: if True, set python logging according to --apilog.
      credentials: bypass the credential lookup and use these instead.
      **kwds: keyword arguments for creating BigqueryClient.

    Returns:
      A BigqueryClient from the kwds.
    z4Collecting args before creating a BigqueryClient: %srX   r   )rF   rN   r    rW   FactoryGetBigqueryClientFactoryr\   )r!   rX   r(   rT   bigquery_client_factorys        r   CreatezClient.Create   s_    " MMH$O%%n==K%>>@" ))+6:E r   c                     t        j                  d|       t        j                  di |}dj	                  |t
        j                  j                  t        j                  j                        S )Nz In Client._GetClientCacheKey: %szlclient_args={client_args},service_account_credential_file={service_account_credential_file},apilog={apilog},)rT   service_account_credential_fileapilogr   )
rF   rN   r    rW   formatrD   SERVICE_ACCOUNT_CREDENTIAL_FILEr   r   r?   )clsr(   rT   s      r   _GetClientCacheKeyzClient._GetClientCacheKey   s\    MM4d;%%--K	!6#,9,Y,Y,_,_??(( " 
r   c                 v   t         j                         }|| j                  v rt        j                  d|       n7	 t         j                         | j                  |<   t        j                  d       | j                  |   S # t        $ r/}t        j                  d       t        j                  |      d}~ww xY w)z/Return a BigqueryClient initialized from flags.zRUsing a cached client with previous auth and discovery docs from the cache_key: %sz"Successfully created a new client.zFailed to create a new client.N)	r    rh   client_cacherF   rL   ra   
ValueErrorr   
UsageError)rg   	cache_keyes      r   Getz
Client.Get   s     ))+IC$$$ll
 &,mmo#9: I&&   56nnQ s   6B   	B8	*B33B8)Tr%   )TN)__name__
__module____qualname____doc__rj   staticmethodboolr   r;   r   rW   r   'LegacyAndGoogleAuthCredentialsUnionTyper\   r   BigqueryClientExtendedra   classmethodrh   ro   r   r   r   r    r    *   s    H,E4 E4S> E EN MQ"JJ>> , !MQ"JJ  66	 2    '*AA ' 'r   r    c                   X    e Zd ZdZdZ G d d      Zedeej                     fd       Z
y)r^   z7Class encapsulating factory creation of BigqueryClient.Nc                   >    e Zd ZdZdZedej                  fd       Zy)Factory.ClientTablePrinterz5Class encapsulating factory creation of TablePrinter.Nr   c                 d    | j                   t        j                         | _         | j                   S r%   )_TABLE_PRINTERbq_frontend_utilsTablePrinterrg   s    r   GetTablePrinterz*Factory.ClientTablePrinter.GetTablePrinter   s+    				#.;;=r   )	rp   rq   rr   rs   r}   rx   r~   r   r   r   r   r   ClientTablePrinterr{      s*    ?N  1 > >    r   r   r   c                 \    | j                   t        j                  | _         | j                   S r%   )_BIGQUERY_CLIENT_FACTORYr   rw   r   s    r   r_   z Factory.GetBigqueryClientFactory   s/     ##+
"
9
9 
" '''r   )rp   rq   rr   rs   r   r   rx   r   r   rw   r_   r   r   r   r^   r^      s=    ?!	  	  ($;;<( (r   r^   )%rs   rF   systextwraptypingr   r   r   r   r   abslr   r	   rI   	termcolorrD   r   r<   r[   authr
   clientsr   r   r   frontendr   r~   r   r   r   r'   WaitPrinterr   objectr    r^   r   r   r   <module>r      s    2  
  2 2         ' # ,   /  !  	
)l.F.F)G )_'V _'D( (r   