
    |`@                        d Z ddlmZmZmZmZ ddlZddlZddlZddl	 ddl	m
Z
 	 ddl	mZ ddlmZ dd	lmZ d
dl  ej&                  d      Z ej*                  d      Z e       ZeeeeeeiZ G d de      Z d Z!d Z" G d de#      Z$ G d de#      Z% G d de#      Z& G d de#      Z' G d de#      Z( G d de#      Z) G d de#      Z*i Z+d*dZ,d  Z-d! Z.d" Z/d# Z0d$ Z1d% Z2d& Z3 G d' d(e#      Z4d+d)Z5y# e$ r	 ddl	mZ Y w xY w),zB
This module adapts the SQLAlchemy ORM to the internal mechanism.
    )absolute_importdivisionprint_functionunicode_literalsN)*)schema)exc)
exceptions)IMDbDataAccessError)logger   alchemyz([A-Z])c                       e Zd ZdZy)NotFoundErrorz5Exception raised when Table.get(id) returns no value.N)__name__
__module____qualname____doc__     @/usr/lib/python3/dist-packages/imdb/parser/sql/alchemyadapter.pyr   r   6   s    ?r   r   c                 z    t         j                  d|       } | j                  d      r| dd } | j                         S )z0Build the name of a table, as done by SQLObject.z_\1_r   N)re_uppersub
startswithlower)tnames    r   _renameTabler   <   s7    LL'Eab	;;=r   c                 <    | j                  dd      } t        |       S )z1Build the name of a column, as done by SQLObject.IDId)replacer   )cnames    r   _renameColumnr%   D   s    MM$%Er   c                       e Zd ZdZd Zd Zy)	DNNameObjz?Used to access table.sqlmeta.columns[column].dbName (a string).c                     || _         y N)dbName)selfr*   s     r   __init__zDNNameObj.__init__N   	    r   c                 :    d| j                   dt        |       dS )Nz<DNNameObj(dbName=) [id=]>)r*   idr+   s    r   __repr__zDNNameObj.__repr__Q   s    37;;4IIr   N)r   r   r   r   r,   r3   r   r   r   r'   r'   J   s    IJr   r'   c                   "    e Zd ZdZd Zd Zd Zy)
DNNameDictz4Used to access table.sqlmeta.columns (a dictionary).c                     || _         y r)   colMap)r+   r8   s     r   r,   zDNNameDict.__init__Y   r-   r   c                 2    t        | j                  |         S r)   )r'   r8   )r+   keys     r   __getitem__zDNNameDict.__getitem__\   s    S)**r   c                 :    d| j                   dt        |       dS )Nz<DNNameDict(colMap=r/   r0   )r8   r1   r2   s    r   r3   zDNNameDict.__repr___   s    48KKDJJr   N)r   r   r   r   r,   r;   r3   r   r   r   r5   r5   U   s    >+Kr   r5   c                   $    e Zd ZdZddZd Zd Zy)SQLMetaAdapterzZUsed to access table.sqlmeta (an object with .table, .columns and
    .idName attributes).Nc                 (    || _         |i }|| _        y r)   tabler8   r+   rA   r8   s      r   r,   zSQLMetaAdapter.__init__h       
>Fr   c                     |dk(  rt        | j                  |      S |dk(  rt        | j                        S |dk(  r| j                  j	                  dd      S y )NrA   columnsidNamer1   )getattrrA   r5   r8   getr+   names     r   __getattr__zSQLMetaAdapter.__getattr__n   sQ    7?4::t,,9dkk**8;;??4..r   c                 x    dt        | j                        dt        | j                        dt        |       dS )Nz<SQLMetaAdapter(table=	, colMap=r/   r0   reprrA   r8   r1   r2   s    r   r3   zSQLMetaAdapter.__repr__w   )    $**tDKK0"T(< 	<r   r)   r   r   r   r   r,   rK   r3   r   r   r   r>   r>   c   s    <r   r>   c                   $    e Zd ZdZddZd Zd Zy)QAdapterzBUsed to access table.q attribute (remapped to SQLAlchemy table.c).Nc                 (    || _         |i }|| _        y r)   r@   rB   s      r   r,   zQAdapter.__init__   rC   r   c                     	 t        | j                  j                  | j                  |         S # t        $ r t        d|z        w xY wNzunable to get '%s')rG   rA   cr8   KeyErrorAttributeErrorrI   s     r   rK   zQAdapter.__getattr__   sE    	>4::<<T):;; 	> !5!<==	>s	   ,/ Ac                 x    dt        | j                        dt        | j                        dt        |       dS )Nz<QAdapter(table=rM   r/   r0   rN   r2   s    r   r3   zQAdapter.__repr__   rP   r   r)   rQ   r   r   r   rS   rS   |   s    L><r   rS   c                   *    e Zd ZdZddZd Zd Zd Zy)
RowAdapterz)Adapter for a SQLAlchemy RowProxy object.Nc                 r    || _         || _        |i }|| _        t        |j	                               | _        y r)   )rowrA   r8   listkeys
colMapKeys)r+   r^   rA   r8   s       r   r,   zRowAdapter.__init__   s5     
>Fv{{}-r   c                     	 t        | j                  | j                  |         S # t        $ r t	        d|z        w xY wrV   )rG   r^   r8   rX   rY   rI   s     r   rK   zRowAdapter.__getattr__   sA    	>488T[[%677 	> !5!<==	>s   "% =c                 \   || j                   j                  dd      v rw| j                   d   }| j                   d   }| j                   d   }||   |i} |j                  |j                  j                  |j                  k(        j
                  di | y t        j                  | ||       y )Nra   r   r^   rA   r8   )__dict__rH   updaterW   r1   executeobject__setattr__)r+   rJ   valuer^   rA   r8   paramss          r   rh   zRowAdapter.__setattr__   s     4==$$\266--&CMM'*E]]8,FTlE*F6ELLsvv-.66@@ 4u-r   c           
          dt        | j                        dt        | j                        dt        | j                        dt	        |       d	S )Nz<RowAdapter(row=, table=rM   r/   r0   )rO   r^   rA   r8   r1   r2   s    r   r3   zRowAdapter.__repr__   s5    $((^T$**-tDKK/@"T(L 	Lr   r)   )r   r   r   r   r,   rK   rh   r3   r   r   r   r\   r\      s    3	.>..Lr   r\   c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
ResultAdapterz,Adapter for a SQLAlchemy ResultProxy object.Nc                 6    || _         || _        |i }|| _        y r)   )resultrA   r8   )r+   rp   rA   r8   s       r   r,   zResultAdapter.__init__   s!    
>Fr   c                     t        |       S r)   )lenr2   s    r   countzResultAdapter.count   s    4yr   c                 b    | j                   j                  dk(  ry| j                   j                  S )Nr   )rp   rowcountr2   s    r   __len__zResultAdapter.__len__   s'    ;;2%{{###r   c                    t        | j                        }||   }t        |t              s"t	        || j
                  | j                        S |D cg c]$  }t	        || j
                  | j                        & c}S c c}w Nr7   )r_   rp   
isinstanceslicer\   rA   r8   )r+   r:   rlistresxs        r   r;   zResultAdapter.__getitem__   sm    T[[!Cj#u%c4::dkkBB !" q$**T[[A " " "s   )A=c              #   v   K   | j                   D ]&  }t        || j                  | j                         ( y wry   )rp   r\   rA   r8   )r+   items     r   __iter__zResultAdapter.__iter__   s2     KK 	CDT4::dkkBB	Cs   79c           
          dt        | j                        dt        | j                        dt        | j                        dt	        |       d	S )Nz<ResultAdapter(result=rl   rM   r/   r0   )rO   rp   rA   r8   r1   r2   s    r   r3   zResultAdapter.__repr__   s5    $++TZZ 0$++4* 	*r   r)   )
r   r   r   r   r,   rs   rw   r;   r   r3   r   r   r   rn   rn      s$    6$	"C*r   rn   c                   R    e Zd ZdZddZddZd ZddZddZddZ	dd	Z
d
 Zd Zy)TableAdapterzBAdapter for a SQLAlchemy Table object, to mimic a SQLObject class.Nc                 z   || _         |j                  | _        || _        i | _        g }|j
                  D ]  }ddi}|j                  |j                         |j                  dk(  rd|d<   d|v r|d    |d<   |d= t        |j                        }|| j                  |j                  <   t        |j                     }i }d|v r|d   |d<   |d=  |d
i |}	d|v r|d= t        ||	fi |}
|j                  |
        t        |j                        | _        t        | j                  t         g| | _        | j"                  j%                         | _        | j"                  j(                  | _        t-        | j"                  | j                        | _        t1        | j"                  | j                        | _        y	)z!Initialize a TableAdapter object.nullableTr1   primary_keynotNonelengthalternateIDr7   Nr   )_imdbpySchemarJ   _imdbpyNameconnectionURIr8   colsre   rj   r%   MAP_COLSkindColumnappendr   	tableNameTablemetadatarA   insert
_ta_insertselect
_ta_selectrS   qr>   sqlmeta)r+   rA   urirE   colrj   r$   colClasscolKindParamscolKindcolObjs              r   r,   zTableAdapter.__init__   s   " :: :: 	#C $'FMM#**%xx4(,}%F")/	):%:z"9%!#((+E$)DKK!)HM6!*0*:h'8$//G&=)E75f5FNN6"-	#. &ejj14>>8>g>
**++-**++$**T[[9%djjEr   c                     | j                  |      j                         }t        || j                  | j                        S )zReturn a list of results.r7   )r   rf   rn   rA   r8   )r+   
conditionsrp   s      r   r   zTableAdapter.select  s0    ,446VTZZDDr   c                     | j                  | j                  j                  j                  |k(        }	 |d   S # t        $ r t        d|z        w xY w)zGet an object given its ID.r   zno data for ID %s)r   rA   rW   r1   
IndexErrorr   )r+   theIDrp   s      r   rH   zTableAdapter.get  sP    TZZ\\__56	=!9 	= 3e ;<<	=s	   9 Ac                    d|i}| j                   j                  j                  j                  j                  j                  d      r|d= 	  | j                   j                  di | y# t        j                  $ rG | j                   j                  j                  j                  j                  j                  d      s Y yw xY w)zDrop the table.
checkfirstibm_dbNr   )	rA   bindengineurl
drivernamer   dropr	   ProgrammingError)r+   r   
dropParamss      r   	dropTablezTableAdapter.dropTable(  s    "J/
::??!!%%00;;HE<(	DJJOO)j)## 	::??))--88CCHM N	s   A) )ACCc                     | j                   j                  |       | j                  j                  D ]B  }|j                  dk(  r|j
                  j                  dd      s0| j                  ||       D y)zCreate the table.r   r1   r   FN)rA   creater   r   rJ   rj   rH   _createIndex)r+   r   r   s      r   createTablezTableAdapter.createTable5  sh    

Z0 %%** 	>Cxx4zz~~mU3!!#*!=		>r   c           	         | j                   j                  d|j                  xs |j                  }|r,| j                   j                  D ]  }|j                  |k(  s y i }| j                  j                  d      r`|j                  r|j                  |d<   nD|j                  t        t        fv r,t        d|j                  j                  d      xs d      |d<   t        |t        | j                   j                  | j                   |j                           fi |}	 |j#                          y# t$        j&                  $ rF}t(        j+                  d| j,                  j                   d|j                  d	|       Y d}~yd}~ww xY w)
z,Create an index for a given (schema) column.r   Nmysqlmysql_length   r   zSkipping creation of the .z index: )rA   rJ   indexindexesr   r   indexLenr   
UNICODECOL	STRINGCOLminrj   rH   IndexrG   rW   r8   r   r	   OperationalError_alchemy_loggerwarnr   )r+   r   r   idx_namer   
index_argsidxes           r   r   zTableAdapter._createIndex@  s8   "jjoosyy/DCHH/DE++ ::) 
((1||-0\\
>*j)44-0CJJNN84L4QPQ-R
>*HgdjjllDKK4IJYjY	DJJL## 	D  "&,,"4"4chh"C D D	Ds   "D3 3F<FFc                 z    | j                   j                  D ]"  }|j                  s| j                  ||       $ y)zCreate all required indexes.r   N)r   r   r   r   )r+   ifNotExistsr   s      r   
addIndexeszTableAdapter.addIndexesY  s7    %%** 	?Cyy!!#+!>	?r   c                     i }t        |j                               D ]$  \  }}||| j                  j                  ||      <   &  | j                  j
                  |i | y)z?To insert a new row with the syntax: TableClass(key=value, ...)N)r_   itemsr8   rH   r   rf   )r+   argskwdstaArgsr:   ri   s         r   __call__zTableAdapter.__call___  sW    tzz|, 	6JC05F4;;??3,-	600r   c                 L    dt        | j                        dt        |       dS )Nz<TableAdapter(table=r/   r0   )rO   rA   r1   r2   s    r   r3   zTableAdapter.__repr__f  s    59$**5Er$xPPr   r)   )T)r   r   r   r   r,   r   rH   r   r   r   r   r   r3   r   r   r   r   r      s7    L%FNE
