U
    ÌZj¥~  ã                à   @   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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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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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dlm!Z! ddlm"Z" ddlm#Z# e$dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—d˜d™dšd›dœd�dždŸd d¡d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÌdÍdÎdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãdädådædçdèdédêdëdìdídîdïdðdñdòdódôdõdöd÷dødùdúdûdüdýgßƒZ%G dþdÿ„ dÿe&ƒZ'G �d �d„ �de'ej!ƒZ(G �d�d„ �de'ej!ƒZ)G �d�d„ �de'ej*ƒZ+G �d�d„ �dej,ƒZ-G �d�d	„ �d	ej.ƒZ/G �d
�d„ �dej.ƒZ0G �d�d„ �dej.ƒZ1G �d�d„ �dej.ƒZ2G �d�d„ �dej3ƒZ4G �d�d„ �dej5ƒZ6eeeee-eeeeeeeeeee1e0eeeeeee#e#e#e(e)eeeeeeeee+ee"e4e/ee e2�dœ,Z7G �d�d„ �dej8ƒZ9G �d�d„ �de
j:ƒZ;G �d�d„ �dej<ƒZ=G �d�d„ �dej>ƒZ?G �d�d„ �dej@ƒZAG �d�d „ �d e
jBƒZCdS (!  aë  

.. dialect:: sybase
    :name: Sybase

.. note::

    The Sybase dialect within SQLAlchemy **is not currently supported**.
    It is not tested within continuous integration and is likely to have
    many issues and caveats not currently handled. Consider using the
    `external dialect <https://github.com/gordthompson/sqlalchemy-sybase>`_
    instead.

.. deprecated:: 1.4 The internal Sybase dialect is deprecated and will be
   removed in a future version. Use the external dialect.

é    N)Úexc)Úschema)Útypes)Úutil)Údefault)Ú
reflection)Úcompiler)Útext)ÚBIGINT)ÚBINARY)ÚCHAR)ÚDATE)ÚDATETIME)ÚDECIMAL)ÚFLOAT)ÚINT)ÚINTEGER)ÚNCHAR)ÚNUMERIC)ÚNVARCHAR)ÚREAL)ÚSMALLINT)ÚTEXT)ÚTIME)Ú	TIMESTAMP)ÚUnicode)Ú	VARBINARY)ÚVARCHARÚaddÚallZalterÚandÚanyÚasÚascÚbackupÚbeginZbetweenÚbigintÚbinaryÚbitÚbottomÚbreakZbyÚcallZ
capabilityZcascadeÚcaseÚcastÚcharZchar_convertÚ	characterÚcheckÚ
checkpointÚcloseÚcommentÚcommitÚconnectÚ
constraintÚcontainsÚcontinueÚconvertÚcreateÚcrossZcubeÚcurrentZcurrent_timestampZcurrent_userÚcursorÚdateZdbspaceZ
deallocateÚdecÚdecimalZdeclarer   ÚdeleteZdeletingÚdescZdistinctÚdoÚdoubleÚdropZdynamicÚelseZelseifZ	encryptedÚendÚendifÚescapeÚexceptÚ	exceptionÚexecÚexecuteÚexistingÚexistsZexternloginÚfetchÚfirstÚfloatÚforÚforceZforeignÚforwardÚfromÚfullZgotoZgrantÚgroupZhavingZholdlockZ
identifiedÚifÚinÚindexZindex_lparenÚinnerZinoutZinsensitiveÚinsertZ	insertingÚinstallZinsteadÚintÚintegerZ
integratedZ	intersectZintoZiqÚisZ	isolationÚjoinÚkeyZlateralÚleftÚlikeÚlockÚloginÚlongÚmatchZ
membershipÚmessageÚmodeÚmodifyZnaturalÚnewÚnoZ
noholdlockÚnotÚnotifyÚnullÚnumericZofÚoffÚonÚopenÚoptionÚoptionsÚorÚorderZothersÚoutÚouterZoverZpassthroughÚ	precisionÚprepareÚprimaryÚprintZ
privilegesÚprocZ	procedureZpublicationZ	raiserrorZreadtextÚrealÚ	referenceZ
referencesÚreleaseÚremoteÚremoveÚrenameZ
reorganizeÚresourceZrestoreZrestrictÚreturnZrevokeÚrightÚrollbackZrollupÚsaveZ	savepointÚscrollÚselectZ	sensitiveÚsessionÚsetZsetuserÚshareÚsmallintZsomeZsqlcodeZsqlstateÚstartÚstopZsubtransZsubtransactionZsynchronizeÚsyntax_errorÚtableÚ	temporaryZthenÚtimeÚ	timestampÚtinyintÚtoÚtopZtranÚtriggerÚtruncateZtsequalZ	unboundedÚunionÚuniqueÚunknownZunsignedÚupdateZupdatingÚuserÚusingÚvalidateÚvaluesÚ	varbinaryÚvarcharÚvariableZvaryingÚviewÚwaitZwaitforÚwhenÚwhereÚwhileZwindowÚwithZ	with_cubeZwith_lparenZwith_rollupZwithinZworkZ	writetextc                   @   s   e Zd ZdZdd„ ZdS )Ú_SybaseUnitypeMixinz-these types appear to return a buffer object.c                 C   s   dd„ }|S )Nc                 S   s   | d k	rt | ƒS d S d S ©N)Ústr)Úvalue© r³   úb/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/dialects/sybase/base.pyÚprocess'  s    z5_SybaseUnitypeMixin.result_processor.<locals>.processr³   )ÚselfÚdialectÚcoltyperµ   r³   r³   r´   Úresult_processor&  s    z$_SybaseUnitypeMixin.result_processorN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¹   r³   r³   r³   r´   r¯   #  s   r¯   c                   @   s   e Zd Zd ZdS )ÚUNICHARN©rº   r»   r¼   Z__visit_name__r³   r³   r³   r´   r¾   0  s   r¾   c                   @   s   e Zd Zd ZdS )Ú
UNIVARCHARNr¿   r³   r³   r³   r´   rÀ   4  s   rÀ   c                   @   s   e Zd Zd ZdS )ÚUNITEXTNr¿   r³   r³   r³   r´   rÁ   8  s   rÁ   c                   @   s   e Zd Zd ZdS )ÚTINYINTNr¿   r³   r³   r³   r´   rÂ   <  s   rÂ   c                   @   s   e Zd Zd ZdS )ÚBITNr¿   r³   r³   r³   r´   rÃ   @  s   rÃ   c                   @   s   e Zd Zd ZdS )ÚMONEYNr¿   r³   r³   r³   r´   rÄ   D  s   rÄ   c                   @   s   e Zd Zd ZdS )Ú
SMALLMONEYNr¿   r³   r³   r³   r´   rÅ   H  s   rÅ   c                   @   s   e Zd Zd ZdS )ÚUNIQUEIDENTIFIERNr¿   r³   r³   r³   r´   rÆ   L  s   rÆ   c                   @   s   e Zd Zd ZdS )ÚIMAGENr¿   r³   r³   r³   r´   rÇ   P  s   rÇ   c                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSybaseTypeCompilerc                 K   s
   |   |¡S r°   )Úvisit_IMAGE©r¶   Útype_Úkwr³   r³   r´   Úvisit_large_binaryU  s    z%SybaseTypeCompiler.visit_large_binaryc                 K   s
   |   |¡S r°   )Ú	visit_BITrÊ   r³   r³   r´   Úvisit_booleanX  s    z SybaseTypeCompiler.visit_booleanc                 K   s
   |   |¡S r°   )Zvisit_NVARCHARrÊ   r³   r³   r´   Úvisit_unicode[  s    z SybaseTypeCompiler.visit_unicodec                 K   s
   d|j  S )NzUNICHAR(%d)©ÚlengthrÊ   r³   r³   r´   Úvisit_UNICHAR^  s    z SybaseTypeCompiler.visit_UNICHARc                 K   s
   d|j  S )NzUNIVARCHAR(%d)rÑ   rÊ   r³   r³   r´   Úvisit_UNIVARCHARa  s    z#SybaseTypeCompiler.visit_UNIVARCHARc                 K   s   dS )NrÁ   r³   rÊ   r³   r³   r´   Úvisit_UNITEXTd  s    z SybaseTypeCompiler.visit_UNITEXTc                 K   s   dS )NrÂ   r³   rÊ   r³   r³   r´   Úvisit_TINYINTg  s    z SybaseTypeCompiler.visit_TINYINTc                 K   s   dS )NrÇ   r³   rÊ   r³   r³   r´   rÉ   j  s    zSybaseTypeCompiler.visit_IMAGEc                 K   s   dS )NrÃ   r³   rÊ   r³   r³   r´   rÎ   m  s    zSybaseTypeCompiler.visit_BITc                 K   s   dS )NrÄ   r³   rÊ   r³   r³   r´   Úvisit_MONEYp  s    zSybaseTypeCompiler.visit_MONEYc                 K   s   dS )NrÅ   r³   rÊ   r³   r³   r´   Úvisit_SMALLMONEYs  s    z#SybaseTypeCompiler.visit_SMALLMONEYc                 K   s   dS )NrÆ   r³   rÊ   r³   r³   r´   Úvisit_UNIQUEIDENTIFIERv  s    z)SybaseTypeCompiler.visit_UNIQUEIDENTIFIERN)rº   r»   r¼   rÍ   rÏ   rÐ   rÓ   rÔ   rÕ   rÖ   rÉ   rÎ   r×   rØ   rÙ   r³   r³   r³   r´   rÈ   T  s   rÈ   ),r&   r_   r`   r‘   r™   zunsigned bigintzunsigned intzunsigned smallintrr   r@   r?   rR   rD   zdouble precisionr�   Z
