Ë
    "ïàj'P  ã                   ó¾   — d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
mZmZ ddlmZmZ dZ ej"                  e«      Zd„ Z G d	„ d
e«      Z G d„ de«      Zy)ao  
Implementation of a WebDAV provider that provides a very basic, read-only
resource layer emulation of a MySQL database.

This module is specific to the WsgiDAV application. It provides a
classes ``MySQLBrowserProvider``.

Usage::

    (see docs/sample_wsgidav.yaml)
    MySQLBrowserProvider(host, user, passwd, db)

    host - host of database server
    user - user_name to access database
    passwd - passwd to access database
    db - name of database on database server

The ``MySQLBrowserProvider`` provides a very basic, read-only
resource layer emulation of a MySQL database.
It provides the following interface:

    - the root collection shared consists of collections that correspond to
      table names

    - in each table collection, there is a resource called "_ENTIRE_CONTENTS".
      This is a non-collection resource that returns a csv representation of the
      entire table

    - if the table has a single primary key, each table record will also appear
      as a non-collection resource in the table collection using the primary key
      value as its name. This resource returns a csv representation of the record
      and will also include the record attributes as live properties with
      attribute name as property name and table name suffixed with colon as the
      property namespace


This is a very basic interface and below is a by no means thorough summary of
its limitations:

    - Really only supports having numbers or strings as primary keys. The code uses
      a numeric or string comparison that may not hold up if the primary key is
      a date or some other datatype.

    - There is no handling for cases like BLOBs as primary keys or such. Well, there is
      no handling for BLOBs in general.

    - When returning contents, it buffers the entire contents! A bad way to return
      large tables. Ideally you would have a FileMixin that reads the database even
      as the application reads the file object....

    - It takes too many database queries to return information.
      Ideally there should be some sort of caching for metadata at least, to avoid
      unnecessary queries to the database.

é    N)ÚStringIO)Úutil)ÚHTTP_FORBIDDENÚDAVErrorÚ#PRECONDITION_CODE_ProtectedProperty)ÚDAVProviderÚ_DAVResourceÚreStructuredTextc                 ó&   — | j                  dd«      S )z7Escape MySQL identifier (table, column, database name).ú`z``)Úreplace)Ú
identifiers    úQ/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/samples/mysql_dav_provider.pyÚ
_escape_idr   R   s   € à×Ñ˜c 4Ó(Ð(ó    c                   ó€   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zdd„Zˆ xZS )ÚMySQLBrowserResourcezlRepresents a single existing DAV resource instance.

    See also DAVResource and MySQLBrowserProvider.
    c                 ó6   •— t         ‰| �  |||«       d | _        y ©N)ÚsuperÚ__init__Ú_cache)ÚselfÚproviderÚpathÚis_collectionÚenvironÚ	__class__s        €r   r   zMySQLBrowserResource.__init__]   s   ø€ Ü‰Ñ˜˜}¨gÔ6Øˆ�r   c           
      óH  — | j                   xj                  dz  c_        | j                   j                  | j                  «      \  }}d}d}d}|€d}n|€d}nd}|d	k(  rd
}d}nd}d}|du }d|t	        j                  «       | j
                  t        j                  «       j                  | j                  «      j                  «       dd||dœdœ| _
        |s!t	        j                  «       | j                  d<   t        j                  d| j                   j                  z  «       y)zhRead resource information into self._cache, for cached access.

        See DAVResource._init()
        é   ÚUnknownÚ z	text/htmlNÚDatabasezDatabase Tableztext/csvÚ_ENTIRE_CONTENTSzDatabase Table Contentsz$CSV Representation of Table ContentszDatabase Recordz"Attributes available as propertiesF)ÚtypeÚtypeComment)Úcontent_lengthÚcontentTypeÚcreatedÚdisplay_nameÚetagÚmodifiedÚsupport_rangesÚdisplay_infor,   z---> _init, nc=%s)r   Ú_count_get_resource_inst_initÚ_split_pathr   ÚtimeÚnameÚhashlibÚmd5ÚupdateÚ	hexdigestr   Ú_loggerÚdebugÚ_count_initConnection)r   Ú	tableNameÚprimKeyÚdisplay_typeÚdisplayTypeCommentr(   r   s          r   Ú_initzMySQLBrowserResource._inita   s  € ð 	�‰×3Ò3°qÑ8Õ3Ø!Ÿ]™]×6Ñ6°t·y±yÓAÑˆ	�7à ˆØÐØ!ˆð ÐØ%‰LØˆ_Ø+‰Là$ˆKØÐ,Ò,Ø8�Ø%KÑ"à0�Ø%IÐ"ð   4˜ˆð #Ø&Ü—y‘y“{Ø ŸI™IÜ—K‘K“M×(Ñ(¨¯©Ó3×=Ñ=Ó?àØ#Ø%1ÐBTÑUñ

