3
( È\…  ã               @   sd   d Z ddlmZmZmZ ddlZddlmZ ejeƒG dd„ de	ƒƒZ
ejeƒG dd	„ d	e	ƒƒZdS )
z2Implement the Base class for Driver and Connectioné    )ÚABCMetaÚabstractmethodÚabstractpropertyNé   )ÚDriverRegistryc               @   sL   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZ	ed
d„ ƒZ
dS )Ú
BaseDrivera§  
    class BaseDriver(object):

    This is a base class for different server types.
    Inherit this class to implement different type of database driver
    implementation.

    (For PostgreSQL/EDB Postgres Advanced Server, we will be using psycopg2)

    Abstract Properties:
    -------- ----------
    * Version (string):
        Current version string for the database server

    * libpq_version (string):
        Current version string for the used libpq library

    Abstract Methods:
    -------- -------
    * get_connection(*args, **kwargs)
    - It should return a Connection class object, which may/may not be
      connected to the database server.

    * release_connection(*args, **kwargs)
    - Implement the connection release logic

    * gc()
    - Implement this function to release the connections assigned in the
      session, which has not been pinged from more than the idle timeout
      configuration.
    c             C   s   d S )N© )Úclsr   r   ú8/usr/share/pgadmin4/web/pgadmin/utils/driver/abstract.pyÚVersion5   s    zBaseDriver.Versionc             C   s   d S )Nr   )r	   r   r   r
   Úlibpq_version9   s    zBaseDriver.libpq_versionc             O   s   d S )Nr   )ÚselfÚargsÚkwargsr   r   r
   Úget_connection=   s    zBaseDriver.get_connectionc             O   s   d S )Nr   )r   r   r   r   r   r
   Úrelease_connectionA   s    zBaseDriver.release_connectionc             C   s   d S )Nr   )r   r   r   r
   ÚgcE   s    zBaseDriver.gcN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r   r
   r      s    r   c               @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZed	d
