o
    åÅe«.  ã                   @   s€   d dl Z d dlZd dlZd dlZd dlmZ dd„ ZG dd„ deƒZ	G dd„ de	ƒZ
d	d
„ ZG dd„ deƒZG dd„ deƒZdS )é    N)Úerrorc                 C   s4   |   d¡rt d|¡‚tjj | ¡st d|¡‚d S )NÚ_z%names beginning with "_" are reservedzname must be a valid id)Ú
startswithr   ÚErrorÚovsÚdbÚparserÚis_identifier)ÚnameÚjson© r   ú//usr/lib/python3/dist-packages/ovs/db/schema.pyÚ	_check_id   s
   
ÿr   c                   @   sH   e Zd ZdZddd„Zdd„ Zeddd„ƒZd	d
„ Zdd„ Z	dd„ Z
dS )ÚDbSchemazSchema for an OVSDB database.Fc                 C   s|   || _ || _|| _|  ¡ dkr| j ¡ D ]}d|_q| j ¡ D ]}|j ¡ D ]}|  ||jj	d¡ |  ||jj
d¡ q&qd S )Nr   TÚkeyÚvalue)r
   ÚversionÚtablesÚ_DbSchema__root_set_sizeÚvaluesÚis_rootÚcolumnsÚ_DbSchema__follow_ref_tableÚtyper   r   )Úselfr
   r   r   Úallow_extensionsÚtableÚcolumnr   r   r   Ú__init__!   s   þÿzDbSchema.__init__c                 C   s&   d}| j  ¡ D ]	}|jr|d7 }q|S )z6Returns the number of tables in the schema's root set.r   é   )r   r   r   )r   Ún_rootr   r   r   r   Ú__root_set_size8   s   €zDbSchema.__root_set_sizec           	      C   s°   t jj | d¡}| ddg¡}| dtf¡}| dtf¡ | dtg¡}| ¡  |d ur9t	 
d|¡s9t d| ¡‚i }| ¡ D ]\}}t|| ƒ t |||¡||< q?t|||ƒS )	Nzdatabase schemar
   Úidr   Úcksumr   z[0-9]+\.[0-9]+\.[0-9]+$z'schema version "%s" not in format x.y.z)r   r   r   ÚParserÚgetÚget_optionalÚstrÚdictÚfinishÚreÚmatchr   r   Úitemsr   ÚTableSchemaÚ	from_jsonr   )	r   r   r   r
   r   Ú
tablesJsonr   Ú	tableNameÚ	tableJsonr   r   r   r.   @   s&   
ÿÿ

ÿzDbSchema.from_jsonc                 C   sV   |   ¡ t| jƒk}i }| j ¡ D ]
}| |¡||j< q| j|dœ}| jr)| j|d< |S )N)r
   r   r   )r   Úlenr   r   Úto_jsonr
   r   )r   Údefault_is_rootr   r   r   r   r   r   r3   V   s   
zDbSchema.to_jsonc                 C   s   t  |  ¡ ¡S ©N)r   r.   r3   )r   r   r   r   Úcopye   s   zDbSchema.copyc                 C   sr   |r|j tjjjks|jsd S | j |j¡|_|js(t	j
d|j||jf dd‚| ¡ r5|jjs7d|_d S d S d S )Nz)column %s %s refers to undefined table %szsyntax error)ÚtagT)r   r   r   ÚtypesÚUuidTypeÚref_table_namer   r%   Ú	ref_tabler   r   r
   Úis_strong_refr   Ú
persistent)r   r   ÚbaseÚ	base_namer   r   r   Ú__follow_ref_tableh   s   ÿÿþ
øzDbSchema.__follow_ref_tableN©F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ústaticmethodr.   r3   r6   r   r   r   r   r   r      s    
r   c                   @   s    e Zd Zdd„ Zedd„ ƒZdS )Ú	IdlSchemac                 C   s,   t  | |||¡ || _|| _|| _|| _d S r5   )r   r   Ú	idlPrefixÚ	idlHeaderÚcDeclsÚhDecls)r   r
   r   r   rH   rI   rJ   rK   r   r   r   r      s
   
zIdlSchema.__init__c                 C   s    t jj | d¡}| dtf¡}| dtf¡}| dtfd¡}| dtfd¡}t| ƒ}|d= |d= | dd ¡ | dd ¡ t	j
|dd}t|j|j|j||||ƒS )	Nz
IDL schemarH   rI   rJ   Ú rK   T)r   )r   r   r   r$   r%   r'   r&   r(   Úpopr   r.   rG   r
   r   r   )r   r   rH   rI   rJ   rK   ÚsubjsonÚschemar   r   r   r.   ‡   s   ÿzIdlSchema.from_jsonN)rB   rC   rD   r   rF   r.   r   r   r   r   rG   ~   s    rG   c                    s”   | d u rt ˆ ƒS t| tƒst d| ¡‚| D ]}t|tƒs"t d| ¡‚|ˆ vr.t d| | ¡‚qtt| ƒƒt| ƒkr?t d| ¡‚t ‡ fdd„| D ƒƒS )Nz'array of distinct column names expectedz%s is not a valid column namec                    s   g | ]}ˆ | ‘qS r   r   )Ú.0Úcolumn_name©r   r   r   Ú