smallmoneyZmoneyZsmalldatetimeÚdatetimer>   r—   r.   r/   r§   zcharacter varyingzchar varyingZunicharzunicode characterZncharznational charznational characterZnvarcharznchar varyingznational char varyingznational character varyingr	   Zunitextr'   r¦   Úimager(   zlong varcharr˜   Zuniqueidentifierc                   @   s   e Zd Zdd„ Zddd„ZdS )ÚSybaseInspectorc                 C   s   t j | |¡ d S r°   )r   Ú	InspectorÚ__init__)r¶   Úconnr³   r³   r´   rÞ   ¬  s    zSybaseInspector.__init__Nc                 C   s   | j j| j||| jd�S )z3Return the table id from `table_name` and `schema`.©Ú
info_cache)r·   Úget_table_idÚbindrá   )r¶   Ú
table_namer   r³   r³   r´   râ   ¯  s       ÿzSybaseInspector.get_table_id)N)rº   r»   r¼   rÞ   râ   r³   r³   r³   r´   rÜ   «  s   rÜ   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚSybaseExecutionContextFc                 C   s
   t ƒ ‚dS )a‚  Must be implemented by subclasses to accommodate DDL executions.

        "connection" is the raw unwrapped DBAPI connection.   "value"
        is True or False.  when True, the connection should be configured
        such that a DDL can take place subsequently.  when False,
        a DDL has taken place and the connection should be resumed
        into non-autocommit mode.

        N)ÚNotImplementedError)r¶   Ú