„ ƒZed0dd„ƒZed1dd„ƒZed2dd„ƒZed3dd„ƒZed4dd„ƒZed6dd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed7d(d)„ƒZed*d+„ ƒZed,d-„ ƒZed8d.d/„ƒZdS )9ÚBaseConnectionaß  
    class BaseConnection(object)

        It is a base class for database connection. A different connection
        drive must implement this to expose abstract methods for this server.

        General idea is to create a wrapper around the actual driver
        implementation. It will be instantiated by the driver factory
        basically. And, they should not be instantiated directly.


    Abstract Methods:
    -------- -------
    * connect(**kwargs)
      - Define this method to connect the server using that particular driver
        implementation.

    * execute_scalar(query, params, formatted_exception_msg)
      - Implement this method to execute the given query and returns single
        datum result.

    * execute_async(query, params, formatted_exception_msg)
      - Implement this method to execute the given query asynchronously and
      returns result.

    * execute_void(query, params, formatted_exception_msg)
      - Implement this method to execute the given query with no result.

    * execute_2darray(query, params, formatted_exception_msg)
      - Implement this method to execute the given query and returns the result
        as a 2 dimensional array.

    * execute_dict(query, params, formatted_exception_msg)
      - Implement this method to execute the given query and returns the result
        as an array of dict (column name -> value) format.

    * def async_fetchmany_2darray(records=-1, formatted_exception_msg=False):
      - Implement this method to retrieve result of asynchronous connection and
        polling with no_result flag set to True.
        This returns the result as a 2 dimensional array.
        If records is -1 then fetchmany will behave as fetchall.

    * connected()
      - Implement this method to get the status of the connection. It should
        return True for connected, otherwise False

    * reset()
      - Implement this method to reconnect the database server (if possible)

    * transaction_status()
      - Implement this method to get the transaction status for this
        connection. Range of return values different for each driver type.

    * ping()
      - Implement this method to ping the server. There are times, a connection
        has been lost, but - the connection driver does not know about it. This
        can be helpful to figure out the actual reason for query failure.

    * _release()
      - Implement this method to release the connection object. This should not
        be directly called using the connection object itself.

      NOTE: Please use BaseDriver.release_connection(...) for releasing the
            connection object for better memory management, and connection pool
            management.

    * _wait(conn)
      - Implement this method to wait for asynchronous connection to finish the
        execution, hence - it must be a blocking call.

    * _wait_timeout(conn, time)
      - Implement this method to wait for asynchronous connection with timeout.
        This must be a non blocking call.

    * poll(formatted_exception_msg, no_result)
      - Implement this method to poll the data of query running on asynchronous
        connection.

    * cancel_transaction(conn_id, did=None)
      - Implement this method to cancel the running transaction.

    * messages()
      - Implement this method to return the list of the messages/notices from
        the database server.

    * rows_affected()
      - Implement this method to get the rows affected by the last command
        executed on the server.
    r   é   é   é   é   gš™™™™™É?i † c             K   s   d S )Nr   )r   r   r   r   r
   Úconnect¯   s    zBaseConnection.connectNFc             C   s   d S )Nr   )r   ÚqueryÚparamsÚformatted_exception_msgr   r   r
   Úexecute_scalar³   s    zBaseConnection.execute_scalarTc             C   s   d S )Nr   )r   r   r   r   r   r   r
   Úexecute_async¸   s    zBaseConnection.execute_asyncc             C   s   d S )Nr   )r   r   r   r   r   r   r
   Úexecute_void½   s    zBaseConnection.execute_voidc             C   s   d S )Nr   )r   r   r   r   r   r   r
   Úexecute_2darrayÂ   s    zBaseConnection.execute_2darrayc             C   s   d S )Nr   )r   r   r   r   r   r   r
   Úexecute_dictÇ   s    zBaseConnection.execute_dictc             C   s   d S )Nr   )r   Zrecordsr   r   r   r
   Úasync_fetchmany_2darrayÌ   s    z&BaseConnection.async_fetchmany_2darrayc             C   s   d S )Nr   )r   r   r   r
   Ú	connectedÑ   s    zBaseConnection.connectedc             C   s   d S )Nr   )r   r   r   r
   ÚresetÕ   s    zBaseConnection.resetc             C   s   d S )Nr   )r   r   r   r
   Útransaction_statusÙ   s    z!BaseConnection.transaction_statusc             C   s   d S )Nr   )r   r   r   r
   ÚpingÝ   s    zBaseConnection.pingc             C   s   d S )Nr   )r   r   r   r
   Ú_releaseá   s    zBaseConnection._releasec             C   s   d S )Nr   )r   Úconnr   r   r
   Ú_waitå   s    zBaseConnection._waitc             C   s   d S )Nr   )r   r+   Ztimer   r   r
   Ú_wait_timeouté   s    zBaseConnection._wait_timeoutc             C   s   d S )Nr   )r   r   Z	no_resultr   r   r
   Úpollí   s    zBaseConnection.pollc             C   s   d S )Nr   )r   r   r   r
   Ústatus_messageñ   s    zBaseConnection.status_messagec             C   s   d S )Nr   )r   r   r   r
   Úrows_affectedõ   s    zBaseConnection.rows_affectedc             C   s   d S )Nr   )r   Zconn_idZdidr   r   r
   Úcancel_transactionù   s    z!BaseConnection.cancel_transaction)NF)NT)NF)NF)NFéÿÿÿÿ)r2   F)TF)N)r   r   r   r   ZASYNC_OKZASYNC_READ_TIMEOUTZASYNC_WRITE_TIMEOUTZASYNC_NOT_CONNECTEDZASYNC_EXECUTION_ABORTEDZASYNC_TIMEOUTZASYNC_WAIT_TIMEOUTZASYNC_NOTICE_MAXLENGTHr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r,   r-   r.   r/   r0   r1   r   r   r   r
   r   J   sR   Z      r   )r   Úabcr   r   r   ZsixÚregistryr   Zadd_metaclassÚobjectr   r   r   r   r   r
   Ú<module>
   s   6