ó
¿b›]c           @   sæ   d  Z  d d l Z d d l m Z d d l m Z d d l m Z d d l m Z	 d d	 l m
 Z
 d
 e f d „  ƒ  YZ d e e	 j f d „  ƒ  YZ d e e	 j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e Z d S(   sK  
.. dialect:: firebird+kinterbasdb
    :name: kinterbasdb
    :dbapi: kinterbasdb
    :connectstring: firebird+kinterbasdb://user:password@host:port/path/to/db[?key=value&key=value...]
    :url: http://firebirdsql.org/index.php?op=devel&sub=python

Arguments
----------

The Kinterbasdb backend accepts the ``enable_rowcount`` and ``retaining``
arguments accepted by the :mod:`sqlalchemy.dialects.firebird.fdb` dialect.
In addition, it also accepts the following:

* ``type_conv`` - select the kind of mapping done on the types: by default
  SQLAlchemy uses 200 with Unicode, datetime and decimal support.  See
  the linked documents below for further information.

* ``concurrency_level`` - set the backend policy with regards to threading
  issues: by default SQLAlchemy uses policy 1.  See the linked documents
  below for further information.

.. seealso::

    http://sourceforge.net/projects/kinterbasdb

    http://kinterbasdb.sourceforge.net/dist_docs/usage.html#adv_param_conv_dynamic_type_translation

    http://kinterbasdb.sourceforge.net/dist_docs/usage.html#special_issue_concurrency

iÿÿÿÿN(   t   matchi   (   t	   FBDialect(   t   FBExecutionContexti   (   t   types(   t   utilt   _kinterbasdb_numericc           B   s   e  Z d  „  Z RS(   c         C   s   d „  } | S(   Nc         S   s$   t  |  t j ƒ r t |  ƒ S|  Sd  S(   N(   t
   isinstancet   decimalt   Decimalt   str(   t   value(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   process3   s    
(    (   t   selft   dialectR   (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   bind_processor2   s    	(   t   __name__t
   __module__R   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   1   s   t   _FBNumeric_kinterbasdbc           B   s   e  Z RS(    (   R   R   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   <   s   t   _FBFloat_kinterbasdbc           B   s   e  Z RS(    (   R   R   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   @   s   t   FBExecutionContext_kinterbasdbc           B   s   e  Z e d  „  ƒ Z RS(   c         C   s-   |  j  j d |  j j ƒ r% |  j j Sd Sd  S(   Nt   enable_rowcountiÿÿÿÿ(   t   execution_optionst   getR   R   t   cursort   rowcount(   R   (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   E   s    	
(   R   R   t   propertyR   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   D   s   t   FBDialect_kinterbasdbc           B   sµ   e  Z d  Z e Z e Z e Z e Z	 e
 j e j i e e j 6e e j 6ƒ Z d d e e d „ Z e d „  ƒ Z d d „ Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   t   kinterbasdbiÈ   i   c         K   sP   t  t |  ƒ j |   | |  _ | |  _ | |  _ | |  _ | rL t |  _ n  d  S(   N(	   t   superR   t   __init__R   t	   type_convt   concurrency_levelt	   retainingt   Truet   supports_sane_rowcount(   R   R   R   R   R    t   kwargs(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   _   s    				c         C   s
   t  d ƒ S(   NR   (   t
   __import__(   t   cls(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   dbapio   s    c         C   s   | j  | | p g  ƒ d  S(   N(   t   execute(   R   R   t	   statementt
   parameterst   context(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt
   do_executes   s    c         C   s   | j  |  j ƒ d  S(   N(   t   rollbackR    (   R   t   dbapi_connection(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   do_rollbackx   s    c         C   s   | j  |  j ƒ d  S(   N(   t   commitR    (   R   R-   (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt	   do_commit{   s    c         C   s  | j  d d ƒ } | j d ƒ rG d | d | d f | d <| d =n  | j | j ƒ t j | d t ƒ | j d |  j ƒ } | j d |  j	 ƒ } |  j
 d  k	 rt |  j
 d d  ƒ } | d  k rÜ t |  j
 d	 t ƒ } n  | s|  j
 j d | d | ƒ qn  g  | f S(
   Nt   usernamet   usert   ports   %s/%st   hostR   R   t   initializedt   _initialized(   t   translate_connect_argsR   t   updatet   queryR   t   coerce_kw_typet   intt   popR   R   R&   t   Nonet   getattrt   Falset   init(   R   t   urlt   optsR   R   R5   (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   create_connect_args~   s"    
c         C   s   | j  } | j } |  j | ƒ S(   sÆ   Get the version of the Firebird server used by a connection.

        Returns a tuple of (`major`, `minor`, `build`), three integers
        representing the version of the attached server.
        (   t
   connectiont   server_versiont   _parse_version_info(   R   RD   t   fbconnt   version(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   _get_server_version_info™   s    		c         C   s³   t  d | ƒ } | s( t d | ƒ ‚ n  | j d ƒ d  k rv t g  | j d d d ƒ D] } t | ƒ ^ qV d g ƒ St g  | j d d	 d
 ƒ D] } t | ƒ ^ q d g ƒ Sd  S(   Ns3   \w+-V(\d+)\.(\d+)\.(\d+)\.(\d+)( \w+ (\d+)\.(\d+))?s,   Could not determine version from string '%s'i   i   i   i   t   firebirdi   i   i   t	   interbase(   R    t   AssertionErrort   groupR=   t   tupleR;   (   R   RH   t   mt   x(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyRF   «   s    9c         C   sc   t  | |  j j |  j j f ƒ r[ t | ƒ } d | k pZ d | k pZ d | k pZ d | k St Sd  S(   Ns*   Unable to complete network request to hosts   Invalid connection states   Invalid cursor states   connection shutdown(   R   R&   t   OperationalErrort   ProgrammingErrorR	   R?   (   R   t   eRD   R   t   msg(    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   is_disconnect¹   s    
N(   R   R   t   driverR?   R"   t   supports_sane_multi_rowcountR   t   execution_ctx_clsR!   t   supports_native_decimalR   t   update_copyR   t   colspecsR   t   sqltypest   NumericR   t   FloatR   t   classmethodR&   R=   R+   R.   R0   RC   RI   RF   RU   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyR   O   s,   
					(   t   __doc__R   t   reR    t   baseR   R   t    R   R\   R   t   objectR   R]   R   R^   R   R   R   R   (    (    (    sG   lib/python2.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyt   <module>&   s   y