U
    ”0cÍ-  ã                   @   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   ú`éÿÿÿÿé   ©Úvalue)ÚtokÚv© r   ú[/home/gitlab-runner/builds/AH7KJJS4/0/bergerc/fluidmanager-web/art-framework/bin/rad/sql.pyÚget_name   s    r   c                 C   s   d  |  dd¡¡S )Nz'{}'ú'ú'')Ú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 ¡  td |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(    

 ÿr0   c                 C   sZ   | j dd… }| jtjjjkr*| dd¡S | jtjjjkrF| dd¡S td 	| j¡ƒ‚d S )Nr   r
   r   r   z\"ú"zUnknown string token type {})
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 ¡ | _d | _tƒ | _tƒ | _|| _d S ©N)	ÚnameÚcollectionsÚOrderedDictÚcolumnsÚprimary_keyÚsetÚunique_keysÚforeign_keysÚsource_file)Úselfr9   rA   r   r   r   Ú__init__B   s    
zTable.__init__c                 C   s0   |j | jkr td |j | j ¡ƒ‚|| j|j < d S )Nz)Column '{}' defined twice for table '{}'.)r9   r<   r4   r   )rB   Úcolumnr   r   r   Ú
add_columnJ   s     ÿzTable.add_columnc                 C   s
   || j kS r8   )r<   ©rB   r9   r   r   r   Ú
has_columnP   s    zTable.has_columnc                 C   s,   |D ]"}|   |¡std ||| j¡ƒ‚qd S )Nz8Unknown column '{}' encountered while {} for table '{}'.)rG   r4   r   r9   )rB   r<   ÚdescriptionÚcolr   r   r   Úcheck_columnsS   s    
  ÿÿzTable.check_columnsc                 C   st   | j d k	rtd | j¡ƒ‚|  |d¡ |D ]>}| j| jtj@ rRtd || j¡ƒ‚| j|  jtj	O  _q*|| _ d S )Nz+Primary key specified twice for table '{}'.zadding a primary keyz;Primary key cannot contain NULL column '{}' for table '{}'.)
r=   r4   r   r9   rJ   r<   ÚflagsÚColumnÚ	FLAG_NULLÚFLAG_NOTNULL)rB   ÚpkrI   r   r   r   Úset_primary_keyZ   s    
ÿzTable.set_primary_keyc                 C   s   |   |d¡ | j |¡ d S )Nzadding a unique key)rJ   r?   Úadd)rB   Úukr   r   r   Úadd_unique_keye   s    zTable.add_unique_keyc                 C   s&   |   t|j ¡ ƒd¡ | j |¡ d S )Nzadding a foreign key)rJ   Úlistr<   Úkeysr@   rQ   )rB   Úfkr   r   r   Úadd_foreign_keyi   s    zTable.add_foreign_keyc                 C   s   | j S t| j t d¡d�S )Nr   r<   )Úkey)r@   r,   Úlenr>   ÚsortedÚoperatorÚ
attrgetter©rB   r   r   r   Úforeign_keys_sortedm   s
       zTable.foreign_keys_sortedc                 C   s<   t |ƒdkst‚| j|krdS | jD ]}||kr$ dS q$dS )Nr   TF)rY   ÚAssertionErrorr=   r?   )rB   r<   rR   r   r   r   Ú	is_uniquew   s    

zTable.is_uniquec                 C   s   dt | jƒ ¡  S )NZTable_)r   r9   Ú
capitalizer]   r   r   r   Úget_php_class€   s    zTable.get_php_classFc                 C   sÚ   g }t | j ¡ ƒD ]}| | ¡ ¡ q| jd k	rXt| jƒdkrX| dd | j¡ d ¡ | jD ]}| dd |¡ d ¡ q^|  	¡ D ]}| | ¡ ¡ q„|rªd 
| j¡}nd}|d| j d	 7 }|d
 |¡7 }|d7 }|S )Nr   zPRIMARY KEY (`ú`, `z`)zUNIQUE KEY (`zDROP TABLE IF EXISTS `{}`;
Ú zCREATE TABLE `z` (
  z,
  z&
) ENGINE=InnoDB DEFAULT CHARSET=utf8;)rT   r<   ÚvaluesÚappendÚto_sqlr=   rY   Újoinr?   r^   r   r9   )rB   Zadd_dropÚlinesrI   rR   rV   Úsqlr   r   r   rg   ƒ   s     
zTable.to_sqlc              
      sª  |   ¡ }g }| d |¡¡ | d¡ | d¡ | d¡ | d |¡¡ | d¡ | d¡ | d¡ | d	¡ | d