ˆŒñ Ü&*§i¡i£kˆD�K‰K˜
Ñ#Ü�‰Ð)¨D¯M©M×,OÑ,OÑOÕPr   c                 óp   — | j                   €| j                  «        | j                   j                  |«      S r   )r   r>   Úget)r   Úinfos     r   Ú	_get_infozMySQLBrowserResource._get_info‘   s(   € Ø�;‰;ÐØ�J‰JŒLØ�{‰{�‰˜tÓ$Ð$r   c                 ó$   — | j                  d«      S )Nr'   ©rB   ©r   s    r   Úget_content_lengthz'MySQLBrowserResource.get_content_length—   s   € Ø�~‰~Ð.Ó/Ð/r   c                 ó$   — | j                  d«      S )Nr(   rD   rE   s    r   Úget_content_typez%MySQLBrowserResource.get_content_typeš   s   € Ø�~‰~˜mÓ,Ð,r   c                 ó$   — | j                  d«      S )Nr)   rD   rE   s    r   Úget_creation_datez&MySQLBrowserResource.get_creation_date�   s   € Ø�~‰~˜iÓ(Ð(r   c                 ó   — | j                   S r   )r2   rE   s    r   Úget_display_namez%MySQLBrowserResource.get_display_name    s   € Ø�y‰yÐr   c                 ó$   — | j                  d«      S )Nr.   rD   rE   s    r   Úget_display_infoz%MySQLBrowserResource.get_display_info£   s   € Ø�~‰~˜nÓ-Ð-r   c                 ó$   — | j                  d«      S )Nr+   rD   rE   s    r   Úget_etagzMySQLBrowserResource.get_etag¦   s   € Ø�~‰~˜fÓ%Ð%r   c                 ó$   — | j                  d«      S )Nr,   rD   rE   s    r   Úget_last_modifiedz&MySQLBrowserResource.get_last_modified©   s   € Ø�~‰~˜jÓ)Ð)r   c           
      óˆ  — g }| j                   j                  «       }	 | j                   j                  | j                  «      \  }}|€r| j                   j	                  |«      }|D ]Q  }|j                  t        | j                   t        j                  | j                  |«      d| j                  «      «       ŒS nã|€á| j                   j                  ||«      }|�s| j                   j                  |||«      }|D ]Q  }|j                  t        | j                   t        j                  | j                  |«      d| j                  «      «       ŒS |j                  dt        | j                   t        j                  | j                  d«      d| j                  «      «       |j                  «        |S # |j                  «        w xY w)zyReturn list of (direct) collection member names (UTF-8 byte strings).

        See DAVResource.get_member_list()
        TFr   r$   )r   Ú_init_connectionr0   r   Ú_list_tablesÚappendr   r   Újoin_urir   Ú_find_primary_keyÚ_list_fieldsÚinsertÚclose)r   ÚmembersÚconnr:   r;   Úretlistr2   Úpri_keys           r   Úget_member_listz$MySQLBrowserResource.get_member_list¬   sx  € ð
 ˆØ�}‰}×-Ñ-Ó/ˆð$	Ø!%§¡×!:Ñ!:¸4¿9¹9Ó!EÑˆI�wØÐ ØŸ-™-×4Ñ4°TÓ:�Ø#ò �DØ—N‘NÜ,Ø ŸM™MÜ ŸM™M¨$¯)©)°TÓ:Ø Ø ŸL™Ló	õñð �ØŸ-™-×9Ñ9¸$À	ÓJ�ØÐ&Ø"Ÿm™m×8Ñ8¸¸yÈ'ÓR�GØ 'ò ˜ØŸ™Ü0Ø $§¡Ü $§¡¨d¯i©i¸Ó >Ø %Ø $§¡ó	õðð —‘ØÜ(ØŸ™ÜŸ™ d§i¡iÐ1CÓDØØŸ™ó	ôð �J‰JŒLØˆøð �J‰J�Lús   žE?F/ Æ/Gc                 óN  — t        «       }| j                  j                  | j                  «      \  }}|��^| j                  j	                  «       }| j                  j                  ||«      }t        j                  ||d¬«      }i }|D ]  }|||<   Œ	 |j                  |«       |dk(  r¬|j                  t        j                  j                  «      }	dj                  t        | j                  j                  «      t        |«      ¬«      }