<listcomp>ª   s    z(column_set_from_json.<locals>.<listcomp>)ÚtupleÚ
isinstanceÚlistr   r   r'   r2   Úset)r   r   rQ   r   rR   r   Úcolumn_set_from_jsonš   s&   

ÿÿÿÿrX   c                   @   s:   e Zd Zdejdg i fdd„Zed
dd„ƒZd
dd„Zd	S )r-   Tc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r5   )r
   r   ÚmutableÚmax_rowsr   ÚindexesÚ
extensions)r   r
   r   rY   rZ   r   r[   r\   r   r   r   r   ®   s   
zTableSchema.__init__Fc                 C   sf  t jj | d| ¡}| dtg¡}| dtgd¡}| dtg¡}| dtgd¡}| dt	gg ¡}|r;| d	tgi ¡}	ni }	| 
¡  |d u rItj}n
|d
krSt d| ¡‚|s[t d| ¡‚i }
| ¡ D ]\}}t|| ƒ t |||¡|
|< qag }|D ]0}t||
ƒ}|s‡t d| ¡‚t|ƒdkr’d|d
 _|D ]}|js¢t d|j | ¡‚q”| |¡ qxt||
|||||	ƒS )Nztable schema for table %sr   rY   TÚmaxRowsÚisRootFr[   r\   r   zmaxRows must be at least 1z#table must have at least one columnz#index must have at least one columnr   z1ephemeral columns (such as %s) may not be indexed)r   r   r   r$   r%   r(   r&   ÚboolÚintrV   r)   ÚsysÚmaxsizer   r   r,   r   ÚColumnSchemar.   rX   r2   Úuniquer=   r
   Úappendr-   )r   r
   r   r   Úcolumns_jsonrY   rZ   r   Úindexes_jsonr\   r   rQ   Úcolumn_jsonr[   Ú
index_jsonÚindexr   r   r   r   r.   ¸   sT   

þ

ÿÿÿÿzTableSchema.from_jsonc                 C   s¨   i }| j s	d|d< || jkr| j|d< i  |d< }| j ¡ D ]}|j d¡s-| ¡ ||j< q| jtj	kr9| j|d< | j
rRg |d< | j
D ]}|d  dd	„ |D ƒ¡ qC|S )
a  Returns this table schema serialized into JSON.

        The "isRoot" member is included in the JSON only if its value would
        differ from 'default_is_root'.  Ordinarily 'default_is_root' should be
        false, because ordinarily a table would be not be part of the root set
        if its "isRoot" member is omitted.  However, garbage collection was not
        originally included in OVSDB, so in older schemas that do not include
        any "isRoot" members, every table is implicitly part of the root set.
        To serialize such a schema in a way that can be read by older OVSDB
        tools, specify 'default_is_root' as True.
        FrY   r^   r   r   r]   r[   c                 S   s   g | ]}|j ‘qS r   )r
   )rP   r   r   r   r   rS     s    z'TableSchema.to_json.<locals>.<listcomp>)rY   r   r   r   r
   r   r3   rZ   ra   rb   r[   re   )r   r4   r   r   r   rj   r   r   r   r3   å   s"   

€

zTableSchema.to_jsonNrA   )	rB   rC   rD   ra   rb   r   rF   r.   r3   r   r   r   r   r-   ­   s    
ÿ
,r-   c                   @   s.   e Zd Zi fdd„Zed	dd„ƒZdd„ ZdS )
rc   c                 C   s(   || _ || _|| _|| _d| _|| _d S )NF)r
   rY   r=   r   rd   r\   )r   r
   rY   r=   Útype_r\   r   r   r   r     s   
zColumnSchema.__init__Fc           	      C   s´   t jj | d| ¡}| dtgd¡}| dtgd¡}tg}| tg¡ t jj	j
 | d|¡¡}|r:| dtgi ¡}ni }| ¡  |sQ|j ¡ sO|jrQ|j ¡ rQd}t||| ||ƒS )Nzschema for column %srY   TÚ	ephemeralFr   r\   )r   r   r   r$   r&   r_   r'   Úextendr(   r8   ÚTyper.   r%   r)   r   Úis_weak_refr   rc   )	r   r
   r   r   rY   rl   Ú_typesrk   r\   r   r   r   r.     s"   ÿÿzColumnSchema.from_jsonc                 C   s>   d| j  ¡ i}| jsd|d< | jsd|d< | jr| j|d< |S )Nr   FrY   Trl   r\   )r   r3   rY   r=   r\   )r   r   r   r   r   r3   &  s   
zColumnSchema.to_jsonNrA   )rB   rC   rD   r   rF   r.   r3   r   r   r   r   rc     s
    rc   )r*   ra   Úovs.db.parserr   Úovs.db.typesÚovs.dbr   r   Úobjectr   rG   rX   r-   rc   r   r   r   r   Ú<module>   s   `Z