connectionr²   r³   r³   r´   Úset_ddl_autocommitº  s    
z)SybaseExecutionContext.set_ddl_autocommitc                 C   s˜   | j r\| jjj}|j}|d k	}|r6|j| jd k| _nd| _| jr\| j 	d| j
j |¡ ¡ | jr”| jsrt d¡‚| jjj d¡ |  | jjjd¡ d S )Nr   FzSET IDENTITY_INSERT %s ONzGThe Sybase dialect only supports DDL in 'autocommit' mode at this time.z-AUTOCOMMIT (Assuming no Sybase 'ddl in tran')T)ZisinsertÚcompiledÚ	statementr•   Ú_autoincrement_columnrc   Zcompiled_parametersÚ_enable_identity_insertr=   rM   r·   Úidentifier_preparerÚformat_tableÚisddlZshould_autocommitr   ZInvalidRequestErrorÚroot_connectionZengineÚloggerÚinforè   rç   )r¶   ZtblZ
seq_columnZinsert_has_sequencer³   r³   r´   Úpre_execÆ  s4    
ÿÿÿÿ
ÿ ÿzSybaseExecutionContext.pre_execc                 C   s>   | j r|  | jd¡ | jr:| j d| jj | j	j
j¡ ¡ d S )NFzSET IDENTITY_INSERT %s OFF)rï   rè   rð   rì   r=   rM   r·   rí   rî   ré   rê   r•   )r¶   r³   r³   r´   Ú	post_execë  s    ÿÿÿz SybaseExecutionContext.post_execc                 C   s*   |   ¡ }| d¡ | ¡ d }| ¡  |S )NzSELECT @@identity AS lastrowidr   )Zcreate_cursorrM   Úfetchoner2   )r¶   r=   Z	lastrowidr³   r³   r´   Úget_lastrowid÷  s
    
