U
    yag$  ã                   @   sœ   d dl mZmZ d dlmZ ddd… Zddd… ZdZd	gZG d
d	„ d	ƒZ	dd„ Z
dd„ Zedkr˜ddlZeejƒd kr„ejd  p†dZeeƒ e
eƒ dS )é   )ÚheaderÚrecord)ÚINVALID_VALUEz$Revision: 1.7 $é   éþÿÿÿz$Date: 2007/02/11 09:23:13 $é   z1Jeff Kunce <kuncej@mail.conservation.state.mo.us>ÚDbfc                   @   sÜ   e Zd ZdZdZejZej	Z
eZd(dd„Zedd„ ƒZedd„ ƒZed	d„ ƒZed
d„ ƒZedd„ ƒZdd„ Zedd„ edd�Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'S ))r   a’  DBF accessor.

    FIXME:
        docs and examples needed (dont' forget to tell
        about problems adding new fields on the fly)

    Implementation notes:
        ``_new`` field is used to indicate whether this is
        a new data table. `addField` could be used only for
        the new tables! If at least one record was appended
        to the table it's structure couldn't be changed.

    )Únamer   ÚstreamÚ_changedÚ_newÚ_ignore_errorsFc                 C   s†   t |tƒr8|| _|r"t|dƒ| _qLt|dt|ƒ ƒ| _nt|ddƒ| _|| _|r\|  ¡ | _n| j 	| j¡| _|| _
t|ƒ| _d| _dS )af  Initialize instance.

        Arguments:
            f:
                Filename or file-like object.
            new:
                True if new data table must be created. Assume
                data table exists if this argument is False.
            readOnly:
                if ``f`` argument is a string file will
                be opend in read-only mode; in other cases
                this argument is ignored. This argument is ignored
                even if ``new`` argument is True.
            headerObj:
                `header.DbfHeader` instance or None. If this argument
                is None, new empty header will be used with the
                all fields set by default.
            ignoreErrors:
                if set, failing field value conversion will return
                ``INVALID_VALUE`` instead of raising conversion error.

        zw+b)zr+bÚrbr	   Ú FN)Ú
isinstanceÚstrr	   Úopenr
   ÚboolÚgetattrÚHeaderClassr   Ú
fromStreamÚignoreErrorsr   r   )ÚselfÚfZreadOnlyÚnewr   © r   úM/var/www/html/myvenv/lib/python3.8/site-packages/tablib/packages/dbfpy/dbf.pyÚ__init__]   s    

zDbf.__init__c                 C   s   | j jS ©N)r
   Úclosed©r   r   r   r   Ú<lambda>Ž   ó    zDbf.<lambda>c                 C   s   | j jS r   )r   ÚrecordCountr    r   r   r   r!   �   r"   c                 C   s   dd„ | j jD ƒS )Nc                 S   s   g | ]
}|j ‘qS r   ©r	   )Ú.0Z_fldr   r   r   Ú
<listcomp>‘   s     z Dbf.<lambda>.<locals>.<listcomp>©r   Úfieldsr    r   r   r   r!   ‘   r"   c                 C   s   | j jS r   r'   r    r   r   r   r!   ’   r"   c                 C   s   | j p| jjS r   )r   r   Úchangedr    r   r   r   r!   “   r"   c                 C   s   t |ƒ | j_| _dS )z8Update `ignoreErrors` flag on the header object and selfN)r   r   r   r   )r   Úvaluer   r   r   r   •   s    zDbf.ignoreErrorsc                 C   s   | j S r   )r   r    r   r   r   r!   š   r"   z¹Error processing mode for DBF field value conversion

        if set, failing field value conversion will return
        ``INVALID_VALUE`` instead of raising conversion error.

        )Údocc                 C   sB   t |tƒstdƒ‚|dk r*|t| ƒd 7 }|t| ƒkr>tdƒ‚|S )aŠ  Return fixed index.

        This method fails if index isn't a numeric object
        (long or int). Or index isn't in a valid range
        (less or equal to the number of records in the db).

        If ``index`` is a negative number, it will be
        treated as a negative indexes for list objects.

        Return:
            Return value is numeric object maning valid index.

        zIndex must be a numeric objecté    r   zRecord index out of range)r   ÚintÚ	TypeErrorÚlenÚ
