
H`Tc           @   s  d  Z  d d l m Z m Z d d l Z d d l m Z d d l m Z d d l m	 Z	 m
 Z
 m Z m Z m Z m Z m Z d	 e j f d
     YZ d e f d     YZ d e f d     YZ d e
 f d     YZ d e f d     YZ d e	 f d     YZ e Z d S(   s  
.. dialect:: postgresql+pg8000
    :name: pg8000
    :dbapi: pg8000
    :connectstring: postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://pythonhosted.org/pg8000/

Unicode
-------

When communicating with the server, pg8000 **always uses the server-side
character set**.  SQLAlchemy has no ability to modify what character set
pg8000 chooses to use, and additionally SQLAlchemy does no unicode conversion
of any kind with the pg8000 backend. The origin of the client encoding setting
is ultimately the CLIENT_ENCODING setting in postgresql.conf.

It is not necessary, though is also harmless, to pass the "encoding" parameter
to :func:`.create_engine` when using pg8000.


.. _pg8000_isolation_level:

pg8000 Transaction Isolation Level
-------------------------------------

The pg8000 dialect offers the same isolation level settings as that
of the :ref:`psycopg2 <psycopg2_isolation_level>` dialect:

* ``READ COMMITTED``
* ``READ UNCOMMITTED``
* ``REPEATABLE READ``
* ``SERIALIZABLE``
* ``AUTOCOMMIT``

.. versionadded:: 0.9.5 support for AUTOCOMMIT isolation level when using
   pg8000.

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`psycopg2_isolation_level`


i   (   t   utilt   exciN(   t
   processors(   t   typesi   (   t	   PGDialectt
   PGCompilert   PGIdentifierPreparert   PGExecutionContextt   _DECIMAL_TYPESt   _FLOAT_TYPESt
   _INT_TYPESt
   _PGNumericc           B   s   e  Z d    Z RS(   c         C   s   |  j  r] | t k r+ t j t j |  j  S| t k sC | t k rG d  St
 j d |   nB | t k rm d  S| t k s | t k r t j St
 j d |   d  S(   Ns   Unknown PG numeric type: %d(   t	   asdecimalR	   R   t   to_decimal_processor_factoryt   decimalt   Decimalt   _effective_decimal_return_scaleR   R
   t   NoneR   t   InvalidRequestErrort   to_float(   t   selft   dialectt   coltype(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   result_processor@   s    	(   t   __name__t
   __module__R   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR   ?   s   t   _PGNumericNoBindc           B   s   e  Z d    Z RS(   c         C   s   d  S(   N(   R   (   R   R   (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   bind_processorW   s    (   R   R   R   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR   V   s   t   PGExecutionContext_pg8000c           B   s   e  Z RS(    (   R   R   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR   [   s   t   PGCompiler_pg8000c           B   s   e  Z d    Z d   Z RS(   c         K   s*   |  j  | j |  d |  j  | j |  S(   Ns    %% (   t   processt   leftt   right(   R   t   binaryt   operatort   kw(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   visit_mod_binary`   s    c         C   s,   d | k r t  j d  n  | j d d  S(   Ns   %%s^   The SQLAlchemy postgresql dialect now automatically escapes '%' in text() expressions to '%%'.t   %(   R    t   warnt   replace(   R   t   text(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   post_process_textd   s    (   R   R   R$   R)   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR   _   s   	t   PGIdentifierPreparer_pg8000c           B   s   e  Z d    Z RS(   c         C   s(   | j  |  j |  j  } | j  d d  S(   NR%   s   %%(   R'   t   escape_quotet   escape_to_quote(   R   t   value(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   _escape_identifierm   s    (   R   R   R.   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR*   l   s   t   PGDialect_pg8000c           B   s   e  Z d  Z e Z e Z d Z e Z e Z	 e
 Z e Z d Z e j e j i e e j 6e e j 6 Z d   Z e d    Z d   Z d   Z d   Z d   Z d	   Z e e  d
  Z! e e  d  Z" d   Z# RS(   t   pg8000t   formatt   use_encodingc         C   s   |  j  rU t |  j  d  rU t g  |  j  j j d  D] } t |  ^ q4  |  _ n	 d |  _ |  j d k |  _ t t	 |   j
 |  d  S(	   Nt   __version__t   .ic   i   i	   i   (   ic   ic   ic   (   i   i	   i   (   t   dbapit   hasattrt   tupleR3   t   splitt   intt   _dbapi_versiont   supports_sane_multi_rowcountt   superR/   t
   initialize(   R   t
   connectiont   x(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR=      s    4	c         C   s
   t  d  S(   NR0   (   t
   __import__(   t   cls(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR5      s    c         C   sO   | j  d d  } d | k r5 t | d  | d <n  | j | j  g  | f S(   Nt   usernamet   usert   port(   t   translate_connect_argsR9   t   updatet   query(   R   t   urlt   opts(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   create_connect_args   s
    c         C   s   d t  |  k S(   Ns   connection is closed(   t   str(   R   t   eR>   t   cursor(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   is_disconnect   s    c         C   s   | j  d d  } t | d  r- | j } n  | d k rE t | _ nz | |  j k r t | _ | j   } | j d |  | j d  | j	   n+ t
 j d | |  j d j |  j  f   d  S(	   Nt   _t    R>   t
   AUTOCOMMITs=   SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %st   COMMITsZ   Invalid value '%s' for isolation_level. Valid isolation levels for %s are %s or AUTOCOMMITs   , (   R'   R6   R>   t   Truet
   autocommitt   _isolation_lookupt   FalseRM   t   executet   closeR   t   ArgumentErrort   namet   join(   R   R>   t   levelRM   (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   set_isolation_level   s     	c         C   s(   d | f GH| j  j d | d f  d  S(   Ns   begin twophasei    t    (   R>   t	   tpc_begin(   R   R>   t   xid(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   do_begin_twophase   s    c         C   s   d | f GH| j  j   d  S(   Ns   prepare twophase(   R>   t   tpc_prepare(   R   R>   R`   (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   do_prepare_twophase   s    c         C   s   | j  j d | d f  d  S(   Ni    R^   (   R>   t   tpc_rollback(   R   R>   R`   t   is_preparedt   recover(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   do_rollback_twophase   s    c         C   s   | j  j d | d f  d  S(   Ni    R^   (   R>   t
   tpc_commit(   R   R>   R`   Re   Rf   (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   do_commit_twophase   s    c         C   s$   g  | j  j   D] } | d ^ q S(   Ni   (   R>   t   tpc_recover(   R   R>   t   row(    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   do_recover_twophase   s    ($   R   R   t   driverRS   t   supports_unicode_statementst   supports_unicode_bindst   default_paramstyleR;   R   t   execution_ctx_clsR   t   statement_compilerR*   t   preparert   description_encodingR    t   update_copyR   t   colspecsR   t   sqltypest   NumericR   t   FloatR=   t   classmethodR5   RJ   RN   R]   Ra   Rc   RV   Rg   Ri   Rl   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyR/   r   s0   
	
					(   t   __doc__R^   R    R   R   R   R   Rw   t   baseR   R   R   R   R   R	   R
   Rx   R   R   R   R   R*   R/   R   (    (    (    sk   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.pyt   <module>5   s   4Y