z$SybaseExecutionContext.get_lastrowidN)rº   r»   r¼   rì   rè   ró   rô   rö   r³   r³   r³   r´   rå   ·  s
   %rå   c                   @   sh   e Zd ZdZe ejjddddœ¡Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSybaseSQLCompilerTZ	dayofyearÚweekdayZmillisecond)ZdoyZdowZmillisecondsc                 C   s   |S r°   r³   )r¶   r•   r	   r³   r³   r´   Úget_from_hint_text  s    z$SybaseSQLCompiler.get_from_hint_textc                 K   s^   d}|j d k	r&|d| j|j f|Ž 7 }|jd k	rZ|j d krB|d7 }|d| j|jf|Ž 7 }|S )NÚ z ROWS LIMIT z ROWSz OFFSET )Z_limit_clauserµ   Z_offset_clause)r¶   r�   rÌ   r	   r³   r³   r´   Úlimit_clause
  s    


zSybaseSQLCompiler.limit_clausec                 K   s*   | j  |j|j¡}d|| j|jf|Žf S )NzDATEPART("%s", %s))Úextract_mapÚgetÚfieldrµ   Úexpr)r¶   ÚextractrÌ   rþ   r³   r³   r´   Úvisit_extract  s    zSybaseSQLCompiler.visit_extractc                 K   s   dS )Nz	GETDATE()r³   )r¶   ÚfnrÌ   r³   r³   r´   Úvisit_now_func  s    z SybaseSQLCompiler.visit_now_funcc                 C   s   dS )Nrú   r³   )r¶   r�   r³   r³   r´   Úfor_update_clause  s    z#SybaseSQLCompiler.for_update_clausec                 K   s:   d|d< | j |jf|Ž}|r2|  ¡ r*|jr2d| S dS d S )NTZliteral_bindsz
 ORDER BY rú   )rµ   Z_order_by_clauseZis_subqueryZ_limit)r¶   r�   rÌ   Zorder_byr³   r³   r´   Úorder_by_clause   s
    z!SybaseSQLCompiler.order_by_clausec                 C   s   d}|rd}|j | dd|d�S )z=If we have extra froms make sure we render any alias as hint.FT)ÚasfromZiscrudÚashint©Z_compiler_dispatch)r¶   Údelete_stmtÚ
from_tableÚextra_fromsr  r³   r³   r´   Údelete_table_clause*  s       ÿz%SybaseSQLCompiler.delete_table_clausec                    s.   dˆd< dd  ‡ ‡‡fdd„|g| D ƒ¡ S )z4Render the DELETE .. FROM clause specific to Sybase.Tr  zFROM z, c                 3   s$   | ]}|j ˆfd ˆ iˆ—ŽV  qdS )Z	fromhintsNr  ©Ú.0Út©Ú
from_hintsrÌ   r¶   r³   r´   Ú	<genexpr>8  s   ÿz=SybaseSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>)rb   )r¶   r	  r
  r  r  rÌ   r³   r  r´   Údelete_extra_from_clause3  s    þz*SybaseSQLCompiler.delete_extra_from_clauseN)rº   r»   r¼   Zansi_bind_rulesr   Zupdate_copyr   ÚSQLCompilerrü   rù   rû   r  r  r  r  r  r  r³   r³   r³   r´   r÷   ÿ  s   
þ

	r÷   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚSybaseDDLCompilerc           	      K   sò   | j  |¡d | jjj|j|d� }|jd kr8t d¡‚|jj	}||kr¨t
|jtjƒoZ|j}|rx|jphd|jppd }}nd\}}||fdkr–|d7 }qî|d||f 7 }nF|  |¡}|d k	rÆ|d| 7 }|jd k	rî|jrÜ|jræ|d	7 }n|d
7 }|S )Nú )Ztype_expressionzHThe Sybase dialect requires Table-bound columns in order to generate DDLé   )r  r  z	 IDENTITYz IDENTITY(%s,%s)z	 DEFAULT z	 NOT NULLz NULL)ÚpreparerZformat_columnr·   Útype_compilerrµ   Útyper•   r   ÚCompileErrorrë   Ú
isinstancer   Ú	sa_schemaÚSequencer’   Ú	incrementZget_column_default_stringÚnullableZprimary_key)	r¶   ÚcolumnÚkwargsZcolspecZseq_colÚsequencer’   r  r   r³   r³   r´   Úget_column_specification?  s@    
ÿ ÿþÿ
ÿþ