|	j!                  |
«       |	j#                  «       }|D ]  }|j                  |«       Œ |	j%                  «        n0| j                  j'                  |||«      }|�|j                  |«       |j%                  «        |j)                  d«       |S )zUOpen content as a stream for reading.

        See DAVResource.get_content()
        Úignore)Úextrasactionr$   zSELECT * FROM `{db}`.`{table}`)ÚdbÚtabler   )r   r   r0   r   rT   Ú_get_field_listÚcsvÚ
DictWriterÚwriterowÚcursorÚMySQLdbÚcursorsÚ
DictCursorÚformatr   Ú_dbÚexecuteÚfetchallr[   Ú_get_record_by_primary_keyÚseek)r   Ú
filestreamr:   r;   r]   Ú
listFieldsÚ	csvwriterÚ
dictFieldsÚ
field_namerj   ÚsqlÚ
result_setÚrows                r   Úget_contentz MySQLBrowserResource.get_contentÚ   sn  € ô
 “Zˆ
à!Ÿ]™]×6Ñ6°t·y±yÓAÑˆ	�7ØÑØ—=‘=×1Ñ1Ó3ˆDØŸ™×6Ñ6°t¸YÓGˆJÜŸ™ z°:ÈHÔUˆIØˆJØ(ò 4�
Ø)3�
˜:Ò&ð4à×Ñ˜zÔ*àÐ,Ò,ØŸ™¤W§_¡_×%?Ñ%?Ó@�Ø7×?Ñ?Ü! $§-¡-×"3Ñ"3Ó4Ü$ YÓ/ð @ó �ð —‘˜sÔ#Ø#Ÿ_™_Ó.�
Ø%ò ,�CØ×&Ñ& sÕ+ð,à—‘•à—m‘m×>Ñ>¸tÀYÐPWÓX�Ø�?Ø×&Ñ& sÔ+Ø�J‰JŒLð
 	�‰˜ÔØÐr   c                óD  •— t         ‰| �  |¬«      }| j                  j                  | j                  «      \  }}|�d| j                  j                  «       }| j                  j                  ||«      }|D ]  }|j                  d|› d|› �«       Œ |j                  «        |S )zìReturn list of supported property names in Clark Notation.

        Return supported live and dead properties. (See also DAVProvider.get_property_names().)

        In addition, all table field names are returned as properties.
        )Ú
