
    Bi                         d dl  d dlmZ d dlmZmZ d dlmZ d dl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                         }t	        |ddd| j
                  d      }|| j                  | j                   <   |S # t        $ r+}t        j                  d| j                    d|         d}~ww xY w)	u?   
        Получает или создает engine
           
      F)	pool_sizepool_recyclemax_overflowpool_timeoutechou7   Ошбика создания engine для datasource z: N)	id_enginesdisposer%   r   r   	Exceptionloggererror)r!   refresh_enginer#   enginees        r$   _sql_get_or_create_enginez-CmfPluginDatasource._sql_get_or_create_engine9   s     77dmm#dgg&..0MM$''*}}TWW--	 $ A A C"!!//F &,DMM$''"M 	LLRSWSZSZR[[]^_]`ab	s   4AB: :	C.&C))C.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)r8   connectexecuter   strreturns_rowskeysfetchall	enumerateappendr<   r2   
isinstancer   r3   r4   )r!   queryparamsr6   
connectionresultr:   rowsr;   rowrow_dictidxcolumnr   r7   	error_msgs                   r$   sql_executezCmfPluginDatasource.sql_executeT   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)r5   r>   u:   Соединение успешно установленоr=   u>   Ошибка подключения к базе данных: )abort)	r8   r@   r   sync_statussaver2   r3   r4   	cmf_alert)r!   r6   rK   r7   rR   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$   r[   z'CmfPluginDatasource.save_preload_fields   s    w*,:N/OOO    c                 b    | j                          | j                          t        |   di |S )N )_calc_plugin_calc_enginerZ   rW   )r!   kwargsr\   s     r$   rW   zCmfPluginDatasource.save   s-    w|%f%%r]   c                     | j                   ri| j                  | j                  v rP| j                  | j                     j                          | j                  | j                  = d| j                  _        y y y )Ndisabled)
is_changedr/   r0   r1   r   rV   )r!   s    r$   ra   z CmfPluginDatasource._calc_engine   sT    ??tww$--7MM$''"**,dgg&&0DKK#  8?r]   c                     | j                   j                  }|s9t        j                  d| j                        }|j                          || _         y y )Nsql)typer    )r   r   models	CmfPluginr    rW   )r!   r   s     r$   r`   z CmfPluginDatasource._calc_plugin   sB    ""%%5tyy%AFKKM DK r]   )F)N)__name__
__module____qualname__r   api_methodsr0   r%   r8   rS   r	   r[   rW   ra   r`   __classcell__)r\   s   @r$   r   r      sM    %115 K H!!F60d-(P&
1!r]   r   )cmf.include/modules.datasource.fields.cmf_plugin_datasourcer   
sqlalchemyr   r   sqlalchemy.excr   loggingsys	getLoggerrk   r3   r_   r]   r$   <module>rw      s:     O * *  
 
		8	$^!- ^!r]   