IndexError©r   Úindexr   r   r   Ú	_fixIndex¥   s    
zDbf._fixIndexc                 C   s   |   ¡  | j ¡  d S r   )Úflushr
   Úcloser    r   r   r   r5   ¿   s    z	Dbf.closec                 C   s2   | j r.| j ¡  | j | j¡ | j ¡  d| _dS )z$Flush data to the associated stream.FN)r)   r   ZsetCurrentDateÚwriter
   r4   r   r    r   r   r   r4   Ã   s
    

z	Dbf.flushc                 C   s    dd„ | j jD ƒ}| | ¡ ¡S )zIndex of field named ``name``.c                 S   s   g | ]
}|j ‘qS r   r$   )r%   r   r   r   r   r&   Î   s     z(Dbf.indexOfFieldName.<locals>.<listcomp>)r   r(   r2   Úupper)r   r	   Únamesr   r   r   ÚindexOfFieldNameË   s    zDbf.indexOfFieldNamec                 C   s
   |   | ¡S )z.Return new record, which belong to this table.)ÚRecordClassr    r   r   r   Ú	newRecordÑ   s    zDbf.newRecordc                 C   s2   | j j|_| ¡  | j  jd7  _d| _d| _dS )z"Append ``record`` to the database.r   TFN)r   r#   r2   Ú_writer   r   )r   r   r   r   r   ÚappendÕ   s
    
z
Dbf.appendc                 G   s    | j r| jj|Ž  ntdƒ‚dS )z_Add field definitions.

        For more information see `header.DbfHeader.addField`.

        z9At least one record was added, structure can't be changedN)r   r   ÚaddFieldr.   )r   Zdefsr   r   r   r>   Ý   s    zDbf.addFieldc                 C   s   d| j  t| jƒ S )NzDbf stream '%s'
)r
   Úreprr   r    r   r   r   Ú__repr__ë   s    zDbf.__repr__c                 C   s   | j S )zReturn number of records.)r#   r    r   r   r   Ú__len__î   s    zDbf.__len__c                 C   s   | j  | |  |¡¡S )zReturn `DbfRecord` instance.)r:   r   r3   r1   r   r   r   Ú__getitem__ò   s    zDbf.__getitem__c                 C   s$   |   |¡|_| ¡  d| _d| _dS )z)Write `DbfRecord` instance to the stream.TFN)r3   r2   r<   r   r   )r   r2   r   r   r   r   Ú__setitem__ö   s    zDbf.__setitem__N)FFF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   Z	DbfHeaderr   r   Z	DbfRecordr:   r   r   Úpropertyr   r#   Z
fieldNamesZ	fieldDefsr)   r   r3   r5   r4   r9   r;   r=   r>   r@   rA   rB   rC   r   r   r   r   r   E   s<   
1ÿýc                 C   s2   t | dƒ}|D ]}tƒ  tt|ƒƒ q| ¡  d S )NT)r   Úprintr?   r5   )ÚfilenameÚ_dbfÚ_recr   r   r   Ú	demo_read  s
    
rN   c                 C   sv   t | dd�}| dddd¡ dD ]<\}}}}| ¡ }||d< ||d	< ||d
< ||d< | ¡  q tt|ƒƒ | ¡  d S )NT)r   )ÚNAMEÚCé   )ÚSURNAMErP   é   )ÚINITIALSrP   é
   )Ú	BIRTHDATEÚD))ZJohnZMillerZYC)i½  r   é   )ZAndyZLarkinÚAL)i¾  é   é   )ZBillZClinthr   )i¿  é   é   )ZBobbZMcNailr   )iÀ  r   é   rO   rR   rT   rV   )r   r>   r;   ÚstorerJ   r?   r5   )rK   rL   Z_nZ_sZ_iÚ_brM   r   r   r   Údemo_create
  s     ü
ra   Ú__main__r,   Nz
county.dbf)r   r   r   Úutilsr   Ú__version__Ú__date__Ú
__author__Ú__all__r   rN   ra   rD   Úsysr/   ÚargvÚ_namer   r   r   r   Ú<module>   s   < >