=	>D2?1Qr   r   c                     g }t         D ]g  }|j                  t        v r#|j                  t        |j                            8t	        ||       }|j                  |       |t        |j                  <   i |S )zReturn a list of TableAdapter objects to be used to access the
    database through the SQLAlchemy ORM.  The connection uri is optional, and
    can be used to tailor the db schema to specific needs.)	DB_SCHEMArJ   TABLES_REPOSITORYr   r   )r   	DB_TABLESrA   tableAdapters       r   getDBTablesr   q  sq     I 5::**.uzz:;#E3/&(4%**%5 r   c                      t        |  S )zEmulate SQLObject's AND.)and_rj   s    r   ANDr     s    =r   c                      t        |  S )zEmulate SQLObject's OR.)or_r   s    r   ORr     s    <r   c                     t        | t        j                        st        |D cg c]  }|| k(  	 c} S | j	                  |      S c c}w )zEmulate SQLObject's IN.)rz   r   r   r   in_)r   inListr~   s      r   INr     s>    dFMM*v.!AI.//xx /s   Ac                 
    | du S )zEmulate SQLObject's ISNULL.Nr   r~   s    r   ISNULLr     s     9r   c                 
    | duS )zEmulate SQLObject's ISNOTNULL.Nr   r   s    r   	ISNOTNULLr     s    D=r   c                 *    | j                  d|z        S )z#Emulate SQLObject's CONTAINSSTRING.z%%%s%%)like)exprpatterns     r   CONTAINSSTRINGr     s    99X'((r   c                     | S )zFor some strange reason, sometimes SQLObject wants utf8 strings
    instead of unicode; with SQLAlchemy we just return the unicode text.r   )ss    r   toUTF8r     s	     Hr   c                       e Zd ZdZd Zd Zy)_AlchemyConnectionzVA proxy for the connection object, required since _ConnectionFairy
    uses __slots__.c                     || _         y r)   )conn)r+   r   s     r   r,   z_AlchemyConnection.__init__  s	    	r   c                 .    t        | j                  |      S r)   )rG   r   rI   s     r   rK   z_AlchemyConnection.__getattr__  s    tyy$''r   N)r   r   r   r   r,   rK   r   r   r   r   r     s    (r   r   c                   
 d|i}| j                  d      rd| v r| dz  } n| dz  } | d|z  z  } |rd|d<   | j                  d      rd|d	<   t        | fi |}|t        _        |j	                         }| j                  d
      rTt
        j                  d   }t
        j                  d   }|dkD  s