¡ | d t| jƒtdd„ t| j ¡ ƒD ƒdd�¡¡ | d t‡ fdd„|  	¡ D ƒƒ¡¡ | d¡ | d¡ | d¡ | d¡ | d¡ tdd„ t
| jƒD ƒƒ}| d |¡¡ | d¡ t| j ¡ ƒD ]$}|jtj@ �rHt|jƒ} �qr�qHd}| d¡ | d |¡¡ | d¡ | d¡ d |¡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 | ]}|  ¡ ‘qS r   ©Úto_php©Ú.0rI   r   r   r   Ú
<listcomp>¬   s     z Table.to_php.<locals>.<listcomp>T)Ú	multilinez       $this->foreignKeys = {};c                    s   g | ]}|  ˆ ¡‘qS r   rk   )rn   rV   ©Úschema_classesr   r   ro   ¯   s     z&    public function getForeignKeys() {z"        return $this->foreignKeys;z%    public function getPrimaryKey() {c                 S   s   g | ]}t |ƒ‘qS r   )r   rm   r   r   r   ro   ¶   s     z        return {};Únullz%    public function getAutoColumn() {ú}Ú
)rb   rf   r   r   r9   r   rT   r<   re   r^   rZ   r=   rK   rL   Ú	FLAG_AUTOr   rh   )rB   rr   Zcls_nameri   Zpk_phprI   Zauto_columnr   rq   r   rl   œ   sN    







ÿþÿ