z*SybaseDDLCompiler.get_column_specificationc                 C   s*   |j }d| j |jj¡| j|j dd�f S )Nz
DROP INDEX %s.%sF)Zinclude_schema)Úelementr  Zquote_identifierr•   ÚnameZ_prepared_index_name)r¶   rE   r[   r³   r³   r´   Úvisit_drop_indexk  s
    þz"SybaseDDLCompiler.visit_drop_indexN)rº   r»   r¼   r$  r'  r³   r³   r³   r´   r  >  s   ,r  c                   @   s   e Zd ZeZdS )ÚSybaseIdentifierPreparerN)rº   r»   r¼   ÚRESERVED_WORDSZreserved_wordsr³   r³   r³   r´   r(  s  s   r(  c                       s
  e Zd ZdZdZdZdZdZdZdZ	dZ
i ZeZeZeZeZeZeZg Z‡ fdd„Zdd„ Z‡ fdd	„Zd!dd„Zejd"dd„ƒZdd„ Zejd#dd„ƒZ ejd$dd„ƒZ!ejd%dd„ƒZ"ejdd„ ƒZ#ejd&dd„ƒZ$ejd'dd„ƒZ%ejd(dd„ƒZ&d)dd „Z'‡  Z(S )*ÚSybaseDialectZsybaseFTc                    s$   t jddd� tt| ƒj||Ž d S )Nz¯The Sybase dialect is deprecated and will be removed in a future version. This dialect is superseded by the external dialect https://github.com/gordthompson/sqlalchemy-sybase.z1.4)Úversion)r   Zwarn_deprecatedÚsuperr*  rÞ   )r¶   Úargsr"  ©Ú	__class__r³   r´   rÞ   �  s
    üzSybaseDialect.__init__c                 C   s   |  tdƒjtd�¡S )NzSELECT user_name() as user_name)Úusername)Úscalarr	   Úcolumnsr   ©r¶   rç   r³   r³   r´   Ú_get_default_schema_name–  s    ÿz&SybaseDialect._get_default_schema_namec                    s6   t t| ƒ |¡ | jd k	r,| jdk r,d| _nd| _d S )N)é   é   éÿ   )r,  r*  Ú
initializeZserver_version_infoZmax_identifier_lengthr3  r.  r³   r´   r8  ›  s    ÿþzSybaseDialect.initializeNc                 K   sv   d}|dkr| j }tdƒ}tjrHt|tƒr4| d¡}t|tƒrH| d¡}|j|||d�}| ¡ }|dkrrt	 
|¡‚|S )zÛFetch the id for schema.table_name.

        Several reflection methods require the table id.  The idea for using
        this method is that it can be fetched one time and cached for
        subsequent calls.

        NzÔ
          SELECT o.id AS id
          FROM sysobjects o JOIN sysusers u ON o.uid=u.uid
          WHERE u.name = :schema_name
              AND o.name = :table_name
              AND o.type in ('U', 'V')
        Úascii)Úschema_namerä   )Údefault_schema_namer	   r   Úpy2kr  ÚunicodeÚencoderM   r1  r   ÚNoSuchTableError)r¶   rç   rä   r   rÌ   Útable_idZTABLEID_SQLÚresultr³   r³   r´   râ   ¥  s(    	ÿ




  ÿ
zSybaseDialect.get_table_idc                 K   sz   | j |||| d¡d�}tdƒ}|j||d�}g }|D ]>\}	}
}}}}}}|  |	|
t|ƒt|ƒ||||¡}| |¡ q6|S )Nrá   rà   a*  
          SELECT col.name AS name,
                 t.name AS type,
                 (col.status & 8) AS nullable,
                 (col.status & 128) AS autoincrement,
                 com.text AS 'default',
                 col.prec AS precision,
                 col.scale AS scale,
                 col.length AS length
          FROM systypes t, syscolumns col LEFT OUTER JOIN syscomments com ON
              col.cdefault = com.id
          WHERE col.usertype = t.usertype
              AND col.id = :table_id
          ORDER BY col.colid
        ©r@  )râ   rý   r	   rM   Ú_get_column_infoÚboolÚappend)r¶   rç   rä   r   rÌ   r@  Ú
