
    iJ                     x    d dl  d dlmZ d dlmZmZ d dlmZ d dlZ ej                  e
      Z G d de      Zy)    )*)CmfPluginDatasource)create_enginetext)SQLAlchemyErrorNc                   t     e Zd Zej                  dgz   Zi Zd Zd
dZddZd Z	 fdZ
 fdZd Zd	 Z xZS )r   sql_connect_testc                    | j                  g d       t        j                         5  | j                  j                  j
                  j                  dd      j                  dd      }ddddd	}| j                  dk(  ru|| j                      d
| j                  j                   d| j                  j                  j                          d| d| j                  j                   d| j                   }nt|| j                      d
| j                  j                   d| j                  j                  j                          d| d| j                  j                   d| j                   }ddd       |S # 1 sw Y   S xY w)uH   
        Формирует строку подключения
        )zplugin.ext_urlzplugin.ext_portzplugin.ext_passwordzplugin.ext_logindb_typequery_timeoutzhttp:// zhttps://zpostgresql+psycopg2zmysql+mysqlconnectorzmssql+pymssqloracle)
postgresqlmysqlmssqlr   z://:@z/?service_name=/N)load_fieldscmfutildisable_aclpluginext_urlvaluereplacer   	ext_loginext_passworddecryptext_portname)selfr   dialect_driverconnection_strings       4./modules/datasource/models/cmf_plugin_datasource.py_sql_build_connection_stringz0CmfPluginDatasource._sql_build_connection_string   sp    	  F  	G  " 	kk))//77	2FNNz[]^G 4/("	N ||x'
 &dll34C8M8M7NaPTP[P[PhPhPpPpPrOsy$++"6"6!7tyykS " &dll34C8M8M7NaPTP[P[PhPhPpPpPrOsy$++"6"6!7qE "'	0 ! 1	0 ! s   E E22E<c                    | j                   | j                  v rZ|r?| j                  | j                      j                          | j                  | j                   = n| j                  | j                      S | j                  dg       | j                  dk(  r	 ddl}ddl}d|_        ||j                  d<   	 | j                         }t        |dd	d
| j                  d      }|| j                  | j                   <   |S # t        $ r}t        j                  d|         d}~ww xY w# t        $ r+}t        j                  d| j                    d|         d}~ww xY w)u?   
        Получает или создает engine
        r   r   r   Nz8.3.0	cx_Oracleu1   Драйвер oracle не установлен:    
      F)	pool_sizepool_recyclemax_overflowpool_timeoutechou7   Ошбика создания engine для datasource z: )id_enginesdisposer   r   sysoracledbversionmodulesImportErrorloggererrorr%   r   r   	Exception)r!   refresh_enginer3   r4   er#   engines          r$   _sql_get_or_create_enginez-CmfPluginDatasource._sql_get_or_create_engine4   sC    77dmm#dgg&..0MM$''*}}TWW--)%<<8##* +3K(
	 $ A A C"!!//F &,DMM$''"M  PQRPSTU   	LLRSWSZSZR[[]^_]`ab	s1   C: 4AD$ :	D!DD!$	E-&EEc                 v   	 | j                         }|j                         5 }|j                  t        t	        |            |xs i       }|j
                  r|j                         }|j                         }g }|D ]C  }	i }
t        |      D ]   \  }}|	|   }|d|
|<   t	        |      |
|<   " |j                  |
       E |||j                  dcddd       S 	 ddd       y# 1 sw Y   yxY w# t        $ r?}t        |t              rd| }nd| }t        j                  |       d|dcY d}~S d}~ww xY w)u  
        Выполняет запрос и возвращает результат

        TODO1: Вероятно ещё нужно валидировать запрос
        и запрещать модифицирующие запросы
        (SQL For Confluence выполняет такие запросы но сразу делает rollback транзакции)
        На техкоме обсуждали, что безопасность возлагается на DBA клиента
        N)columnsdatarowcountu2   Ошибка выполнения запроса: u+   Непредвиденная ошибка: Fsuccessmessage)r>   connectexecuter   strreturns_rowskeysfetchall	enumerateappendrB   r:   
isinstancer   r8   r9   )r!   queryparamsr=   
connectionresultr@   rowsrA   rowrow_dictidxcolumnr   r<   	error_msgs                   r$   sql_executezCmfPluginDatasource.sql_execute[   sP   &	335F! Z#++DU,<flK&&$kkmG!??,DD# .#%+4W+= >KC$'HE$}37 036u: 0> H-. $+ $$*OO'  '  0  	!_-PQRPST	I!M	LL# !$ 	sA    C0 B.C$	C0 C0 $C-)C0 -C0 0	D894D3-D83D8c                 N   	 | j                  d      }|j                         5 }d| j                  _        | j                  j	                          dddcd d d        S # 1 sw Y   y xY w# t
        $ r1}d| }t        j                  |       t        |d       Y d }~y d }~ww xY w)NT)r;   rD   u:   Соединение успешно установленоrC   u>   Ошибка подключения к базе данных: )abort)	r>   rF   r   sync_statussaver:   r8   r9   	cmf_alert)r!   r=   rQ   r<   rX   s        r$   r	   z$CmfPluginDatasource.sql_connect_test   s    	-3343HF! Z*3'  "  $[    	-XYZX[\ILL#it,,	-s4   "A* 0A	A* A'#A* 'A* *	B$3'BB$c                 *    t         |          ddgz   S )Nr   zplugin.sync_status)supersave_preload_fields)r!   	__class__s    r$   ra   z'CmfPluginDatasource.save_preload_fields   s    w*,:N/OOO    c                 b    | j                          | j                          t        |   di |S )N )_calc_plugin_calc_enginer`   r]   )r!   kwargsrb   s     r$   r]   zCmfPluginDatasource.save   s-    w|%f%%rc   c                     | j                   ri| j                  | j                  v rP| j                  | j                     j                          | j                  | j                  = d| j                  _        y y y )Ndisabled)
is_changedr0   r1   r2   r   r\   )r!   s    r$   rg   z CmfPluginDatasource._calc_engine   sT    ??tww$--7MM$''"**,dgg&&0DKK#  8?rc   c                     | j                   j                  }|s9t        j                  d| j                        }|j                          || _         y y )Nsql)typer    )r   r   models	CmfPluginr    r]   )r!   r   s     r$   rf   z CmfPluginDatasource._calc_plugin   sB    ""%%5tyy%AFKKM DK rc   )F)N)__name__
__module____qualname__r   api_methodsr1   r%   r>   rY   r	   ra   r]   rg   rf   __classcell__)rb   s   @r$   r   r   
   sN    %115 K H!!F%N0d-(P&
1!rc   r   )cmf.include/modules.datasource.fields.cmf_plugin_datasourcer   
sqlalchemyr   r   sqlalchemy.excr   logging	getLoggerrq   r8   re   rc   r$   <module>r|      s7     O * *  
		8	$j!- j!rc   