is_allpropú{z:})	r   Úget_property_namesr   r0   r   rT   rf   rV   r[   )	r   r~   Ú	propNamesr:   r;   r]   Ú	fieldlistÚ	fieldnamer   s	           €r   r€   z'MySQLBrowserResource.get_property_names  s�   ø€ ô ‘GÑ.¸*Ð.ÓEˆ	à!Ÿ]™]×6Ñ6°t·y±yÓAÑˆ	�7ØÐØ—=‘=×1Ñ1Ó3ˆDØŸ™×5Ñ5°d¸IÓFˆIØ&ò A�	Ø× Ñ  2 i [°°I°;Ð!?Õ@ðAà�J‰JŒLØÐr   c                 óª  •— | j                   j                  | j                  «      \  }}|�št        j                  |«      \  }}||dz   k(  rz| j                   j                  «       }| j                   j                  ||«      }||v r0| j                   j                  ||||«      }|j                  «        |S |j                  «        t        ‰	| �)  |«      S )aÎ  Return the value of a property.

        The base implementation handles:

        - ``{DAV:}lockdiscovery`` and ``{DAV:}supportedlock`` using the
          associated lock manager.
        - All other *live* properties (i.e. name starts with ``{DAV:}``) are
          delegated to self.getLivePropertyValue()
        - Finally, other properties are considered *dead*, and are handled  using
          the associated property manager, if one is present.
        ú:)r   r0   r   r   Úsplit_namespacerT   rf   Ú_get_field_by_primary_keyr[   r   Úget_property_value)
r   r2   r:   r;   ÚnsÚ	localNamer]   r‚   Úvalr   s
            €r   rˆ   z'MySQLBrowserResource.get_property_value  s¾   ø€ ð "Ÿ]™]×6Ñ6°t·y±yÓAÑˆ	�7ØÐÜ ×0Ñ0°Ó6‰MˆB�	Ø�i #‘oÒ&Ø—}‘}×5Ñ5Ó7�Ø ŸM™M×9Ñ9¸$À	ÓJ�	Ø 	Ñ)ØŸ-™-×AÑAØ˜i¨°)ó�Cð —J‘J”LØ�JØ—
‘
”ä‰wÑ)¨$Ó/Ð/r   c                 ó,   — t        t        t        ¬«      ‚)zTSet or remove property value.

        See DAVResource.set_property_value()
        )Úerr_condition)r   r   r   )r   r2   ÚvalueÚdry_runs       r   Úset_property_valuez'MySQLBrowserResource.set_property_value2  s   € ô
 ÜÔ*Mô
ð 	
r   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r>   rB   rF   rH   rJ   rL   rN   rP   rR   r`   r|   r€   rˆ   r�   Ú__classcell__©r   s   @r   r   r   W   sW   ø„ ñô
ò.Qò`%ò0ò-ò)òò.ò&ò*ò,ò\&ôPô&0÷:
r   r   c                   ór   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚMySQLBrowserProviderc                 óh   •— t         ‰| �  «        || _        || _        || _        || _        d| _        y )Nr   )r   r   Ú_hostÚ_userÚ_passwdro   r9   )r   ÚhostÚuserÚpasswdrd   r   s        €r   r   zMySQLBrowserProvider.__init__B  s2   ø€ Ü‰ÑÔØˆŒ
ØˆŒ
ØˆŒØˆŒØ%&ˆÕ"r   c                 ó‚   — | j                   j                  › d| j                  › d| j                  › d| j                  › d�S )Nz	 for db 'z' on 'z
' (user: 'z')')r   r‘   ro   rš   r›   rE   s    r   Ú__repr__zMySQLBrowserProvider.__repr__J  s=   € Ø—.‘.×)Ñ)Ð*¨)°D·H±H°:¸VÀDÇJÁJÀ<ÈzÐZ^×ZdÑZdÐYeÐehÐiÐir   c                 ó‚   — |j                  «       dv ryt        j                  |j                  d«      dd«      \  }}||fS )z8Return (tableName, primaryKey) tuple for a request path.)Nr"   ú/)NNr£   r    )Ústripr   Ú
save_split)r   r   r:   r;   s       r   r0   z MySQLBrowserProvider._split_pathM  s=   € à�:‰:‹<˜?Ñ*ØÜ!Ÿ_™_¨T¯Z©Z¸«_¸cÀ1ÓEÑˆ	�7à˜7Ð#Ð#r   c                 ó®   — | xj                   dz  c_         t        j                  | j                  | j                  | j
                  | j                  ¬«      S )Nr    )r�   rž   rŸ   rd   )r9   rk   Úconnectrš   r›   rœ   ro   rE   s    r   rT   z%MySQLBrowserProvider._init_connectionU  s=   € Ø×"Ò" aÑ'Õ"Ü�‰Ø—‘ $§*¡*°T·\±\ÀdÇhÁhô
