
    +hO                         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
  G d
 de      Z G d dee	j                        Z G d dee	j                        Z G d de      Z G d de      ZeZy)aO  
.. dialect:: firebird+kinterbasdb
    :name: kinterbasdb
    :dbapi: kinterbasdb
    :connectstring: firebird+kinterbasdb://user:password@host:port/path/to/db[?key=value&key=value...]
    :url: https://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::

    https://sourceforge.net/projects/kinterbasdb

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

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

    N)match   )	FBDialect)FBExecutionContext   )types)utilc                       e Zd Zd Zy)_kinterbasdb_numericc                     d }|S )Nc                 P    t        | t        j                        rt        |       S | S N)
isinstancedecimalDecimalstr)values    [/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.pyprocessz4_kinterbasdb_numeric.bind_processor.<locals>.process3   s    %15z!     )selfdialectr   s      r   bind_processorz#_kinterbasdb_numeric.bind_processor2   s    	 r   N)__name__
__module____qualname__r   r   r   r   r   r   1   s    r   r   c                       e Zd Zy)_FBNumeric_kinterbasdbNr   r   r   r   r   r   r   r   <       r   r   c                       e Zd Zy)_FBFloat_kinterbasdbNr    r   r   r   r#   r#   @   r!   r   r#   c                       e Zd Zed        Zy)FBExecutionContext_kinterbasdbc                     | j                   j                  d| j                  j                        r| j                  j
                  S y)Nenable_rowcount)execution_optionsgetr   r'   cursorrowcount)r   s    r   r,   z'FBExecutionContext_kinterbasdb.rowcountE   s:    !!%%t||;;
 ;;'''r   N)r   r   r   propertyr,   r   r   r   r%   r%   D   s     r   r%   c                        e Zd ZdZdZdZdZeZdZ	 e
j                  ej                  ej                  eej"                  ei      Z	 	 	 	 d fd	Zed        ZddZd Zd Zd	 Zd
 Zd Zd Z xZS )FBDialect_kinterbasdbkinterbasdbTFc                 x    t        t        | 
  di | || _        || _        || _        || _        |rd| _        y y )NTr   )superr/   __init__r'   	type_convconcurrency_level	retainingsupports_sane_rowcount)r   r4   r5   r'   r6   kwargs	__class__s         r   r3   zFBDialect_kinterbasdb.__init__`   sF     	#T3=f=."!2"*.D' r   c                     t        d      S )Nr0   )
__import__)clss    r   dbapizFBDialect_kinterbasdb.dbapip   s    -((r   c                 0    |j                  ||xs g        y r   )execute)r   r+   	statement
parameterscontexts        r   
do_executez FBDialect_kinterbasdb.do_executet   s     	y*"23r   c                 :    |j                  | j                         y r   )rollbackr6   r   dbapi_connections     r   do_rollbackz!FBDialect_kinterbasdb.do_rollbacky   s    !!$..1r   c                 :    |j                  | j                         y r   )commitr6   rF   s     r   	do_commitzFBDialect_kinterbasdb.do_commit|   s    /r   c                    |j                  d      }|j                  d      r|d   d|d   |d<   |d= |j                  |j                         t	        j
                  |dt               |j                  d| j                        }|j                  d| j                        }| j                  Ot        | j                  dd       }|t        | j                  d	d
      }|s| j                  j                  ||       g |fS )Nuser)usernameporthost/r4   r5   initialized_initializedF)r4   r5   )translate_connect_argsr*   updatequeryr	   coerce_kw_typeintpopr4   r5   r=   getattrinit)r   urloptsr4   r5   rR   s         r   create_connect_argsz)FBDialect_kinterbasdb.create_connect_args   s    ))6):88F&*6lDLADLVCIID+s3HH[$..9	 HH!7!7
 ::!!$**mTBK" &djj.%H

';L    Dzr   c                 T    |j                   }|j                  }| j                  |      S )zGet 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.
        )
connectionserver_version_parse_version_info)r   r`   fbconnversions       r   _get_server_version_infoz.FBDialect_kinterbasdb._get_server_version_info   s+     &&''''00r   c                 R   t        d|      }|st        d|z        |j                  d      d k7  r7t        |j                  ddd      D cg c]  }t	        |       c}dgz         S t        |j                  dd	d
      D cg c]  }t	        |       c}dgz         S c c}w c c}w )Nz3\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+)( \w+ (\d+)\.(\d+))?z,Could not determine version from string '%s'            firebirdr      r   	interbase)r   AssertionErrorgrouptuplerX   )r   rd   mxs       r   rb   z)FBDialect_kinterbasdb._parse_version_info   s    BG
  >H  771:!''!Q*:;Q#a&;zlJKK!''!Q*:;Q#a&;{mKLL <;s   BB$c                     t        || j                  j                  | j                  j                  f      r't	        |      }d|v xs d|v xs d|v xs
 d|v xs d|v S y)Nz$Error writing data to the connectionz*Unable to complete network request to hostzInvalid connection statezInvalid cursor statezconnection shutdownF)r   r=   OperationalErrorProgrammingErrorr   )r   er`   r+   msgs        r   is_disconnectz#FBDialect_kinterbasdb.is_disconnect   s}    

++TZZ-H-HI
 a&C6#= 0?3F0-40 *S00 )C/ r   )   r   TFr   )r   r   r   driversupports_statement_cacher7   supports_sane_multi_rowcountr%   execution_ctx_clssupports_native_decimalr	   update_copyr   colspecssqltypesNumericr   Floatr#   r3   classmethodr=   rC   rH   rK   r^   re   rb   rx   __classcell__)r9   s   @r   r/   r/   O   s    F#"#( 6"t4NN0	
H /  ) )4
2061$Mr   r/   )__doc__r   rer   baser   r    r   r   r	   objectr   r   r   r   r#   r%   r/   r   r   r   r   <module>r      sv   @    $ ! 6 	183C3C 		/ 	%7 xI xv  r   