o
    eT                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
Zd dlmZ G dd dejZdd Zdd Ze jG d	d
 d
eZe jG dd deZdS )    N)errorc                   @   s   e Zd ZdddZdS )ConstraintViolationNc                 C   s   t jj| ||dd d S )Nzconstraint violation)tag)r   Error__init__)selfmsgjson r
   -/usr/lib/python3/dist-packages/ovs/db/data.pyr      s   zConstraintViolation.__init__N)__name__
__module____qualname__r   r
   r
   r
   r   r      s    r   c                 C   s   g }| D ]i}|dv r| d|  qt|dk rh|dkr"| d q|dkr,| d q|dkr6| d	 q|d
kr@| d q|dkrJ| d q|dkrT| d q|dkr^| d q| dt|  q| | qd|S )Nz\"\    
z\nz\rz\az\bz\f	z\tz\vz\%03o )appendordjoin)srcdstcr
   r
   r   escapeCString"   s,   
r    c                 C   s   | S r   r
   )xr
   r
   r   returnUnchanged=   s   r"   c                   @   s   e Zd ZdZd$ddZdd Zdd Zd	d
 Zdd Ze	dd Z
dd Ze	d$ddZe	dd Zdd Zdd Zdd ZefddZedZe	dd Zd d! Ze	d"d# ZdS )%Atom)valuetypeNc                 C   s&   || _ |d ur|| _d S | | _d S r   )r%   r$   default_atom)r   type_r$   r
   r
   r   r   E   s   