ð 	
r   c                 ó  — g }|j                  t        j                  j                  «      }|j	                  dt        |«      z  «       |j                  «       }|D ]  }|j                  |d   «       Œ |j                  «        |S )NúDESCRIBE `%s`ÚField)	rj   rk   rl   rm   rp   r   rq   rV   r[   )r   r]   Ú
table_namer^   rj   rz   r{   s          r   rf   z$MySQLBrowserProvider._get_field_list[  sn   € ØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ�‰�¬°JÓ)?Ñ?Ô@Ø—_‘_Ó&ˆ
Øò 	)ˆCØ�N‰N˜3˜w™<Õ(ð	)à�‰ŒØˆr   c                 óf   — |€yg d¢}|j                  «       }|D ]  }|j                  |«      sŒ y y)NF)ÚBIGINTÚINTTÚ	MEDIUMINTÚSMALLINTÚTINYINTÚBITÚDECÚDECIMALÚDOUBLEÚFLOATÚREALzDOUBLE PRECISIONÚINTEGERÚNUMERICT)ÚupperÚ
startswith)r   ÚdatatypeÚnumerictypesÚnumtypes       r   Ú_is_data_type_numericz*MySQLBrowserProvider._is_data_type_numerice  sE   € ØÐØò
ˆð  —>‘>Ó#ˆØ#ò 	ˆGØ×"Ñ" 7Õ+Ùð	ð r   c                 óV  — d }|j                  t        j                  j                  «      }|j	                  dt        |«      z  «       |j                  «       }|D ]  }|d   dk(  sŒ|€|d   }Œ y |j                  «        |j                  t        j                  j                  «      }dj                  t        |«      t        | j                  «      t        |«      ¬«      }|j	                  ||f«       |j                  «       }|€|j                  «        y|j                  «        y)	Nr©   ÚKeyÚPRIrª   Fz?SELECT `{pri_key}` FROM `{db}`.`{table}` WHERE `{pri_key}` = %s)r_   rd   re   T)rj   rk   rl   rm   rp   r   rq   r[   rn   ro   Úfetchone)	r   r]   r«   Úpri_key_valuer_   rj   rz   r{   ry   s	            r   Ú_exists_record_by_primary_keyz2MySQLBrowserProvider._exists_record_by_primary_key  sÿ   € ØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ�‰�¬°JÓ)?Ñ?Ô@Ø—_‘_Ó&ˆ
Øò 	!ˆCØ�5‰z˜UÓ"Ø�?Ø! '™l‘Gá ð	!ð 	�‰Œà—‘œWŸ_™_×7Ñ7Ó8ˆàMß
‰&Ü˜wÓ'Ü˜$Ÿ(™(Ó#Ü˜ZÓ(ð ó 
ð 	ð 	�‰�s˜]Ð,Ô-Ø�o‰oÓˆØˆ;Ø�L‰LŒNØØ�‰ŒØr   c                 óœ  — d }|j                  t        j                  j                  «      }|j	                  dt        |«      z  «       |j                  «       }|D ]  }|d   dk(  sŒ|€|d   }Œ y  |j                  «        |j                  t        j                  j                  «      }dj                  t        |«      t        | j                  «      t        |«      t        |«      ¬«      }	|j	                  |	|f«       |j                  «       }|€|j                  «        y t        j                  ||   «      }
|j                  «        |
S )Nr©   rÁ   rÂ   rª   z=SELECT `{field}` FROM `{db}`.`{table}` WHERE `{pri_key}` = %s)Úfieldrd   re   r_   )rj   rk   rl   rm   rp   r   rq   r[   rn   ro   rÃ   r   Úto_str)r   r]   r«   rÄ   rx   r_   rj   rz   r{   ry   r‹   s              r   r‡   z.MySQLBrowserProvider._get_field_by_primary_keyœ  s  € ØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ�‰�¬°JÓ)?Ñ?Ô@Ø—_‘_Ó&ˆ
Øò 	 ˆCØ�5‰z˜UÓ"Ø�?Ø! '™l‘Gáð	 ð 	�‰Œà—‘œWŸ_™_×7Ñ7Ó8ˆØN×VÑVÜ˜ZÓ(Ü˜$Ÿ(™(Ó#Ü˜ZÓ(Ü˜wÓ'ð	 Wó 
ˆð 	�‰�s˜]Ð,Ô-Ø�o‰oÓˆØˆ;Ø�L‰LŒNØÜ�k‰k˜#˜j™/Ó*ˆØ�‰ŒØˆ
r   c                 ó¼  — i }d }|j                  t        j                  j                  «      }|j	                  dt        |«      z  «       |j                  «       }|D ]  }|d   dk(  sŒ|€|d   }Œ y  |j                  «        |j                  t        j                  j                  «      }dj                  t        | j                  «      t        |«      t        |«      ¬«      }	|j	                  |	|f«       |j                  «       }|€|j                  «        y |j                  «       D ]  }
t        j                  ||
   «      ||