COLUMN_SQLÚresultsr2  r&  rË   r   ÚautoincrementZdefault_r|   ÚscalerÒ   Zcol_infor³   r³   r´   Úget_columnsÉ  sB       ÿÿ
÷ø
zSybaseDialect.get_columnsc	                 C   sÂ   | j  |d ¡}	i }
|	ttfkr(||f}n0|	tkr8|f}n |	ttttt	t
fkrT|f}nd}|	rh|	||
Ž}	nt d||f ¡ tj}	|r¨| dd¡ ¡ }t ddd„ |¡}nd }t||	|||d�}|S )	Nr³   z*Did not recognize type '%s' of column '%s'ÚDEFAULTrú   z^'(.*)'$c                 S   s
   |   d¡S )Nr  )rX   )Úmr³   r³   r´   Ú<lambda>"  ó    z0SybaseDialect._get_column_info.<locals>.<lambda>)r&  r  r   r   rH  )Úischema_namesrý   r   r   r   r   r   r¾   rÀ   r   r   r   ÚwarnÚsqltypesZNULLTYPEÚreplaceÚstripÚreÚsubÚdict)r¶   r&  rË   r   rH  r   r|   rI  rÒ   r¸   r"  r-  Zcolumn_infor³   r³   r´   rC  ü  s6    

ÿûzSybaseDialect._get_column_infoc                 K   sÂ  | j |||| d¡d�}i }i }g }||dœ||< tdƒ}	|j|	|d�}
i }|
D ]}|d ||d < qP|||< tdƒ}|j||d� ¡ }td	ƒ}|D �]&}|d
 }||k�r8|j||d�}| ¡ }| ¡  |d d dœ}|d k	sî|d | jkrú|d |d< |||< |j|	|d�}
i }|
D ]}|d ||d < �q|||< || }|| }g }g }td|d d ƒD ]2}| 	||d|   ¡ | 	||d|   ¡ �qb||d |d ||d dœ}| 	|¡ q”|S )Nrá   rà   )r&  r   zu
          SELECT c.colid AS id, c.name AS name
          FROM syscolumns c
          WHERE c.id = :table_id
        rB  r&  Úida(  
          SELECT o.name AS name, r.reftabid AS reftable_id,
            r.keycnt AS 'count',
            r.fokey1 AS fokey1, r.fokey2 AS fokey2, r.fokey3 AS fokey3,
            r.fokey4 AS fokey4, r.fokey5 AS fokey5, r.fokey6 AS fokey6,
            r.fokey7 AS fokey7, r.fokey1 AS fokey8, r.fokey9 AS fokey9,
            r.fokey10 AS fokey10, r.fokey11 AS fokey11, r.fokey12 AS fokey12,
            r.fokey13 AS fokey13, r.fokey14 AS fokey14, r.fokey15 AS fokey15,
            r.fokey16 AS fokey16,
            r.refkey1 AS refkey1, r.refkey2 AS refkey2, r.refkey3 AS refkey3,
            r.refkey4 AS refkey4, r.refkey5 AS refkey5, r.refkey6 AS refkey6,
            r.refkey7 AS refkey7, r.refkey1 AS refkey8, r.refkey9 AS refkey9,
            r.refkey10 AS refkey10, r.refkey11 AS refkey11,
            r.refkey12 AS refkey12, r.refkey13 AS refkey13,
            r.refkey14 AS refkey14, r.refkey15 AS refkey15,
            r.refkey16 AS refkey16
          FROM sysreferences r JOIN sysobjects o on r.tableid = o.id
          WHERE r.tableid = :table_id
        z›
          SELECT o.name AS name, u.name AS 'schema'
          FROM sysobjects o JOIN sysusers u ON o.uid = u.uid
          WHERE o.id = :table_id
        Úreftable_idr   r  Úcountzfokey%izrefkey%i)Úconstrained_columnsZreferred_schemaZreferred_tableÚreferred_columnsr&  )
râ   rý   r	   rM   Zfetchallrõ   r2   r;  ÚrangerE  )r¶   rç   rä   r   rÌ   r@  Ztable_cacheZcolumn_cacheZforeign_keysrF  rG  r2  ÚcolZREFCONSTRAINT_SQLZreferential_constraintsZREFTABLE_SQLÚrrX  ÚcZreftableZ
table_infoZreftable_columnsrZ  r[  ÚiZfk_infor³   r³   r´   Úget_foreign_keys/  sz       ÿÿÿ ÿ
ÿ

ÿþûzSybaseDialect.get_foreign_keysc                 K   sŽ   | j |||| d¡d�}tdƒ}|j||d�}g }|D ]R}	g }
td|	d ƒD ]}|
 |	d|f  ¡ qL|	d t|	d	 ƒ|