zAtom.__init__c                 C   s.   t |tr| j|jkrtS | j|jkrdS dS NTF
isinstancer#   r%   NotImplementedr$   r   otherr
   r
   r   __eq__L      zAtom.__eq__c                 C   s.   t |tr| j|jkrtS | j|jk rdS dS r(   r)   r,   r
   r
   r   __lt__Q   r/   zAtom.__lt__c                 C   s>   t |tr| j|jkrtS | j|jk rdS | j|jkrdS dS N   r   r)   r,   r
   r
   r   __cmp__V   s   zAtom.__cmp__c                 C   
   t | jS r   )hashr$   r   r
   r
   r   __hash__`      
zAtom.__hash__c                 C   s   t | S )aI  Returns the default value for the given type_, which must be an
        instance of ovs.db.types.AtomicType.

        The default value for each atomic type is;

          - 0, for integer or real atoms.

          - False, for a boolean atom.

          - "", for a string atom.

          - The all-zeros UUID, for a UUID atom.)r#   )r'   r
   r
   r   defaultc   s   zAtom.defaultc                 C   s   | |  | jkS r   )r:   r%   r7   r
   r
   r   
is_defaults      zAtom.is_defaultc                 C   s   | j }tjj|}tg}|tg t|}|tjj	j
kr#t|tsG|tjj	jkr/t||sG|tjj	jkr;t|tsG|tjj	jkrMt|trMt||}n|tjj	jkr_t|tj||}n
td|  |||  |S )Nzexpected %s)r%   ovsdbparserfloat_to_intintextendfloattupletypesIntegerTyper*   RealTypeBooleanTypebool
StringTypestrr#   UuidTypeovsuuid	from_jsonr   r   	to_stringcheck_constraints)baser	   symtabr'   
real_typesatomr
   r
   r   rN   v   s*   
zAtom.from_jsonc                 C   sP   t jj|}t|| jjrt| j|}nt	d| jt|f |
|  |S )Nzexpected %s, got %s)r=   r>   r?   r@   r*   r%   python_typesr#   r   r   rP   )rQ   r$   rT   r
   r
   r   from_python   s   
zAtom.from_pythonc                 C   sN  |j | j ksJ |jdur| |jvrtd|  |j f |j tjjjtjjjfv rv|j	du s7| j
|j	krD|jdu sB| j
|jkrDdS |j	dur[|jdur[td|  |j	|jf |j	durktd|  |j	f td|  |jf |j tjjjkr| j
}t|}||jk rtd|||jf ||jkrtd|||jf dS dS )aH  Checks whether 'atom' meets the constraints (if any) defined in
        'base' and raises an ovs.db.error.Error if any constraint is violated.

        'base' and 'atom' must have the same type.
        Checking UUID constraints is deferred to transaction commit time, so
        this function does nothing for UUID constraints.Nz(%s is not one of the allowed values (%s)z7%s is not in the valid range %.15g to %.15g (inclusive)z+%s is less than minimum allowed value %.15gz.%s is greater than maximum allowed value %.15gz5"%s" length %d is less than minimum allowed length %dz8"%s" length %d is greater than maximum allowed length %d)r%   enumr   rO   r=   r>   rE   rF   rG   minr$   maxrJ   len
min_length
max_length)r   rQ   slengthr
   r
   r   rP      sZ   




	zAtom.check_constraintsc                 C   s$   | j tjjjkrtj| jS | jS r   )r%   r=   r>   rE   rL   rM   to_jsonr$   r7   r
   r
   r   r_      s   zAtom.to_jsonc                 C   s   | j tjjjkrd| j S | j tjjjkrd| j S | j tjjjkr)| jr'dS dS | j tjjjkr8dt	| j S | j tjjj
krIdtj| j S d S )Nz.integer = %dz.real = %.15gz.boolean = truez.boolean = falsez.s = %sz
.uuid = %s)r%   r=   r>   rE   rF   r$   rG   rH   rJ   r    rL   rM   to_c_assignment)r   varr
   r
   r   	cInitAtom   s   

zAtom.cInitAtomc                 C   s   | j tjjjkrd| j S | j tjjjkrd| j S | j tjjjkr)| jr'dS dS | j tjjjkr6|| jS | j tjjj	krB| jjS d S Nz%dz%.15gtruefalse)
r%   r=   r>   rE   rF   r$   rG   rH   rJ   rL   )r   escapeLiteralr
   r
   r   	toEnglish   s   


zAtom.toEnglishz&$|true|false|[^_a-zA-Z]|.*[^-._a-zA-Z]c                 C   s   t j| S r   )r#   _Atom__need_quotes_rematch)r]   r
   r
   r   __string_needs_quotes   s   zAtom.__string_needs_quotesc                 C   s   | j tjjjkrd| j S | j tjjjkrd| j S | j tjjjkr)| jr'dS dS | j tjjjkrAt	
| jr>tj| jS | jS | j tjjjkrNt| jS d S rc   )r%   r=   r>   rE   rF   r$   rG   rH   rJ   r#   _Atom__string_needs_quotesr	   rO   rL   rK   r7   r
   r
   r   rO      s   


zAtom.to_stringc                 C   s|   t | trtjjj}n.t | trtjjj}n#t | tr!tjjj	}nt | t
r,tjjj}nt | tr7tjjj}ntt|| S r   )r*   rA   r=   r>   rE   rF   rC   rG   rI   rH   rK   rJ   uuidrL   	TypeErrorr#   )r!   tr
   r
   r   new   s   





zAtom.newr   )r   r   r   	__slots__r   r.   r0   r4   r8   staticmethodr:   r;   rN   rV   rP   r_   rb   r"   rg   recompilerh   rk   rO   ro   r
   r
   r
   r   r#   A   s0    



	*

r#   c                   @   s   e Zd ZdZi fddZdd Zdd Zdd	 Zd
Zdd Z	dd Z
edd Zdd Zdd Zed1ddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zed%d& Zd'd( Zd1d)d*Zd+d, Zd-d. Zd/d0 Zd
S )2Datumr%   valuesc                 C   s   || _ || _d S r   ru   )r   r'   rv   r
   r
   r   r     s   
zDatum.__init__c                 C   s"   t |tstS | j|jkrdS dS r(   r*   rt   r+   rv   r,   r
   r
   r   r.        
zDatum.__eq__c                 C   s"   t |tstS | j|jk rdS dS r(   rw   r,   r
   r
   r   r0     rx   zDatum.__lt__c                 C   s2   t |tstS | j|jk rdS | j|jkrdS dS r1   rw   r,   r
   r
   r   r4     s   
zDatum.__cmp__Nc                 C   s
   || j v S r   )rv   )r   itemr
   r
   r   __contains__+  r9   zDatum.__contains__c                 C   s   t | jt| jS r   )rt   r%   dictrv   r7   r
   r
   r   copy.  s   z
Datum.copyc                 C   sF   | j dkri }n|  r| j | j i}n| j d i}t| |S )Nr   )n_minis_mapkeyr:   r$   rt   )r'   rv   r
   r
   r   r:   1  s   

zDatum.defaultc                 C   s   | t | jkS r   )rt   r:   r%   r7   r
   r
   r   r;   ;  r<   zDatum.is_defaultc                 C   s<   | j  D ]\}}|| jj |dur|| jj qdS )aQ  Checks that each of the atoms in 'datum' conforms to the constraints
        specified by its 'type' and raises an ovs.db.error.Error.

        This function is not commonly useful because the most ordinary way to
        obtain a datum is ultimately via Datum.from_json() or Atom.from_json(),
        which check constraints themselves.N)rv   itemsrP   r%   r   r$   )r   keyAtom	valueAtomr
   r
   r   rP   >  s   zDatum.check_constraintsc                 C   s6  |   }|st|trt|dkr|d dkr|rd}nd}tjj||ttgd}t|}|| j	k s8|| j
krFtd|| j	| j
|f |i }|D ]<}|rhtjj|\}	}
t| j|	|}t| j|
|}n
t| j||}d}||v r|r}tdtd|||< qJt| |S t| j||}t| |diS )	a  Parses 'json' as a datum of the type described by 'type'.  If
        successful, returns a new datum.  On failure, raises an
        ovs.db.error.Error.

        Violations of constraints expressed by 'type' are treated as errors.

        If 'symtab' is nonnull, then named UUIDs in 'symtab' are accepted.
        Refer to RFC 7047 for information about this, and for the syntax
        that this function accepts.r   setmaparrayz0%s must have %d to %d members but %d are presentNzmap contains duplicate keyzset contains duplicate)r~   r*   listrZ   r=   r>   r?   unwrap_jsonrD   r}   n_maxr   r   parse_json_pairr#   rN   r   r$   rt   )r'   r	   rR   r~   class_innernrv   elementr   r$   r   r   r
   r
   r   rN   J  sH   



zDatum.from_jsonc                 C   sj   | j  rddd t| j D gS t| jdkr'tt| j }|	 S ddd t| j D gS )Nr   c                 S   s    g | ]\}}|  |  gqS r
   r_   .0kvr
   r
   r   
<listcomp>  s    z!Datum.to_json.<locals>.<listcomp>r3   r   c                 S   s   g | ]}|  qS r
   r   r   r   r
   r
   r   r     s    )
r%   r~   sortedrv   r   rZ   nextiterkeysr_   r   r   r
   r
   r   r_   }  s   
zDatum.to_jsonc                 C   s   d  }}| j jdkst| jdkr| j  rd}d}nd}d}g }|r(|| tt| jD ]&\}}|r:|d ||  | j  rU|d || j|   q/|r]|| d		|S )
Nr3   r   {}[]z, =r   )
r%   r   rZ   rv   r~   r   	enumerater   rO   r   )r   headtailr]   ir   r
   r
   r   rO     s*   






zDatum.to_stringc                 C   sb   | j jdkst| jdkr/|j D ]\}}|| jv r'|| j| kr'| j|= q|| j|< q| S |S )Nr3   r   )r%   r   rZ   rv   r   )r   datumr   r   r
   r
   r   diff  s   
z
Datum.diffc                 C   s2   | j  rdd | j D S dd | j D S )Nc                 S   s   g | ]
\}}|j |j gqS r
   r$   r   r
   r
   r   r     s    z!Datum.as_list.<locals>.<listcomp>c                 S   s   g | ]}|j qS r
   r   r   r
   r
   r   r     s    )r%   r~   rv   r   r   r7   r
   r
   r   as_list  s   
zDatum.as_listc                 C   r5   r   )r{   rv   r7   r
   r
   r   as_dict  r9   zDatum.as_dictc                 C   sR   t | jdkr'| j rtt| j \}}|j|jgS tt| j jS d S )Nr3   )	rZ   rv   r%   r~   r   r   r   r$   r   )r   r   r   r
   r
   r   	as_scalar  s   
zDatum.as_scalarc                 C   s   | j  r||  | j j}|du r| j j S |S | j  rIi }| j D ] \}}||j| j j}||j| j j}|durF|durF|||< q&|S t	 }| jD ]}||j| j j}|durb|
| qOt|S )a  Returns this datum's value converted into a natural Python
        representation of this datum's type, according to the following
        rules:

        - If the type has exactly one value and it is not a map (that is,
          self.type.is_scalar() returns True), then the value is:

            * An int or long, for an integer column.

            * An int or long or float, for a real column.

            * A bool, for a boolean column.

            * A str or unicode object, for a string column.

            * A uuid.UUID object, for a UUID column without a ref_table.

            * An object represented the referenced row, for a UUID column with
              a ref_table.  (For the Idl, this object will be an ovs.db.idl.Row
              object.)

          If some error occurs (e.g. the database server's idea of the column
          is different from the IDL's idea), then the default value for the
          scalar type is used (see Atom.default()).

        - Otherwise, if the type is not a map, then the value is a Python list
          whose elements have the types described above.

        - Otherwise, the type is a map, and the value is a Python dict that
          maps from key to value, with key and value types determined as
          described above.

        'uuid_to_row' must be a function that takes a value and an
        ovs.db.types.BaseType and translates UUIDs into row objects.N)r%   	is_scalarr   r   r:   r~   rv   r   r$   r   addr   )r   uuid_to_rowr$   r   r   dkdvr]   r
   r
   r   	to_python  s*   
#


zDatum.to_pythonc           	      C   s   i }t |tr'| D ]\}}t| j||}t| j||}|||< qn(t |ttt	frB|D ]}t| j||}d||< q1nt| j||}d||< t
| |}|  | sjtdt|| j| jf |S )a  Returns a new Datum with the given ovs.db.types.Type 'type_'.  The
        new datum's value is taken from 'value', which must take the form
        described as a valid return value from Datum.to_python() for 'type'.

        Each scalar value within 'value' is initially passed through
        'row_to_uuid', which should convert objects that represent rows (if
        any) into uuid.UUID objects and return other data unchanged.

        Raises ovs.db.error.Error if 'value' is not in an appropriate form for
        'type_'.Nz.%d values when type requires between %d and %d)r*   r{   r   r#   rV   r   r$   r   r   rD   rt   rP   conforms_to_typer   r   rZ   r}   r   )	r'   r$   row_to_uuiddr   r   kavar   r
   r
   r   rV     s*   



zDatum.from_pythonc                 C   s<   t |ts
t|}| j st|| jvrt| j| jS r   )	r*   r#   ro   r%   r~   
IndexErrorrv   KeyErrorr$   r   r
   r
   r   __getitem__  s   



zDatum.__getitem__c                 C   s.   t |ts
t|}|| jv r| j| jS |S r   )r*   r#   ro   rv   r$   )r   r   r:   r
   r
   r   get&  s
   


z	Datum.getc                 C   s   |   S r   )rO   r7   r
   r
   r   __str__.  s   zDatum.__str__c                 C   s*   t | j}| jj|  ko| jjkS   S r   )rZ   rv   r%   r}   r   )r   r   r
   r
   r   r   1  s   
 zDatum.conforms_to_typec                 C   s  t | j}|dkrdgS g }| jjjtjjjkrW|d||f g7 }t| jD ]}|dt	|j
 g7 }q&|dg7 }|d||f g7 }t|D ]}|d||f g7 }qE|dg7 }nd||f g}t| jD ]}|d|| g7 }qc|dg7 }| jj
r| jj
jtjjjkr|d	||f g7 }t| jD ]\}}|dt	|j
 g7 }q|dg7 }|d
||f g7 }t|D ]}|d||f g7 }q|dg7 }n"d
||f g}t| j D ]\}}|d|| g7 }q|dg7 }|d| g7 }|d| g7 }|d| g7 }| jj
r|d| g7 }|dg7 }|S )Nr   z*static struct ovsdb_datum %s = { .n = 0 };z)static struct json %s_key_strings[%d] = {z8    { .type = JSON_STRING, .string = "%s", .count = 2 },z};z'static union ovsdb_atom %s_keys[%d] = {z!    { .s = &%s_key_strings[%d] },z    { %s },z)static struct json %s_val_strings[%d] = {z)static union ovsdb_atom %s_values[%d] = {z!    { .s = &%s_val_strings[%d] },z static struct ovsdb_datum %s = {z    .n = %d,z    .keys = %s_keys,z    .values = %s_values,)rZ   rv   r%   r   r=   r>   rE   rJ   r   r    r$   rangerb   r   )r   namer   r]   r   r   r   r   r
   r
   r   cDeclareDatum5  s\   








zDatum.cDeclareDatumr   )r   r   r   rp   r   r.   r0   r4   r8   rz   r|   rq   r:   r;   rP   rN   r_   rO   r   r   r   r   r   rV   r   r   r   r   r   r
   r
   r
   r   rt     s:    

	2

9
!

rt   )	functoolsrr   rl   ovs.db.parserr=   ovs.db.typesovs.jsonovs.jsonrpcovs.ovsuuid
ovs.pollerovs.socket_utilovs.dbr   r   r   r    r"   total_orderingobjectr#   rt   r
   r
   r
   r   <module>   s&    L