B
    ž3RcÌ  ã            	   @   sÀ  d Z ddlZddlmZ G dd„ deƒZG dd„ deƒZG dd	„ d	eƒZed
kr¼ddl	m
Z
 e
dƒZe ¡ Zedeeƒƒ e d¡ eeƒZx>edƒD ]2Zyee ZW q˜ ek
rÈ   edksÄt‚Y q˜X q˜W edƒ e ¡ Ze d¡ eeƒZxeeeƒƒD ]Zee ZqþW edƒ e ¡ Ze d¡ eeƒZxeD ]Ze\ZZq6W edƒ e ¡ Ze d¡ eeƒZg ZxeD ]Ze e¡ qtW eeƒdksšt‚e ¡ Ze d¡ eeddZg ZxeD ]Ze e¡ qÂW eeƒdksèt‚e ¡ Ze d¡ eeddZeeƒdkst‚ed dks*t‚e ¡ Ze d¡ eeddZed dksZt‚ed dkslt‚ed dks~t‚e ¡ Ze d¡ eeƒZed dksªt‚ed dks¼t‚dS )z¤ defines class _DbResultSet_ for lazy interactions with Db query results

**Note**

  this uses the Python iterator interface, so you'll need python 2.2 or above.

é    N)ÚDbInfoc               @   sF   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dS )ÚDbResultBaseéÿÿÿÿNc             C   s@   || _ || _|| _|| _|| _|| _|  ¡  |  ¡  |  ¡  d S )N)ÚcursorÚ
removeDupsÚ	transformÚcmdÚconnÚextrasÚResetÚ_initColumnNamesAndTypes)Úselfr   r	   r   r   r   r
   © r   ú6lib/python3.7/site-packages/rdkit/Dbase/DbResultSet.pyÚ__init__   s    zDbResultBase.__init__c             C   sh   y,| j s| j | j¡ n| j | j| j ¡ W n6 tk
rb   tj d| j ¡ ddl}| 	¡  Y nX dS )z implement in subclasses

    z#the command "%s" generated errors:
r   N)
r
   r   Úexecuter   Ú	ExceptionÚsysÚstderrÚwriteÚ	tracebackÚ	print_exc)r   r   r   r   r   r      s    zDbResultBase.Resetc             C   s   |   ¡  | S )N)r   )r   r   r   r   Ú__iter__+   s    zDbResultBase.__iter__c             C   sZ   g | _ g | _x0t | j¡D ] \}}| j  |¡ | j |¡ qW t| j ƒ| _ t| jƒ| _d S )N)ÚcolNamesÚcolTypesr   ZGetColumnInfoFromCursorr   ÚappendÚtuple)r   ZcNameZcTyper   r   r   r   /   s    z%DbResultBase._initColumnNamesAndTypesc             C   s   | j S )N)r   )r   r   r   r   ÚGetColumnNames8   s    zDbResultBase.GetColumnNamesc             C   s   | j S )N)r   )r   r   r   r   ÚGetColumnTypes;   s    zDbResultBase.GetColumnTypesc             C   s   t dd„ t| j| jƒD ƒƒS )Nc             s   s   | ]
}|V  qd S )Nr   )Ú.0Úntr   r   r   ú	<genexpr>?   s    z6DbResultBase.GetColumnNamesAndTypes.<locals>.<genexpr>)r   Úzipr   r   )r   r   r   r   ÚGetColumnNamesAndTypes>   s    z#DbResultBase.GetColumnNamesAndTypes)r   NN)
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r#   r   r   r   r   r      s   
	r   c               @   s,   e Zd ZdZdd„ Zdd„ Zdd„ ZeZdS )	ÚDbResultSetz! Only supports forward iteration c             O   s"   t j| f|ž|Ž g | _d| _d S )Nr   )r   r   ÚseenÚ_stopped)r   ÚargsÚkwargsr   r   r   r   E   s    zDbResultSet.__init__c             C   s   d| _ t | ¡ d S )Nr   )r)   r   r   )r   r   r   r   r   J   s    zDbResultSet.Resetc             C   s|   | j r
t‚d }xh|d krv| j ¡ }|s0d| _ t‚| jd k	rD|  |¡}| jdkr|| j }|| jkrhd }q| j |¡ qW |S )Né   r   )r)   ÚStopIterationr   Úfetchoner   r   r(   r   )r   ÚrÚvr   r   r   ÚnextN   s     






zDbResultSet.nextN)r$   r%   r&   Ú__doc__r   r   r1   Ú__next__r   r   r   r   r'   B   s
   r'   c               @   sD   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e	Z
dS )ÚRandomAccessDbResultSetz Supports random access c             O   s(   t j| f|ž|Ž g | _g | _d| _d S )Nr   )r   r   Úresultsr(   Ú_pos)r   r*   r+   r   r   r   r   g   s    z RandomAccessDbResultSet.__init__c             C   s   d| _ | jd k	rt | ¡ d S )Nr   )r6   r   r   r   )r   r   r   r   r   m   s    
zRandomAccessDbResultSet.Resetc             C   s†   | j r‚| j  ¡ }xj|rz| jd k	r*|  |¡}| jdkrb|| j }|| jkrn| j |¡ | j |¡ n| j |¡ | j  ¡ }qW d | _ d S )Nr   )r   r.   r   r   r(   r   r5   )r   r/   r0   r   r   r   Ú_finishr   s    





zRandomAccessDbResultSet._finishc             C   s
  |dk rt dƒ‚| jd krRt| jƒrJ|t| jƒkrRt d|t| jƒf ƒ‚ntdƒ‚x¬|t| jƒkrþd }x”|d krú| j ¡ }|sšd | _t d|t| jƒf ƒ‚| jd k	r®|  |¡}| jdkrì|| j }|| jkrÒd }qø| j 	|¡ | j 	|¡ qh| j 	|¡ qhW qTW | j| S )Nr   znegative indices not supportedzindex %d too large (%d max)zInvalid cursor)
Ú
IndexErrorr   Úlenr5   Ú
ValueErrorr.   r   r   r(   r   )r   Úidxr/   r0   r   r   r   Ú__getitem__‚   s0    








z#RandomAccessDbResultSet.__getitem__c             C   s$   | j d krtdƒ‚|  ¡  t| j ƒS )Nz-len() not supported for noMemory Results Sets)r5   r:   r7   r9   )r   r   r   r   Ú__len__¢   s    
zRandomAccessDbResultSet.__len__c             C   s6   |  j d7  _ d }| j t| ƒk r.| j| j  }nt‚|S )Nr,   )r6   r9   r5   r-   )r   Zresr   r   r   r1   ¨   s    zRandomAccessDbResultSet.nextN)r$   r%   r&   r2   r   r   r7   r<   r=   r1   r3   r   r   r   r   r4   d   s    	r4   Ú__main__)Ú	DbConnectzTEST.GDBzcurs:zselect * from ten_elementsé   é
   zuse lenzuse iterZdupszselect * from ten_elements_dupsé   )r   )r   é   r,   )é   é   é   )rA   é=   )r2   r   Zrdkit.Dbaser   Úobjectr   r'   r4   r$   Zrdkit.Dbase.DbConnectionr?   r	   Z	GetCursorZcursÚprintÚreprr   Z	resultSetÚrangeÚiÚvalr8   ÚAssertionErrorr9   ÚthingZIDr/   r   r   r   r   r   Ú<module>
   sx   2"P