d
œ}| |¡ q6|S )Nrá   rà   aµ  
          SELECT object_name(i.id) AS table_name,
                 i.keycnt AS 'count',
                 i.name AS name,
                 (i.status & 0x2) AS 'unique',
                 index_col(object_name(i.id), i.indid, 1) AS col_1,
                 index_col(object_name(i.id), i.indid, 2) AS col_2,
                 index_col(object_name(i.id), i.indid, 3) AS col_3,
                 index_col(object_name(i.id), i.indid, 4) AS col_4,
                 index_col(object_name(i.id), i.indid, 5) AS col_5,
                 index_col(object_name(i.id), i.indid, 6) AS col_6,
                 index_col(object_name(i.id), i.indid, 7) AS col_7,
                 index_col(object_name(i.id), i.indid, 8) AS col_8,
                 index_col(object_name(i.id), i.indid, 9) AS col_9,
                 index_col(object_name(i.id), i.indid, 10) AS col_10,
                 index_col(object_name(i.id), i.indid, 11) AS col_11,
                 index_col(object_name(i.id), i.indid, 12) AS col_12,
                 index_col(object_name(i.id), i.indid, 13) AS col_13,
                 index_col(object_name(i.id), i.indid, 14) AS col_14,
                 index_col(object_name(i.id), i.indid, 15) AS col_15,
                 index_col(object_name(i.id), i.indid, 16) AS col_16
          FROM sysindexes i, sysobjects o
          WHERE o.id = i.id
            AND o.id = :table_id
            AND (i.status & 2048) = 0
            AND i.indid BETWEEN 1 AND 254
        rB  r  rY  zcol_%ir&  rŸ   )r&  rŸ   Úcolumn_names)râ   rý   r	   rM   r\  rE  rD  )r¶   rç   rä   r   rÌ   r@  Z	INDEX_SQLrG  Zindexesr^  rb  r`  Ú
index_infor³   r³   r´   Úget_indexes•  s*       ÿÿ
ýzSybaseDialect.get_indexesc                 K   sŽ   | j |||| d¡d�}tdƒ}|j||d�}| ¡ }| ¡  g }	|r€td|d d ƒD ]}
|	 |d|
f  ¡ qX|	|d d	œS g d d	œS d S )
Nrá   rà   ay  
          SELECT object_name(i.id) AS table_name,
                 i.keycnt AS 'count',
                 i.name AS name,
                 index_col(object_name(i.id), i.indid, 1) AS pk_1,
                 index_col(object_name(i.id), i.indid, 2) AS pk_2,
                 index_col(object_name(i.id), i.indid, 3) AS pk_3,
                 index_col(object_name(i.id), i.indid, 4) AS pk_4,
                 index_col(object_name(i.id), i.indid, 5) AS pk_5,
                 index_col(object_name(i.id), i.indid, 6) AS pk_6,
                 index_col(object_name(i.id), i.indid, 7) AS pk_7,
                 index_col(object_name(i.id), i.indid, 8) AS pk_8,
                 index_col(object_name(i.id), i.indid, 9) AS pk_9,
                 index_col(object_name(i.id), i.indid, 10) AS pk_10,
                 index_col(object_name(i.id), i.indid, 11) AS pk_11,
                 index_col(object_name(i.id), i.indid, 12) AS pk_12,
                 index_col(object_name(i.id), i.indid, 13) AS pk_13,
                 index_col(object_name(i.id), i.indid, 14) AS pk_14,
                 index_col(object_name(i.id), i.indid, 15) AS pk_15,
                 index_col(object_name(i.id), i.indid, 16) AS pk_16
          FROM sysindexes i, sysobjects o
          WHERE o.id = i.id
            AND o.id = :table_id
            AND (i.status & 2048) = 2048
            AND i.indid BETWEEN 1 AND 254
        rB  r  rY  zpk_%ir&  )rZ  r&  )râ   rý   r	   rM   rõ   r2   r\  rE  )r¶   rç   rä   r   rÌ   r@  ZPK_SQLrG  ZpksrZ  r`  r³   r³   r´   Úget_pk_constraintÈ  s(       ÿÿþzSybaseDialect.get_pk_constraintc                 K   s    t dƒ}| |¡}dd„ |D ƒS )Nz%SELECT u.name AS name FROM sysusers uc                 S   s   g | ]}|d  ‘qS ©r&  r³   )r  Úsr³   r³   r´   Ú
