U
    d|                     @   sz  d Z ddd Zddd ZdgZddlT ddlT ddlT ddlT G d	d
 d
ZG dd dZ	e
dkrve	 Zeddd edddd eddd ed ed edddZeee eeZded< ded< ded< e  eeZded< ded< d ed< e  ed! eee eeeD ]8Zee ZejD ]Zee d"ee   qFe  q4e  d#S )$a"  .DBF creation helpers.

Note: this is a legacy interface.  New code should use Dbf class
    for table creation (see examples in dbf.py)

TODO:
  - handle Memo fields.
  - check length of the fields according to the
    `http://www.clicketyclick.dk/databases/xbase/format/data_types.html`

z$Revision: 1.4 $   z$Date: 2006/07/04 08:18:18 $   dbf_new   )*c                   @   sR   e Zd ZdZdZedfedfedfedfe	dfdZ
dd	d
Zdd Zdd ZdS )_FieldDefinitionak  Field definition.

    This is a simple structure, which contains ``name``, ``type``,
    ``len``, ``dec`` and ``cls`` fields.

    Objects also implement get/setitem magic functions, so fields
    could be accessed via sequence interface, where 'name' has
    index 0, 'type' index 1, 'len' index 2, 'dec' index 3 and
    'cls' could be located at index 4.

    )nametypelendecclsNr         )CNLDT    c                 C   sL   | j | \}}|d kr*|d kr&td|}|| _|| _|| _|| _|| _d S )NzField length must be defined)	FLD_TYPES
ValueErrorr   r	   r
   r   r   )selfr   r	   r
   r   _cls_len r   @/tmp/pip-unpacked-wheel-_3ph8cfy/tablib/packages/dbfpy/dbfnew.py__init__?   s    z_FieldDefinition.__init__c                 C   s   |  | j| j| jS )z:Return `DbfFieldDef` instance from the current definition.)r   r   r
   r   r   r   r   r   getDbfFieldK   s    z_FieldDefinition.getDbfFieldc                 C   s   |   }|| dS )zCreate a `DbfFieldDef` instance and append it to the dbf header.

        Arguments:
            dbfh: `DbfHeader` instance.

        N)r   ZaddField)r   ZdbfhZ_dbffr   r   r   appendToHeaderO   s    z_FieldDefinition.appendToHeader)Nr   )__name__
__module____qualname____doc__	__slots__ZDbfCharacterFieldDefZDbfNumericFieldDefZDbfLogicalFieldDefZDbfDateFieldDefZDbfDateTimeFieldDefr   r   r   r   r   r   r   r   r   !   s   
r   c                   @   s2   e Zd ZdZdZeZdd ZdddZdd	 Z	d
S )r   a3  New .DBF creation helper.

    Example Usage:

        dbfn = dbf_new()
        dbfn.add_field("name",'C',80)
        dbfn.add_field("price",'N',10,2)
        dbfn.add_field("date",'D',8)
        dbfn.write("tst.dbf")

    Note:
        This module cannot handle Memo-fields,
        they are special.

    fieldsc                 C   s
   g | _ d S )Nr%   r   r   r   r   r   o   s    zdbf_new.__init__r   c                 C   s   | j | |||| dS )a  Add field definition.

        Arguments:
            name:
                field name (str object). field name must not
                contain ASCII NULs and it's length shouldn't
                exceed 10 characters.
            typ:
                type of the field. this must be a single character
                from the "CNLMDT" set meaning character, numeric,
                logical, memo, date and date/time respectively.
            len:
                length of the field. this argument is used only for
                the character and numeric fields. all other fields
                have fixed length.
                FIXME: use None as a default for this argument?
            dec:
                decimal precision. used only for the numric fields.

        N)r&   appendFieldDefinitionClass)r   r   typr
   r   r   r   r   	add_fieldr   s    zdbf_new.add_fieldc                 C   sD   t  }|  | jD ]}|| qt|d}|| |  dS )z/Create empty .DBF file using current structure.wbN)Z	DbfHeaderZsetCurrentDater&   r   openwriteclose)r   filenameZ_dbfhZ_fldDefZ
_dbfStreamr   r   r   r-      s    


zdbf_new.writeN)r   )
r    r!   r"   r#   r$   r   r(   r   r*   r-   r   r   r   r   r   Z   s   
__main__r   r   P   Zpricer   
      dater   r   ztst.dbfz*** created tst.dbf: ***r   )ZreadOnlyZ	somethingg      %@)i  r      zfoo and bari/  )i  r      z(*** inserted 2 records into tst.dbf: ***z:	 N)r#   __version____date____all__Zdbfr&   headerrecordr   r   r    Zdbfnr*   r-   printZDbfZdbftreprZ	DbfRecordZrecstoreranger
   i1Z
fieldNamesZfldNamer.   r   r   r   r   <module>   sH   9;



