U
    {i+                     @   sb   d dl Z d dlZd dlZd dlZG dd dZedkr^d dlmZ eddZedZ	ee	 dS )	    Nc                   @   s   e Zd ZdZd*eeedddZeeddd	Zd
d Zd+ee	e
dddZdd ZdgfddZg fee
dddZee
dddZd,ee	dddZd-ee	dddZee
dd d!d"Zed#d$d%Zd&d' Zd(d) ZdS ).gn_mysqlz0Classe generica para uso do banco de dados mysql F)clientedbdebugc                 C   s,   d| _ |r(|| _|| _|| _| || d S )Nznow())resetvadWorldsr   r   r   connectByCliente)selfr   r   r    r
   ;/home/www/html/webservice/gn_integracao/generic/gn_mysql.py__init__   s    zgn_mysql.__init__)r   r   c                    s   d|   d}t|}|   fdd}|d}|d}|ddd	}|d
dtd}	|d|d	}|ddd	}
|ddd	}|ddd	}|ddd	}| j|||||	|
|||d	 W 5 Q R X d S )Nz/user/bindib/aplicativos/z/appConfig.inic                    sR     |  d}z$|d }|dt| dd W S    |dd Y S X d S )N=   type
r   defaultr   )splitgetstr)keykwargsZ	split_keyrestdadosr
   r   
get_config#   s    z-gn_mysql.connectByCliente.<locals>.get_configusuariosenhahost	localhost)r   port  )r   r   r   ssl_car   ssl_certssl_keyssl_verify_certF)	r   userpasswdr   r   r!   r"   r#   r$   )loweropenreadintpydb_connection)r	   r   r   pathZ_configr   r   r   r   r   r!   r"   r#   r$   r
   r   r   r      s    

zgn_mysql.connectByClientec                 K   s   t j|d|dd|d|d|d|dd|d	d rt|d	d |d
d |dd |ddddnd d| _d S )Nr   r   r    r%   r&   r   
autocommitTr!   r"   r#   r$   F)cacertr   Zverify_certcheck_hostname)r   r   r%   r&   r   r-   ssl)pymysqlconnectr   conexao)r	   r   r
   r
   r   r+   H   s"    






zgn_mysql.pydb_connectionr
   )sqlparamsreturnc                 C   s$   d}|  ||\}}|s|S | S )z
            Metodo para select
            @param  {String} sql     - sql a ser executado
            @return {Array}  retorno - array com os dados do retorno do sql
        F)
executesqlfetchall)r	   r5   r6   	resultadoresulterrorr
   r
   r   select\   s
    zgn_mysql.selectc           	      K   s   d |dg }| }d |ddg}|dd}|rDd| pFd}d	| d
| d| }| |\}}|rt|S d|kr|d dkr| pi S | S d S )N AND where,fields*tabler   zWHERE zSELECT z FROM  Z	onlyFirstT)joinr   r8   Zfetchoner9   )	r	   r   r?   Zwhere_queryrA   rC   r5   r;   r<   r
   r
   r   simple_select   s    zgn_mysql.simple_selectz1=1c                 C   s*   d |}d| dd | }| |S )Nr>   zDELETE FROM z WHERE )rE   r8   )r	   rC   r?   Z	query_andr5   r
   r
   r   delete   s    
zgn_mysql.delete)rC   datac                 C   s   t |tr
g }|D ]F}|| }| jt|}|| jkrDd| d}|| d|  qd| dd| dd| d}| |S )	Receme um objeto ou array de objetos e monta o insert no banco 
        
        Arguments:
            table {str} -- Tabela que serao inseridos os dados 
            data {[{}]} -- objeto com os dados, tambem aceita um array de objetos
        'r   z
            UPDATE z 
            SET r@   z 
            WHERE 1=1 AND r>   z
            
        	
isinstancelistr4   Zescape_stringr   r   appendrE   r8   )r	   rC   rH   r?   Zupdatescolvalr5   r
   r
   r   update   s     

zgn_mysql.updatec                 C   s   t |tr
g }g }|D ]F}|| }| jt|}|| jkrHd| d}|| || qd| dd| dd| d}| |S )rI   rJ   z
            INSERT INTO z (
                r@   z'
            ) VALUES(
                z
            )
        rK   )r	   rC   rH   insertvaluesrO   rP   r5   r
   r
   r   rR      s$    


	zgn_mysql.insert)r5   r6   c              
   C   sB   |g}| j tjj"}||| | W  5 Q R  S Q R X d S N)r4   cursorr2   cursors
DictCursorZcallprocr9   )r	   r5   r6   argsrU   r
   r
   r   callProc   s    zgn_mysql.callProcc                 C   s   | j tjjd}z |s$|| n||| W n< tjk
rn } zd|f W Y W  5 Q R  S d }~X Y nX W 5 Q R X |dfS )NF)r4   rU   r2   rV   rW   ZexecuteError)r	   r5   r6   rU   Z
MySQLErrorr
   r
   r   r8      s    4zgn_mysql.executesqlN)rC   arrr7   c                 C   s   |D ]}|  || qdS )z 
            INSERE UMA LISTA 
            TODO: melhorias de insert
            hoje faz de um a um o insert, implementar para fazer todos de uma vez, usar parametro no insert para dizer se deve ou nao inserir
        N)rR   )r	   rC   r[   rR   r
   r
   r   
insertList  s    zgn_mysql.insertList)r7   c                 C   sh   |D ]^}t || tjr*t|| ||< n t || tjrJt|| ||< | ||| \}||< q|S rT   )rL   decimalDecimalfloatdatetimedater   fixTypes_customization)r	   rowr   r
   r
   r   fixTypes  s    zgn_mysql.fixTypesc                 C   s   ||fS rT   r
   )r	   namevaluer
   r
   r   rb   (  s    zgn_mysql.fixTypes_customizationc                 C   s   | j   dS )z%Destrutor fecha a conexao com o bancoN)r4   close)r	   r
   r
   r   __del__+  s    zgn_mysql.__del__)r   r   F)r
   )r
   )r
   )__name__
__module____qualname____doc__r   boolr   r   r+   tuplerM   r=   rF   rG   rQ   rR   rY   r8   r\   objectrd   rb   rh   r
   r
   r
   r   r   
   s   /(	#$r   __main__)pprintZ
JVMALDANERZebs_app_pedidos3zSELECT * FROM TBCONDPGTO)
r2   r]   configparserr`   r   ri   rq   bancor=   r:   r
   r
   r
   r   <module>   s     *