zTable.to_php)N)F)Ú__name__Ú
__module__Ú__qualname__rC   rE   rG   rJ   rP   rS   rW   r^   r`   rb   rg   rl   r   r   r   r   r7   A   s   

	
r7   c                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
S )rL   r   é   é   c                 C   s   || _ || _d| _d | _d S )Nr   )r9   ÚtyperK   Údefault_value)rB   r9   Úctyper   r   r   rC   Ì   s    zColumn.__init__c                 C   s˜   g }|  d| j d ¡ |  | j ¡ ¡ | jtj@ r>|  d¡ | jtj@ rT|  d¡ | jd k	rx|  d¡ |  | j ¡ ¡ | jtj	@ rŽ|  d¡ d 
|¡S )Nr	   zNOT NULLr   ÚDEFAULTÚAUTO_INCREMENTú )rf   r9   r|   rg   rK   rL   rN   rM   r}   rv   rh   )rB   rj   r   r   r   rg   Ñ   s    




zColumn.to_sqlc                 C   s|   | j d k	r| j  ¡ }nd}g }| jtj@ r4| d¡ | jtj@ rJ| d¡ d t| j	ƒ| j
 ¡ |t|ƒdkrvd |¡nd¡S )Nrs   zR\Column::FLAG_AUTOzR\Column::FLAG_NULLABLEznew R\Column({}, {}, {}, {})r   ú|Ú0)r}   rl   rK   rL   rv   rf   rM   r   r   r9   r|   rY   rh   )rB   Zdefault_phpZ	flags_phpr   r   r   rl   ß   s    


  þzColumn.to_phpN)	rw   rx   ry   rM   rN   rv   rC   rg   rl   r   r   r   r   rL   Ç   s   rL   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 r8   )Útabler<   Ú	on_updateÚ	on_delete)rB   r…   r<   r†   r‡   r   r   r   rC   ð   s    zForeignKey.__init__c                 C   s   t | j| j| j| jfƒS r8   )Úreprr…   r<   r†   r‡   r]   r   r   r   Ú__repr__õ   s    zForeignKey.__repr__c              	   C   s~   g }t tt | j ¡ ƒŽ ƒ\}}| d d |¡| jd |¡¡¡ | jd k	rZ| d| j ¡ | j	d k	rt| d| j	 ¡ d |¡S )Nz4CONSTRAINT FOREIGN KEY (`{}`) REFERENCES `{}` (`{}`)rc   z
ON UPDATE z
ON DELETE r�   )
rT   Úzipr<   Úitemsrf   r   rh   r…   r†   r‡   )rB   rj   Z	cols_fromZcols_tor   r   r   rg   ÷   s      ÿ

zForeignKey.to_sqlc                 C   sH   t ƒ }t| j ¡ ƒD ]\}}t|ƒ||< qd t| jƒt|| j ƒ|¡S )Nznew R\ForeignKey({}, {}, {}))r   rT   r<   r‹   r   r   r…   )rB   rr   ZcolmapÚc1Úc2r   r   r   rl     s     ÿzForeignKey.to_phpN)rw   rx   ry   rC   r‰   rg   rl   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 r8   r   r]   r   r   r   Ú	get_value	  s    zNullValue.get_valuec                 C   s   dS )Nr   r   r]   r   r   r   rg     s    zNullValue.to_sqlc                 C   s   dS )Nznew R\NullValue()r   r]   r   r   r   rl     s    zNullValue.to_phpN)rw   rx   ry   rŽ   rg   rl   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 r8   )Ú
isinstancer$   r_   r   ©rB   r   r   r   r   rC     s    zIntegerValue.__init__c                 C   s   | j S r8   r   r]   r   r   r   rŽ     s    zIntegerValue.get_valuec                 C   s
   t | jƒS r8   )Ústrr   r]   r   r   r   rg     s    zIntegerValue.to_sqlc                 C   s   d  | j¡S ©Núnew R\ConstantValue({}))r   r   r]   r   r   r   rl     s    zIntegerValue.to_phpN©rw   rx   ry   rC   rŽ   rg   rl   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 r8   )r�   r‘   r_   r   r�   r   r   r   rC     s    zStringValue.__init__c                 C   s   | j S r8   r   r]   r   r   r   rŽ     s    zStringValue.get_valuec                 C   s
   t | jƒS r8   )r   r   r]   r   r   r   rg   !  s    zStringValue.to_sqlc                 C   s   d  t| jƒ¡S r’   )r   r   r   r]   r   r   r   rl   #  s    zStringValue.to_phpNr”   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 )N)r   r   zUnknown DateTime type.)r_   r9   rF   r   r   r   rC   (  s    zDateTimeValue.__init__c                 C   s   | S r8   r   r]   r   r   r   rŽ   +  s    zDateTimeValue.get_valuec                 C   s   | j S r8   )r9   r]   r   r   r   rg   -  s    zDateTimeValue.to_sqlc                 C   s   d  | j¡S )Nz(new R\DateTimeValue(R\DateTimeValue::{}))r   r9   r]   r   r   r   rl   /  s    zDateTimeValue.to_phpNr”   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 r8   ©Úliteral)rB   r–   r   r   r   rC   3  s    zLiteralValue.__init__c                 C   s   | j S r8   r•   r]   r   r   r   rg   5  s    zLiteralValue.to_sqlc                 C   s   | j S r8   r•   r]   r   r   r   rŽ   7  s    zLiteralValue.get_valuec                 C   s&   t j ¡  td | j¡ƒ d | j¡S )Nz,Using unmodified SQL literal as PHP code: {}r“   )r)   r*   r+   r,   r   r–   r]   r   r   r   rl   9  s
    
ÿzLiteralValue.to_phpN)rw   rx   ry   rC   rg   rŽ   rl   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 r8   )r9   Úargs)rB   r9   r˜   r   r   r   rC   @  s    zColumnType.__init__c                 C   s8   t | jƒdkr.d | jd dd„ | jD ƒ¡¡S | jS d S )Nr   z{}({})ú,c                 S   s   g | ]}|  ¡ ‘qS r   )rg   )rn   r6   r   r   r   ro   F  s     z%ColumnType.to_sql.<locals>.<listcomp>)rY   r˜   r   r9   rh   r]   r   r   r   rg   C  s
    ÿzColumnType.to_sqlc                 C   s.   dd„ | j D ƒ}d | j ¡ d tt|ƒ¡¡S )Nc                 S   s   g | ]}t | ¡ ƒ‘qS r   )r   rŽ   )rn   Úargr   r   r   ro   J  s     z%ColumnType.to_php.<locals>.<listcomp>znew R\{}Type({})z, )r˜   r   r9   ra   rh   Úmapr‘   )rB   Zargs_phpr   r   r   rl   I  s    ÿzColumnType.to_phpN)rw   rx   ry   rC   rg   rl   r   r   r   r   r—   ?  s   r—   )NF)r:   Úsqlparser[   Úrad.consoler)   Ú
rad.parserr   r   Zrad.phpr   r   r   r   r   ÚtokensÚTokenr   r   r   r0   r'   r7   rL   r„   r   r#   r&   r(   r-   r—   r   r   r   r   Ú<module>   s(   

 (