|dk(  r$|dkD  rt        |j                  j                  _	        t        |j                        
|j                  j                  }	|j                  j                  
_        |	
_        
fd
_        |j                   j"                  
_        
S )zSet connection for every table.encodingr   ?&z
charset=%sTechor   convert_unicodesqliter   r      r   c                       j                   S r)   
connectionr   s   r   <lambda>zsetConnection.<locals>.<lambda>  s    z'<'< r   )r   create_enginer   r   connectsysversion_infostrr  text_factoryr   dialect
paramstyledbapimodulegetConnectionr   r   r*   )r   tablesr   debugrj   r   eng_connmajorminorr
  r  s             @r   setConnectionr    s:   (#F ~~g#:3JC3JC|h&&v
~~h$( !3)&)FHM~~H
~~h  #  #19!	:=H**7 $H$7$78J!!,,J ((..J&J<J

--Jr   r)   )utf8F)6r   
__future__r   r   r   r   rer  logging
sqlalchemyr   r	   ImportErrorr
   imdb._exceptionsr   imdb.parser.sql.loggingr   dbschemagetChildr   compiler   MetaDatar   INTCOLIntegerr   UnicodeTextr   Stringr   r   r   r%   rg   r'   r5   r>   rS   r\   rn   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   <module>r$     sF  " S R 	 
   - 1 * !&//), 2::j! : Gv	' 	J JK K<V <2<v <*.L .Lb&*F &*R|Q6 |QF   

 
)
	( 	('q  -,-s   C: :DD