3
?­`Í-  ã               @   sø   d dl Z d dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZ ejjZdd„ Zdd„ Zdd	d
„Zdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS ) é    N)ÚpeekÚconsume)Úto_php_identifierÚ	PHPStringÚPHPArrayÚPHPDictÚ
PHPLiteralc             C   s>   | dkrdS | j }|d dkr6|d dkr6|dd… S |S dS )z1 unescape an SQL name, e.g. convert `abc` to abc Nr   ú`é   éÿÿÿÿr   )Úvalue)ÚtokÚv© r   ú[/home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/rad/sql.pyÚget_name   s    r   c             C   s   dj | jddƒƒS )Nz'{}'ú'z'')ÚformatÚreplace)Úsr   r   r   Úsql_build_string   s    r   Fc             C   sÒ   |rt tjdƒrtƒ  tƒ S | d k	r.t| ƒ}ntƒ }|jtjjjkrRt	t
|jƒƒS |jtjjkrltt|ƒƒS |jtjkrŠ|jdkrŠtdƒS |jtjkr¨|jdkr¨tdƒS tjjƒ  tdj|j|ƒƒ t|jƒS d S )NÚNULLÚCURRENT_TIMESTAMPÚCURRENT_DATEz"Unrecognized value of type {}: {}.)r   ÚTÚKeywordr   Ú	NullValueÚttypeÚLiteralÚNumberÚIntegerÚIntegerValueÚintr   ÚStringÚStringValueÚsql_parse_stringÚDateTimeValueÚradÚconsoleÚwarnÚprintr   ÚLiteralValue)Ú	type_hintÚ
allow_nullr   r   r   r   Úparse_sql_value   s$    

r.   c             C   sZ   | j dd… }| jtjjjkr*|jddƒS | jtjjjkrF|jddƒS tdj	| jƒƒ‚d S )Nr
   z''r   z\"ú"zUnknown string token type {}r   )
r   r   r   r   r#   ÚSingler   ÚSymbolÚ
ValueErrorr   )ÚtokenÚvalr   r   r   r%   5   s    r%   c               @   sp   e Zd Zd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d„Zdd„ ZdS )ÚTableNc             C   s0   || _ tjƒ | _d | _tƒ | _tƒ | _|| _d S )N)	ÚnameÚcollectionsÚOrderedDictÚcolumnsÚprimary_keyÚsetÚunique_keysÚforeign_keysÚsource_file)Úselfr6   r>   r   r   r   Ú__init__B   s    
zTable.__init__c             C   s0   |j | jkr tdj|j | j ƒƒ‚|| j|j < d S )Nz)Column '{}' defined twice for table '{}'.)r6   r9   r2   r   )r?   Úcolumnr   r   r   Ú
add_columnJ   s    zTable.add_columnc             C   s
   || j kS )N)r9   )r?   r6   r   r   r   Ú
has_columnP   s    zTable.has_columnc             C   s0   x*|D ]"}| j |ƒstdj||| jƒƒ‚qW d S )Nz8Unknown column '{}' encountered while {} for table '{}'.)rC   r2   r   r6   )r?   r9   ÚdescriptionÚcolr   r   r   Úcheck_columnsS   s
    

zTable.check_columnsc             C   sx   | j d k	rtdj| jƒƒ‚| j|dƒ xF|D ]>}| j| jtj@ rTtdj|| jƒƒ‚| j|  jtj	O  _q,W || _ d S )Nz+Primary key specified twice for table '{}'.zadding a primary keyz;Primary key cannot contain NULL column '{}' for table '{}'.)
r:   r2   r   r6   rF   r9   ÚflagsÚColumnÚ	FLAG_NULLÚFLAG_NOTNULL)r?   ÚpkrE   r   r   r   Úset_primary_keyZ   s    