<   Œ |j                  «        |S )Nr©   rÁ   rÂ   rª   z5SELECT * FROM `{db}`.`{table}` WHERE `{pri_key}` = %s)rd   re   r_   )rj   rk   rl   rm   rp   r   rq   r[   rn   ro   rÃ   Úkeysr   rÈ   )r   r]   r«   rÄ   ÚdictRetr_   rj   rz   r{   ry   Úfnames              r   rr   z/MySQLBrowserProvider._get_record_by_primary_key¹  s0  € ØˆØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ�‰�¬°JÓ)?Ñ?Ô@Ø—_‘_Ó&ˆ
Øò 	 ˆCØ�5‰z˜UÓ"Ø�?Ø! '™l‘Gáð	 ð 	�‰Œà—‘œWŸ_™_×7Ñ7Ó8ˆØF×NÑNÜ˜$Ÿ(™(Ó#Ü˜ZÓ(Ü˜wÓ'ð Oó 
ˆð
 	�‰�s˜]Ð,Ô-Ø�o‰oÓˆØˆ;Ø�L‰LŒNØØ—X‘X“Zò 	5ˆEÜ!Ÿ[™[¨¨U©Ó4ˆG�EŠNð	5à�‰ŒØˆr   c                 ó  — d }|j                  t        j                  j                  «      }|j	                  dt        |«      z  «       |j                  «       }|D ]  }|d   }|d   }|dk(  sŒ|€|}Œ y  |j                  «        |S )Nr©   rª   rÁ   rÂ   )rj   rk   rl   rm   rp   r   rq   r[   )	r   r]   r«   r_   rj   rz   r{   rƒ   Úkeyvalues	            r   rX   z&MySQLBrowserProvider._find_primary_key×  s‡   € ØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ�‰�¬°JÓ)?Ñ?Ô@Ø—_‘_Ó&ˆ
Øò 	 ˆCØ˜G™ˆIØ˜5‘zˆHØ˜5Ó Ø�?Ø'‘Gáð	 ð 	�‰ŒØˆr   c                 óŒ  — g }|j                  t        j                  j                  «      }dj	                  t        |«      t        | j                  «      t        |«      ¬«      }|j                  |«       |j                  «       }|D ])  }|j                  t        j                  ||   «      «       Œ+ |j                  «        |S )Nz&SELECT `{field}` FROM `{db}`.`{table}`)rÇ   rd   re   )rj   rk   rl   rm   rn   r   ro   rp   rq   rV   r   rÈ   r[   )	r   r]   r«   rx   r^   rj   ry   rz   r{   s	            r   rY   z!MySQLBrowserProvider._list_fieldsç  s¡   € ØˆØ—‘œWŸ_™_×7Ñ7Ó8ˆØ7×?Ñ?Ü˜ZÓ(Ü˜$Ÿ(™(Ó#Ü˜ZÓ(ð @ó 
ˆð
 	�‰�sÔØ—_‘_Ó&ˆ
