ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@sdZddlZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd l m Z dd l m Z dd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZedddddddddd 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~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgZdejfdYZdeej fdYZ deej!fdYZ!dej"fdYZ#ie#ej"6Z$i ed6ed6ed6ed6ed6ed 6ed 6ed 6ed 6ed 6e d6e!d6ed6Z%de j&fdYZ'dej j(fdYZ)dej j*fdYZ+dej j,fdYZ-de j.fdYZ/de j0fdYZ1dS(s .. dialect:: firebird :name: Firebird .. note:: The Firebird dialect within SQLAlchemy **is not currently supported**. The dialect is not tested within continuous integration and is likely to have many issues and caveats not currently handled. Firebird Dialects ----------------- Firebird offers two distinct dialects_ (not to be confused with a SQLAlchemy ``Dialect``): dialect 1 This is the old syntax and behaviour, inherited from Interbase pre-6.0. dialect 3 This is the newer and supported syntax, introduced in Interbase 6.0. The SQLAlchemy Firebird dialect detects these versions and adjusts its representation of SQL accordingly. However, support for dialect 1 is not well tested and probably has incompatibilities. Locking Behavior ---------------- Firebird locks tables aggressively. For this reason, a DROP TABLE may hang until other transactions are released. SQLAlchemy does its best to release transactions as quickly as possible. The most common cause of hanging transactions is a non-fully consumed result set, i.e.:: result = engine.execute("select * from table") row = result.fetchone() return Where above, the ``ResultProxy`` has not been fully consumed. The connection will be returned to the pool and the transactional state rolled back once the Python garbage collector reclaims the objects which hold onto the connection, which often occurs asynchronously. The above use case can be alleviated by calling ``first()`` on the ``ResultProxy`` which will fetch the first row and immediately close all remaining cursor/connection resources. RETURNING support ----------------- Firebird 2.0 supports returning a result set from inserts, and 2.1 extends that to deletes and updates. This is generically exposed by the SQLAlchemy ``returning()`` method, such as:: # INSERT..RETURNING result = table.insert().returning(table.c.col1, table.c.col2).\ values(name='foo') print result.fetchall() # UPDATE..RETURNING raises = empl.update().returning(empl.c.id, empl.c.salary).\ where(empl.c.sales>100).\ values(dict(salary=empl.c.salary * 1.1)) print raises.fetchall() .. _dialects: http://mc-computing.com/Databases/Firebird/SQL_Dialect.html iN(texc(tsql(ttypes(tutil(tdefault(t reflection(tcompiler(t expression(t quoted_name(tBIGINT(tBLOB(tDATE(tFLOAT(tINTEGER(tInteger(tNUMERIC(tSMALLINT(tTEXT(tTIME(t TIMESTAMPtactivetaddtadmintaftertalltaltertandtanytastasct ascendingtattautotavgtbeforetbegintbetweentbigintt bit_lengthtblobtbothtbytcasetcasttchart charactertcharacter_lengtht char_lengthtchecktclosetcollatetcolumntcommitt committedtcomputedt conditionaltconnectt constraintt containingtcounttcreatetcrosstcstringtcurrenttcurrent_connectiont current_datet current_rolet current_timetcurrent_timestamptcurrent_transactiont current_usertcursortdatabasetdatetdaytdectdecimaltdeclareRtdeletetdesct descendingt disconnecttdistincttdotdomaintdoubletdroptelsetendt entry_pointtescapet exceptiontexecutetexiststexittexternaltextracttfetchtfiletfiltertfloattfortforeigntfromtfulltfunctiontgdscodet generatortgen_idtglobaltgranttgroupthavingthourtiftintinactivetindextinnert input_typet insensitivetinserttinttintegertintotist isolationtjointkeytleadingtlefttlengthtleveltliketlongtlowertmanualtmaxtmaximum_segmenttmergetmintminutet module_nametmonthtnamestnationaltnaturaltnchartnotnottnulltnumerict octet_lengthtoftontonlytopentoptiontortordertoutert output_typetoverflowtpagetpagest page_sizet parametertpasswordtplantpositiont post_eventt precisiontprimaryt privilegest proceduret protecteds rdb$db_keytreadtrealtrecord_versiontrecreatet recursivet referencestreleasetreservt reservingtretaintreturning_valuestreturnstrevoketrighttrollbacktrowst row_countt savepointtschematsecondtsegmenttselectt sensitivetsettshadowtsharedtsingulartsizetsmallinttsnapshottsometsorttsqlcodet stabilitytstarttstartingtstartst statisticstsub_typetsumtsuspendttabletthenttimet timestampttottrailingt transactionttriggerttrimt uncommittedtuniontuniquetupdatetuppertusertusingtvaluetvaluestvarchartvariabletvaryingtviewtwaittwhentwheretwhiletwithtworktwritetyeart _StringTypecBseZdZddZRS(sBase for Firebird string types.cKs#||_tt|j|dS(N(tcharsettsuperRt__init__(tselfRtkw((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRUs N(t__name__t __module__t__doc__tNoneR(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRRstVARCHARcBs eZdZdZddZRS(sFirebird VARCHAR typeRcKs tt|jd||dS(NR(RRR(RRtkwargs((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR_sN(RRRt__visit_name__RR(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRZstCHARcBs eZdZdZddZRS(sFirebird CHAR typeRcKs tt|jd||dS(NR(RRR(RRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRhsN(RRRRRR(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRcst _FBDateTimecBseZdZRS(cCs d}|S(NcSs9t|tjkr1tj|j|j|jS|SdS(N(ttypetdatetimeRIRRRJ(R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytprocessns((RtdialectR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytbind_processorms (RRR (((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRlstSHORTtLONGtQUADR R RRtINT64tDOUBLERtVARYINGtCSTRINGR tFBTypeCompilercBsGeZdZdZdZdZdZdZdZRS(cKs|j||S(N(tvisit_SMALLINT(Rttype_R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt visit_booleanscKs|j||S(N(tvisit_TIMESTAMP(RRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_datetimescKsdS(NsBLOB SUB_TYPE 1((RRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt visit_TEXTscKsdS(NsBLOB SUB_TYPE 0((RRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt visit_BLOBscCs4t|dd}|dkr"|Sd||fSdS(NRs%s CHARACTER SET %s(tgetattrR(RRtbasicR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt_extend_strings cKs+tt|j||}|j||S(N(RRt visit_CHARR(RRRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRscKsP|js%tjd|jjntt|j||}|j||S(Ns'VARCHAR requires a length on dialect %s( RRt CompileErrorR tnameRRt visit_VARCHARR(RRRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR s  ( RRRRRRRRR (((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRs      t FBCompilercBseZdZeZdZdZdZdZe dZ dZ dZ e Z dZd Zd Zd Zd Zd ZRS(s Firebird specific idiosyncrasiescKsdS(NtCURRENT_TIMESTAMP((RtfnR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_now_funcscKs,d|jj|||jj||fS(Ns%s STARTING WITH %s(Rt_compiler_dispatchR(RtbinarytoperatorR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_startswith_op_binaryscKs,d|jj|||jj||fS(Ns%s NOT STARTING WITH %s(RR%R(RR&R'R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_notstartswith_op_binaryscKs,d|j|j||j|j|fS(Ns mod(%s, %s)(RRR(RR&R'R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_mod_binaryscKs|jjr+tt|j|d||S|rt|jtjr[|j d|jpa|j}|j |j d||d|j j ||S|j |j |SdS(Ntasfromtaliast (R t _version_twoRR!t visit_aliast isinstanceRRt_truncated_labelt_truncated_identifierRtoriginaltpreparert format_alias(RR,R+Rt alias_name((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR/s  0cKs|j|jjd}|j|jjd}t|jjdkrt|j|jjd}d|||fSd||fSdS(NiiisSUBSTRING(%s FROM %s FOR %s)sSUBSTRING(%s FROM %s)(Rtclausestlen(RtfuncRtsRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_substring_funcs cKs2|jjrd|j|Sd|j|SdS(NR/tstrlen(R R.tfunction_argspec(RRiR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_length_funcs cKs9|jdk r1t|jr1|j|j|SdSdS(Nt(R7RR8Rt clause_expr(RR9R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR=scCsdS(Ns FROM rdb$database((R((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt default_fromscKsd|jj|S(Ns gen_id(%s, 1)(R4tformat_sequence(RtseqR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_sequencescKs~d}|jdk r5|d|j|j|7}n|jdk rd|d|j|j|7}n|jrz|d7}n|S(sCalled when building a ``SELECT`` statement, position is just before column list Firebird puts the limit and offset right after the ``SELECT``... R?s FIRST %s sSKIP %s s DISTINCT N(t _limit_clauseRRt_offset_clauset _distinct(RRRtresult((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytget_select_precolumnss    cKsdS(s<Already taken care of in the `get_select_precolumns` method.R?((RRR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt limit_clausescCsHgtj|D]!}|jd|tti^q}ddj|S(Ns RETURNING s, (Rt_select_iterablest_label_select_columnRtTruetFalseR(Rtstmttreturning_colstctcolumns((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytreturning_clauses4(RRRRMtansi_bind_rulesR$R(R)R*RNR/R;R>tvisit_char_length_funcR=RARDRIRJRS(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR!s           t FBDDLCompilercBs eZdZdZdZRS(s!Firebird syntactic idiosyncrasiescCs|jjdk r!tdn|jjdk rBtdn|jjred|jj|jSd|jj|jSdS(s;Generate a ``CREATE GENERATOR`` statement for the sequence.s,Firebird SEQUENCE doesn't support START WITHs.Firebird SEQUENCE doesn't support INCREMENT BYsCREATE SEQUENCE %ssCREATE GENERATOR %sN( telementRRtNotImplementedErrort incrementR R.R4RB(RR<((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_create_sequence&s      cCs>|jjr#d|jj|jSd|jj|jSdS(s9Generate a ``DROP GENERATOR`` statement for the sequence.sDROP SEQUENCE %ssDROP GENERATOR %sN(R R.R4RBRW(RRV((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytvisit_drop_sequence=s     (RRRRZR[(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRV#s tFBIdentifierPreparercBs2eZdZeZejjdgZdZ RS(s)Install Firebird specific reserved words.t_cCs tt|j|dtdS(Nt omit_schema(RR\RRM(RR ((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRRs( RRRtRESERVED_WORDStreserved_wordsRtILLEGAL_INITIAL_CHARACTERSRtillegal_initial_charactersR(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyR\Js   tFBExecutionContextcBseZdZRS(cCs#|jd|jjj||S(s8Get the next value from the sequence using ``gen_id()``.s&SELECT gen_id(%s, 1) FROM rdb$database(t_execute_scalarR tidentifier_preparerRB(RRCR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyt fire_sequenceWs(RRRf(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pyRcVst FBDialectcBsUeZdZdZdZeZeZeZ eZ eZ eZ eZ eZeZeZeZeZeZeZgZeZdZdZdZddZ ddZ!e"j#ddZ$e"j#dd Z%e"j#dd Z&e"j#dd Z'e"j#dd Z(e"j#dd Z)e"j#ddZ*e"j#ddZ+RS(sFirebird dialecttfirebirdicCstt|j|d|jkr4|jdkpOd|jkoO|jdk|_|jstj|_tj|jd|dSdSdS(Nst SELECT rdb$view_source AS view_source FROM rdb$relations WHERE rdb$relation_name=? t view_source(R\RyRzR(RRtt view_nameRRtqrytrpR((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytget_view_definitions  c Kskd}|j|}|j|d|g}g|jD]}|j|d^q:} i| d6dd6S(Ns SELECT se.rdb$field_name AS fname FROM rdb$relation_constraints rc JOIN rdb$index_segments se ON rc.rdb$index_name=se.rdb$index_name WHERE rc.rdb$constraint_type=? AND rc.rdb$relation_name=? s PRIMARY KEYtfnametconstrained_columnsR(RyR\tfetchallRxR( RRtR{RRtkeyqryt tablenameRQtrtpkfields((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytget_pk_constraints ,c Ksl|j|}|j|}d}|j|||gj} | dk rhtd|j| dSdS(Ns SELECT trigdep.rdb$depended_on_name AS fgenerator FROM rdb$dependencies tabdep JOIN rdb$dependencies trigdep ON tabdep.rdb$dependent_name=trigdep.rdb$dependent_name AND trigdep.rdb$depended_on_type=14 AND trigdep.rdb$dependent_type=2 JOIN rdb$triggers trig ON trig.rdb$trigger_name=tabdep.rdb$dependent_name WHERE tabdep.rdb$depended_on_name=? AND tabdep.rdb$depended_on_type=0 AND trig.rdb$trigger_type=1 AND tabdep.rdb$field_name=? AND (SELECT count(*) FROM rdb$dependencies trigdep2 WHERE trigdep2.rdb$dependent_name = trigdep.rdb$dependent_name) = 2 Rt fgenerator(RyR\RzRtdictRx( RRtR{t column_nameRRRtcolnameRtgenr((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytget_column_sequences  cKsd}|j||}|d}|j|}|j||g} g} xtr| j} | dkrqPn|j| d} | d} | dj}|jj |}|dkrt j d|| ft j }nt|tr"| ddkr"td| dd | d d }n{|d!krA|| d}n\|dkr`t| d}n=|dkr| ddkrt}qt}n |}d}| ddk r| dj}|d jjdkstd||dj}|dkrd}qni| d6|d6t| d d6|d6dd6}| j| krjt|ds tcnameRt targetrnameRRRRt targetfname(RyR\Rt defaultdictRxRtlistR( RRtR{RRtfkqryRRQtfksRRtfk((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/dialects/firebird/base.pytget_foreign_keyss     c Ksd}|j||j|g}tjt}x~|D]v}||d} d| kr|j|d| dMs(      !t'