
    ?wg$                     n    d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddd Zdd	d Z	d
gZ
	 	  G d d
      Zy)    N   )fields)getDatez$Revision: 1.6 $   z$Date: 2010/09/16 05:06:39 $   	DbfHeaderc                       e Zd ZdZdZ	 	 ddZd Z ee      Zd Z ee      Z e	d       Z
 e	d       Z e	d	       Zd
 Z e	d ed      Zd Zd Zd Zd Zd Zd Zd Zy)r	   a|  Dbf header definition.

    For more information about dbf header format visit
    `http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_STRUCT`

    Examples:
        Create an empty dbf header and add some field definitions:
            dbfh = DbfHeader()
            dbfh.addField(("name", "C", 10))
            dbfh.addField(("date", "D"))
            dbfh.addField(DbfNumericFieldDef("price", 5, 2))
        Create a dbf header with field definitions:
            dbfh = DbfHeader([
                ("name", "C", 10),
                ("date", "D"),
                DbfNumericFieldDef("price", 5, 2),
            ])

    )	signaturer   
lastUpdaterecordLengthrecordCountheaderLengthchanged_ignore_errorsNc                     || _         |g | _        nt        |      | _        t        |      | _        || _        || _        || _        || _        t        | j                        | _
        y)a  Initialize instance.

        Arguments:
            fields:
                a list of field definitions;
            recordLength:
                size of the records;
            headerLength:
                size of the header;
            recordCount:
                number of records stored in DBF;
            signature:
                version number (aka signature). using 0x03 as a default meaning
                "File without DBT". for more information about this field visit
                ``http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_NOTE_1_TARGET``
            lastUpdate:
                date of the DBF's update. this could be a string ('yymmdd' or
                'yyyymmdd'), timestamp (int or float), datetime/date value,
                a sequence (assuming (yyyy, mm, dd, ...)) or an object having
                callable ``ticks`` field.
            ignoreErrors:
                error processing mode for DBF fields (boolean)

        N)r   r   listr   r   r   r   r   ignoreErrorsboolr   )selfr   r   r   r   r   r   r   s           R/var/www/horilla/myenv/lib/python3.12/site-packages/tablib/_vendor/dbfpy/header.py__init__zDbfHeader.__init__:   s`    4 #>DKv,DK!*-((&( DKK(    c                 \    | j                  t        j                  t        |                  S )z.Return header instance from the string object.)
fromStreamioStringIOstr)clsstrings     r   
fromStringzDbfHeader.fromStringc   s    ~~bkk#f+677r   c                 P   |j                  d       |j                  d      }t        |t              st        |t	        j
                               }|}t        j                  d|dd       \  }}}|d   }|dk  r|dz  }n|d	z  } | d
||||d   ||d   |d   f      }d}	|j                  d      }|dk7  rp||j                  d      z  }t        j                  |d         j                  ||	      }
|j                  |
       |
j                  }	|j                  d      }|dk7  rp|S )z%Return header object from the stream.r       z<I2H      r   P   i  l  N            r   )seekread
isinstancebytessysgetfilesystemencodingstructunpackr   	lookupForr!   	_addFieldend)r   streamfirst_32_data_cnt_hdrLen_recLen_year_obj_pos_flds              r   r   zDbfHeader.fromStreami   s)   A;;r?(E*(C$=$=$?@E#)==q#E wa2: TMETME4'4q58U1X.0 AunV[[_$E##E"I.99%FDNN4 88DKKNE un r   c                 .    | j                   j                  S N)r   yearr   s    r   <lambda>zDbfHeader.<lambda>   s    !5!5 r   c                 .    | j                   j                  S rB   )r   monthrD   s    r   rE   zDbfHeader.<lambda>   s    $//"7"7 r   c                 .    | j                   j                  S rB   )r   dayrD   s    r   rE   zDbfHeader.<lambda>   s     3 3 r   c                 X    t        |      x| _        }| j                  D ]	  }||_         y)z1Update `ignoreErrors` flag on self and all fieldsN)r   r   r   r   )r   value_fields      r   r   zDbfHeader.ignoreErrors   s.    &*5k1ekk 	(F"'F	(r   c                     | j                   S rB   )r   rD   s    r   rE   zDbfHeader.<lambda>   s    T(( r   zError processing mode for DBF field value conversion

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

        )docc           	         d}|| j                   | j                  | j                  | j                  | j                  fz  }|dj                  | j                  D cg c]  }d|j                         z   c}      z  }|S c c}w )NzVersion (signature): 0x%02x
        Last update: %s
      Header length: %d
      Record length: %d
       Record count: %d
 FieldName Type Len Dec

z%10s %4s %3s %3s)r   r   r   r   r   joinr   	fieldInfo)r   _rvr@   s      r   __repr__zDbfHeader.__repr__   s     T^^T__d6G6G&&(8(8: :tyy?C{{Kt$.."22K
 	
 
 Ls   A>
c                 B   g }d}|D ]  }t        |t        j                        r|}nAt        |      dz   dd \  }}}}	t        j                  |      }
 |
|||	| j
                        }||j                  z  }|j                  |        | xj                  |z  c_        |S )ah  Internal variant of the `addField` method.

        This method doesn't set `self.changed` field to True.

        Return value is a length of the appended records.
        Note: this method doesn't modify ``recordLength`` and
        ``headerLength`` fields. Use `addField` instead of this
        method if you don't exactly know what you're doing.

        r   )NNNNNr$   )r   )r.   r   DbfFieldDeftupler4   r   lengthappend)r   defs_defs_recordLength_defr>   _name_type_len_dec_clss              r   r5   zDbfHeader._addField   s      	D$ 2 23.3DkK.G!-L*tT''.E4D<O<OPT[[(MLL	 	ur   c                     | j                   }| xj                    | j                  | z  c_         |s| xj                   dz  c_         ddt        | j                        z  z   dz   | _        d| _        y)a  Add field definition to the header.

        Examples:
            dbfh.addField(
                ("name", "C", 20),
                dbf.DbfCharacterFieldDef("surname", 20),
                dbf.DbfDateFieldDef("birthdate"),
                ("member", "L"),
            )
            dbfh.addField(("price", "N", 5, 2))
            dbfh.addField(dbf.DbfNumericFieldDef("origprice", 5, 2))

        r   r#   TN)r   r5   lenr   r   r   )r   rZ   _oldLens      r   addFieldzDbfHeader.addField   sh     ##^T^^T22" "s4;;'7"781<r   c                 n   |j                  d       |j                  | j                                | j                  D cg c]  }|j                          }}|j                  dj	                  |      j                  t        j                                      |j                  d       d| _        yc c}w )z&Encode and write header to the stream.r    r*   FN)	r,   writetoStringr   rQ   encoder0   r1   r   )r   r7   r@   r   s       r   ri   zDbfHeader.write   s|    AT]]_%.2kk:d$--/::RWWV_++C,E,E,GHIW ;s   B2c           
          t        j                  d| j                  | j                  dz
  | j                  | j
                  | j                  | j                  | j                        dz   S )z4Returned 32 chars length string with encoded header.z<4BI2Hr'   s                       )	r2   packr   rC   rG   rI   r   r   r   rD   s    r   rj   zDbfHeader.toString   s[    {{8>>99t+::88++,,,,. 2>? 	?r   c                 J    t         j                  j                         | _        y)z9Update ``self.lastUpdate`` field with current date value.N)datetimedatetodayr   rD   s    r   setCurrentDatezDbfHeader.setCurrentDate   s    "----/r   c                     t        |t              r?|j                         }| j                  D ]  }|j                  |k(  s|c S  t        |      | j                  |   S )z9Return a field definition by numeric index or name string)r.   r   upperr   nameKeyError)r   itemr^   rL   s       r   __getitem__zDbfHeader.__getitem__  sX    dC JJLE++ %;;%'!M% tn$ ;;t$$r   )Nr   r   r   r)   NF)__name__
__module____qualname____doc__	__slots__r   r!   classmethodr   propertyrC   rG   rI   r   rT   r5   rf   ri   rj   rr   rx    r   r   r	   r	       s    (MI
 BCNS&)R8 Z(J< Z(J 56D78E
3
4C(
 (L$@0	?0%r   )ro   r   r2   r0   rh   r   utilsr   __version____date____all__r	   r   r   r   <module>r      sL     	  
   B')!B/-n% n%r   