<listcomp>  s     z2SybaseDialect.get_schema_names.<locals>.<listcomp>)r	   rM   )r¶   rç   rÌ   Z
SCHEMA_SQLZschemasr³   r³   r´   Úget_schema_namesú  s    
zSybaseDialect.get_schema_namesc                 K   sL   |d kr| j }tdƒ}tjr0t|tƒr0| d¡}|j||d�}dd„ |D ƒS )Nz©
          SELECT o.name AS name
          FROM sysobjects o JOIN sysusers u ON o.uid = u.uid
          WHERE u.name = :schema_name
            AND o.type = 'U'
        r9  ©r:  c                 S   s   g | ]}|d  ‘qS rf  r³   r  r³   r³   r´   rh    s     z1SybaseDialect.get_table_names.<locals>.<listcomp>©r;  r	   r   r<  r  r=  r>  rM   )r¶   rç   r   rÌ   Z	TABLE_SQLZtablesr³   r³   r´   Úget_table_names  s    ÿ	

zSybaseDialect.get_table_namesc                 K   sF   |d kr| j }tdƒ}tjr0t|tƒr0| d¡}|j||d�}| ¡ S )Nz 
          SELECT c.text
          FROM syscomments c JOIN sysobjects o ON c.id = o.id
          WHERE o.name = :view_name
            AND o.type = 'V'
        r9  )Ú	view_name)	r;  r	   r   r<  r  r=  r>  rM   r1  )r¶   rç   rm  r   rÌ   ZVIEW_DEF_SQLr©   r³   r³   r´   Úget_view_definition  s    ÿ	

z!SybaseDialect.get_view_definitionc                 K   sL   |d kr| j }tdƒ}tjr0t|tƒr0| d¡}|j||d�}dd„ |D ƒS )Nz©
          SELECT o.name AS name
          FROM sysobjects o JOIN sysusers u ON o.uid = u.uid
          WHERE u.name = :schema_name
            AND o.type = 'V'
        r9  rj  c                 S   s   g | ]}|d  ‘qS rf  r³   )r  Úvr³   r³   r´   rh  B  s     z0SybaseDialect.get_view_names.<locals>.<listcomp>rk  )r¶   rç   r   rÌ   ZVIEW_SQLZviewsr³   r³   r´   Úget_view_names/  s    ÿ	

zSybaseDialect.get_view_namesc                 C   s>   |   |¡ z|  |||¡ W n tjk
r4   Y dS X dS d S )NFT)Z_ensure_has_table_connectionrâ   r   r?  )r¶   rç   rä   r   r³   r³   r´   Ú	has_tableD  s    
zSybaseDialect.has_table)N)N)N)N)N)N)N)N)N))rº   r»   r¼   r&  Zsupports_unicode_statementsZsupports_sane_rowcountZsupports_sane_multi_rowcountZsupports_statement_cacheZsupports_native_booleanZsupports_unicode_bindsZpostfetch_lastrowidZcolspecsrO  rÈ   r  r÷   Zstatement_compilerr  Zddl_compilerr(  r  rÜ   Z	inspectorZconstruct_argumentsrÞ   r4  r8  râ   r   ÚcacherJ  rC  ra  rd  re  ri  rl  rn  rp  rq  Ú__classcell__r³   r³   r.  r´   r*  w  sL   	

$23e21
r*  )Dr½   rT  Z
sqlalchemyr   r   r  r   rQ  r   Zsqlalchemy.enginer   r   Zsqlalchemy.sqlr   r	   Zsqlalchemy.typesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r�   r)  Úobjectr¯   r¾   rÀ   ZUnicodeTextrÁ   ÚIntegerrÂ   Z
TypeEnginerÃ   rÄ   rÅ   rÆ   ZLargeBinaryrÇ   ZGenericTypeCompilerrÈ   rO  rÝ   rÜ   ZDefaultExecutionContextrå   r  r÷   ZDDLCompilerr  ZIdentifierPreparerr(  ZDefaultDialectr*  r³   r³   r³   r´   Ú<module>   s~  € ¡ÿ f'Ó1H?5