zTable.set_primary_keyc             C   s   | j |dƒ | jj|ƒ d S )Nzadding a unique key)rF   r<   Úadd)r?   Úukr   r   r   Úadd_unique_keye   s    zTable.add_unique_keyc             C   s&   | j t|jjƒ ƒdƒ | jj|ƒ d S )Nzadding a foreign key)rF   Úlistr9   Úkeysr=   rM   )r?   Úfkr   r   r   Úadd_foreign_keyi   s    zTable.add_foreign_keyc             C   s   | j S t| j tjdƒd�S )Nr   r9   )Úkey)r=   r*   Úlenr;   ÚsortedÚoperatorÚ
attrgetter)r?   r   r   r   Úforeign_keys_sortedm   s
       zTable.foreign_keys_sortedc             C   s>   t |ƒdkst‚| j|krdS x| jD ]}||kr&dS q&W dS )Nr   TF)rU   ÚAssertionErrorr:   r<   )r?   r9   rN   r   r   r   Ú	is_uniquew   s    
zTable.is_uniquec             C   s   dt | jƒjƒ  S )NZTable_)r   r6   Ú
capitalize)r?   r   r   r   Úget_php_class€   s    zTable.get_php_classFc             C   sæ   g }x$t | jjƒ ƒD ]}|j|jƒ ƒ qW | jd k	r\t| jƒdkr\|jddj| jƒ d ƒ x&| jD ]}|jddj|ƒ d ƒ qdW x| j	ƒ D ]}|j|jƒ ƒ qŽW |r¶dj
| jƒ}nd}|d| j d	 7 }|d
j|ƒ7 }|d7 }|S )Nr   zPRIMARY KEY (`z`, `z`)zUNIQUE KEY (`zDROP TABLE IF EXISTS `{}`;
Ú zCREATE TABLE `z` (
  z,
  z&
) ENGINE=InnoDB DEFAULT CHARSET=utf8;)rP   r9   ÚvaluesÚappendÚto_sqlr:   rU   Újoinr<   rY   r   r6   )r?   Zadd_dropÚlinesrE   rN   rR   Úsqlr   r   r   ra   ƒ   s     zTable.to_sqlc                sª  | j ƒ }g }|jdj|ƒƒ |jdƒ |jdƒ |jdƒ |jdj|ƒƒ |jdƒ |jdƒ |jdƒ |jd	ƒ |jd
ƒ |jdjt| jƒtdd„ t| jjƒ ƒD ƒdd�ƒƒ |jdjt‡ fdd„| j	ƒ D ƒƒƒƒ |jdƒ |jdƒ |jdƒ |jdƒ |jdƒ tdd„ t
| jƒD ƒƒ}|jdj|ƒƒ |jdƒ x6t| jjƒ ƒD ] }|jtj@ �rJt|jƒ}P �qJW d}|jdƒ |jdj|ƒƒ |jdƒ |jdƒ dj|ƒS )Nzclass {} extends R\Table {{z$    private static $instance = null;z*    public static function getInstance() {z'        if (self::$instance === null) {z'            self::$instance = new {}();z	        }z        return self::$instance;z    }z    private $foreignKeys;z&    protected function __construct() {z#       parent::__construct({}, {});c             S   s   g | ]}|j ƒ ‘qS r   )Úto_php)Ú.0rE   r   r   r   ú
<listcomp>¬   s    z Table.to_php.<locals>.<listcomp>T)Ú	multilinez       $this->foreignKeys = {};c                s   g | ]}|j ˆ ƒ‘qS r   )re   )rf   rR   )Úschema_classesr   r   rg   ¯   s    z&    public function getForeignKeys() {z"        return $this->foreignKeys;z%    public function getPrimaryKey() {c             S   s   g | ]}t |ƒ‘qS r   )r   )rf   rE   r   r   r   rg   ¶   s    z        return {};Únullz%    public function getAutoColumn() {ú}Ú
)r]   r`   r   r   r6   r   rP   r9   r_   rY   rV   r:   rG   rH   Ú	FLAG_AUTOr   rb   )r?   ri   Zcls_namerc   Zpk_phprE   Zauto_columnr   )ri   r   re   œ   sH    

