Øò 	9ˆCØ�N‰Nœ4Ÿ;™; s¨:¡Ó7Õ8ð	9à�‰ŒØˆr   c                 óÈ   — g }|j                  «       }|j                  d«       |j                  «       }|D ]  }|j                  d|d   z  «       Œ |j	                  «        |S )NzSHOW TABLESz%sr   )rj   rp   rq   rV   r[   )r   r]   r^   rj   rz   r{   s         r   rU   z!MySQLBrowserProvider._list_tablesö  s[   € ØˆØ—‘“ˆØ�‰�}Ô%Ø—_‘_Ó&ˆ
Øò 	,ˆCØ�N‰N˜4 3 q¡6™?Õ+ð	,à�‰ŒØˆr   c                 óž   — | xj                   dz  c_         | j                  ||«      sy| j                  |«      \  }}|du }t        | |||«      S )zJReturn info dictionary for path.

        See get_resource_inst()
        r    N)Ú_count_get_resource_instÚexistsr0   r   )r   r   r   Ú
_tableNamer;   r   s         r   Úget_resource_instz&MySQLBrowserProvider.get_resource_inst   sU   € ð 	×%Ò%¨Ñ*Õ%Ø�{‰{˜4 Ô)ØØ"×.Ñ.¨tÓ4Ñˆ
�GØ 4˜ˆÜ# D¨$°¸wÓGÐGr   c                 ó^  — | j                  |«      \  }}|€y	 d }| j                  «       }| j                  |«      }||vr	 |r|j                  «        yy|r+|dk7  r&| j	                  |||«      |r|j                  «        S S 	 |r|j                  «        yy# r|j                  «        w w xY w)NTFr$   )r0   rT   rU   r[   rÅ   )r   r   r   r:   r;   r]   Útbllists          r   rÓ   zMySQLBrowserProvider.exists  sÀ   € Ø!×-Ñ-¨dÓ3Ñˆ	�7ØÐØð	ØˆDØ×(Ñ(Ó*ˆDà×'Ñ'¨Ó-ˆGØ Ñ'Øñ Ø—
‘
•ð ñ	 ˜7Ð&8Ò8Ø×9Ñ9¸$À	È7ÓSñ Ø—
‘
•ð ð áØ—
‘
•ð ø‰tØ—
‘
•ð ús   ™'B ÁB ÂB,c                 óZ   — | j                  |«      \  }}| j                  ||«      xr |d u S r   )r0   rÓ   )r   r   r   rÔ   r;   s        r   r   z"MySQLBrowserProvider.is_collection#  s1   € Ø"×.Ñ.¨tÓ4Ñˆ
�GØ�{‰{˜4 Ó)Ò=¨g¸¨oÐ=r   )r‘   r’   r“   r   r¡   r0   rT   rf   r¿   rÅ   r‡   rr   rX   rY   rU   rÕ   rÓ   r   r•   r–   s   @r   r˜   r˜   A  sP   ø„ ô'òjò$ò
òòò4ò:ò:ò<ò òòHòö(>r   r˜   )r”   rg   r3   r1   Úior   rk   Úwsgidavr   Úwsgidav.dav_errorr   r   r   Úwsgidav.dav_providerr   r	   Ú__docformat__Úget_module_loggerr‘   r7   r   r   r˜   © r   r   ú<module>rà      sg   ðñ6ót Û Û Ý ã å ÷ñ ÷
 ;à"€à
 ˆ$×
 Ñ
  Ó
*€ò)ô
b
˜<ô b
ôTd>˜;õ d>r   