
    Xi2                     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                        e Zd Zej                  dgz   Zi Zd ZddZd ZddZ	d Z
 fdZ fdZd	 Zd
 Z f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                 (     |j                   dd      S )u7    Очищает SQL от лишних символов      )r   )r!   r   s     r$   sql_text_cleanerz$CmfPluginDatasource.sql_text_cleaner[   s    t||FC((    c           
         	 | j                         }|j                         5 }|j                  t        | j	                  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   rB   strreturns_rowskeysfetchall	enumerateappendrG   r:   
isinstancer   r8   r9   )r!   queryparamsr=   
connectionresultrE   rowsrF   rowrow_dictidxcolumnr   r<   	error_msgs                   r$   sql_executezCmfPluginDatasource.sql_execute_   sd   )	335F! Z#++--c%j9!<R)
 &&$kkmG!??,DD# .#%+4W+= >KC$'HE$}37 036u: 0> H-. $+ $$*OO-  '  6  	!_-PQRPST	I!M	LL# !$ 	sA    C? B=C3	C? *C? 3C<8C? <C? ?	E4E<EEc                    	 | 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
        $ rf}d| j                  _        | j                  j	                          t                d| }t        j                  |       t        |d       Y d }~y d }~ww xY w)	NT)r;   rI   u:   Соединение успешно установленоrH   r9   u>   Ошибка подключения к базе данных: abort)
r>   rK   r   sync_statussaver:   commit_with_eventr8   r9   	cmf_alert)r!   r=   rV   r<   r]   s        r$   r	   z$CmfPluginDatasource.sql_connect_test   s    	-3343HF! Z*3'  "  $[    	-&-DKK#KKXYZX[\ILL#it,,	-s5   "A* 0A	A* A'#A* 'A* *	C3ACCc                 *    t         |          ddgz   S )Nr   zplugin.sync_status)supersave_preload_fields)r!   	__class__s    r$   rh   z'CmfPluginDatasource.save_preload_fields   s    w*,:N/OOOrC   c                 b    | j                          | j                          t        |   di |S )N )_calc_plugin_calc_enginerg   rc   )r!   kwargsri   s     r$   rc   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   rb   )r!   s    r$   rm   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    rc   )r!   r   s     r$   rl   z CmfPluginDatasource._calc_plugin   sB    ""%%5tyy%AFKKM DK rC   c                     dd| g}t         j                  j                  |      s t         j                  j                  |      rt	        dd       t        |   |i |S )N
datasourcez==)filteruz   Нельзя удалить источник базы данных, т.к. используется объектами SQLTr`   )ru   CmfDatasourceWikiQuerycountCmfDatasourceFieldQueryre   rg   delete)r!   argsrn   _filterri   s       r$   r}   zCmfPluginDatasource.delete   sg    t,((..g.>&B`B`BfBfnuBfBv  S  [_  `w~t.v..rC   )F)N)__name__
__module____qualname__r   api_methodsr1   r%   r>   rB   r^   r	   rh   rc   rm   rl   r}   __classcell__)ri   s   @r$   r   r   
   s]    %115 K H!!F%N)3j-0P&
1!/ /rC   r   )cmf.include/modules.datasource.fields.cmf_plugin_datasourcer   
sqlalchemyr   r   sqlalchemy.excr   logging	getLoggerr   r8   rk   rC   r$   <module>r      s7     O * *  
		8	${/- {/rC   