zTable.to_php)N)F)Ú__name__Ú
__module__Ú__qualname__r@   rB   rC   rF   rL   rO   rS   rY   r[   r]   ra   re   r   r   r   r   r5   A   s   

	
r5   c               @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
S )rH   r
   é   é   c             C   s   || _ || _d| _d | _d S )Nr   )r6   ÚtyperG   Údefault_value)r?   r6   Úctyper   r   r   r@   Ì   s    zColumn.__init__c             C   s˜   g }|j d| j d ƒ |j | jjƒ ƒ | jtj@ r>|j dƒ | jtj@ rT|j dƒ | jd k	rx|j dƒ |j | jjƒ ƒ | jtj	@ rŽ|j dƒ dj
|ƒS )Nr	   zNOT NULLr   ÚDEFAULTÚAUTO_INCREMENTú )r`   r6   rs   ra   rG   rH   rJ   rI   rt   rm   rb   )r?   rd   r   r   r   ra   Ñ   s    




zColumn.to_sqlc             C   s|   | j d k	r| j jƒ }nd}g }| jtj@ r4|jdƒ | jtj@ rJ|jdƒ djt| j	ƒ| j
jƒ |t|ƒdkrvdj|ƒndƒS )Nrj   zR\Column::FLAG_AUTOzR\Column::FLAG_NULLABLEznew R\Column({}, {}, {}, {})r   ú|Ú0)rt   re   rG   rH   rm   r`   rI   r   r   r6   rs   rU   rb   )r?   Zdefault_phpZ	flags_phpr   r   r   re   ß   s    


zColumn.to_phpN)	rn   ro   rp   rI   rJ   rm   r@   ra   re   r   r   r   r   rH   Ç   s   rH   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú
ForeignKeyc             C   s   || _ || _|| _|| _d S )N)Útabler9   Ú	on_updateÚ	on_delete)r?   r|   r9   r}   r~   r   r   r   r@   ð   s    zForeignKey.__init__c             C   s   t | j| j| j| jfƒS )N)Úreprr|   r9   r}   r~   )r?   r   r   r   Ú__repr__õ   s    zForeignKey.__repr__c             C   s~   g }t tt | jjƒ ƒŽ ƒ\}}|jdjdj|ƒ| jdj|ƒƒƒ | jd k	rZ|jd| j ƒ | j	d k	rt|jd| j	 ƒ dj|ƒS )Nz4CONSTRAINT FOREIGN KEY (`{}`) REFERENCES `{}` (`{}`)z`, `z
ON UPDATE z
ON DELETE rx   )
rP   Úzipr9   Úitemsr`   r   rb   r|   r}   r~   )r?   rd   Z	cols_fromZcols_tor   r   r   ra   ÷   s    

zForeignKey.to_sqlc             C   sL   t ƒ }x&t| jjƒ ƒD ]\}}t|ƒ||< qW djt| jƒt|| j ƒ|ƒS )Nznew R\ForeignKey({}, {}, {}))r   rP   r9   r‚   r   r   r|   )r?   ri   ZcolmapÚc1Úc2r   r   r   re     s
    zForeignKey.to_phpN)rn   ro   rp   r@   r€   ra   re   r   r   r   r   r{   ï   s   
r{   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r   c             C   s   d S )Nr   )r?   r   r   r   Ú	get_value	  s    zNullValue.get_valuec             C   s   dS )Nr   r   )r?   r   r   r   ra     s    zNullValue.to_sqlc             C   s   dS )Nznew R\NullValue()r   )r?   r   r   r   re     s    zNullValue.to_phpN)rn   ro   rp   r…   ra   re   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r!   c             C   s   t |tƒst‚|| _d S )N)Ú
isinstancer"   rZ   r   )r?   r   r   r   r   r@     s    zIntegerValue.__init__c             C   s   | j S )N)r   )r?   r   r   r   r…     s    zIntegerValue.get_valuec             C   s
   t | jƒS )N)Ústrr   )r?   r   r   r   ra     s    zIntegerValue.to_sqlc             C   s   dj | jƒS )Nznew R\ConstantValue({}))r   r   )r?   r   r   r   re     s    zIntegerValue.to_phpN)rn   ro   rp   r@   r…   ra   re   r   r   r   r   r!     s   r!   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r$   c             C   s   t |tƒst‚|| _d S )N)r†   r‡   rZ   r   )r?   r   r   r   r   r@     s    zStringValue.__init__c             C   s   | j S )N)r   )r?   r   r   r   r…     s    zStringValue.get_valuec             C   s
   t | jƒS )N)r   r   )r?   r   r   r   ra   !  s    zStringValue.to_sqlc             C   s   dj t| jƒƒS )Nznew R\ConstantValue({}))r   r   r   )r?   r   r   r   re   #  s    zStringValue.to_phpN)rn   ro   rp   r@   r…   ra   re   r   r   r   r   r$     s   r$   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r&   c             C   s   |dkst dƒ‚|| _d S )Nr   r   zUnknown DateTime type.)r   r   )rZ   r6   )r?   r6   r   r   r   r@   (  s    zDateTimeValue.__init__c             C   s   | S )Nr   )r?   r   r   r   r…   +  s    zDateTimeValue.get_valuec             C   s   | j S )N)r6   )r?   r   r   r   ra   -  s    zDateTimeValue.to_sqlc             C   s   dj | jƒS )Nz(new R\DateTimeValue(R\DateTimeValue::{}))r   r6   )r?   r   r   r   re   /  s    zDateTimeValue.to_phpN)rn   ro   rp   r@   r…   ra   re   r   r   r   r   r&   &  s   r&   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r+   c             C   s
   || _ d S )N)Úliteral)r?   rˆ   r   r   r   r@   3  s    zLiteralValue.__init__c             C   s   | j S )N)rˆ   )r?   r   r   r   ra   5  s    zLiteralValue.to_sqlc             C   s   | j S )N)rˆ   )r?   r   r   r   r…   7  s    zLiteralValue.get_valuec             C   s&   t jjƒ  tdj| jƒƒ dj| jƒS )Nz,Using unmodified SQL literal as PHP code: {}znew R\ConstantValue({}))r'   r(   r)   r*   r   rˆ   )r?   r   r   r   re   9  s    

zLiteralValue.to_phpN)rn   ro   rp   r@   ra   r…   re   r   r   r   r   r+   2  s   r+   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú
ColumnTypec             C   s   || _ || _d S )N)r6   Úargs)r?   r6   rŠ   r   r   r   r@   @  s    zColumnType.__init__c             C   s8   t | jƒdkr.dj| jdjdd„ | jD ƒƒƒS | jS d S )Nr   z{}({})ú,c             S   s   g | ]}|j ƒ ‘qS r   )ra   )rf   r4   r   r   r   rg   F  s    z%ColumnType.to_sql.<locals>.<listcomp>)rU   rŠ   r   r6   rb   )r?   r   r   r   ra   C  s    zColumnType.to_sqlc             C   s.   dd„ | j D ƒ}dj| jjƒ djtt|ƒƒƒS )Nc             S   s   g | ]}t |jƒ ƒ‘qS r   )r   r…   )rf   Úargr   r   r   rg   J  s    z%ColumnType.to_php.<locals>.<listcomp>znew R\{}Type({})z, )rŠ   r   r6   r\   rb   Úmapr‡   )r?   Zargs_phpr   r   r   re   I  s    zColumnType.to_phpN)rn   ro   rp   r@   ra   re   r   r   r   r   r‰   ?  s   r‰   )NF)r7   ÚsqlparserW   Úrad.consoler'   Ú
rad.parserr   r   Zrad.phpr   r   r   r   r   ÚtokensÚTokenr   r   r   r.   r%   r5   rH   r{   r   r!   r$   r&   r+   r‰   r   r   r   r   Ú<module>   s(   

 (