[Jc)@s"dZddkZddkZddkZddklZlZlZl Z l Z ddk l Z l Z eadeifdYZdeifdYZd eifd YZd eifd YZd eifdYZdeifdYZdeifdYZdeifdYZdeifdYZ dei!fdYZ"dei#fdYZ$dei%fdYZ&h eei6eei6eei6eei6eei6eei'6eei6e ei6e$ei#6e&ei%6eei6e"ei!6Z(h dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66Z)d7Z*d8e i+fd9YZ,d:e i-fd;YZ.e/d<Z0d=e i1i2fd>YZ3d?e i1i4fd@YZ5dAe i1i6fdBYZ7dCe i8fdDYZ9e:dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddddddddddddddddd 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`dadbdcdddedfg#Z;dge i1i<fdhYZ=e.Z>e3e>_?e5e>_@e7e>_Ae9e>_Be=e>_Ce,e>_DdS(is Firebird backend ================ This module implements the Firebird backend, thru the kinterbasdb_ DBAPI module. Firebird dialects ----------------- Firebird offers two distinct dialects_ (not to be confused with the SA ``Dialect`` thing): 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. From the user point of view, the biggest change is in date/time handling: under dialect 1, there's a single kind of field, ``DATE`` with a synonim ``DATETIME``, that holds a `timestamp` value, that is a date with hour, minute, second. Under dialect 3 there are three kinds, a ``DATE`` that holds a date, a ``TIME`` that holds a *time of the day* value and a ``TIMESTAMP``, equivalent to the old ``DATE``. The problem is that the dialect of a Firebird database is a property of the database itself [#]_ (that is, any single database has been created with one dialect or the other: there is no way to change the after creation). SQLAlchemy has a single instance of the class that controls all the connections to a particular kind of database, so it cannot easily differentiate between the two modes, and in particular it **cannot** simultaneously talk with two distinct Firebird databases with different dialects. By default this module is biased toward dialect 3, but you can easily tweak it to handle dialect 1 if needed:: from sqlalchemy import types as sqltypes from sqlalchemy.databases.firebird import FBDate, colspecs, ischema_names # Adjust the mapping of the timestamp kind ischema_names['TIMESTAMP'] = FBDate colspecs[sqltypes.DateTime] = FBDate, Other aspects may be version-specific. You can use the ``server_version_info()`` method on the ``FBDialect`` class to do whatever is needed:: from sqlalchemy.databases.firebird import FBCompiler if engine.dialect.server_version_info(connection) < (2,0): # Change the name of the function ``length`` to use the UDF version # instead of ``char_length`` FBCompiler.LENGTH_FUNCTION_NAME = 'strlen' Pooling connections ------------------- The default strategy used by SQLAlchemy to pool the database connections in particular cases may raise an ``OperationalError`` with a message `"object XYZ is in use"`. This happens on Firebird when there are two connections to the database, one is using, or has used, a particular table and the other tries to drop or alter the same table. To garantee DDL operations success Firebird recommend doing them as the single connected user. In case your SA application effectively needs to do DDL operations while other connections are active, the following setting may alleviate the problem:: from sqlalchemy import pool from sqlalchemy.databases.firebird import dialect # Force SA to use a single connection per thread dialect.poolclass = pool.SingletonThreadPool RETURNING support ----------------- Firebird 2.0 supports returning a result set from inserts, and 2.1 extends that to deletes and updates. To use this pass the column/expression list to the ``firebird_returning`` parameter when creating the queries:: raises = tbl.update(empl.c.sales > 100, values=dict(salary=empl.c.salary * 1.1), firebird_returning=[empl.c.id, empl.c.salary]).execute().fetchall() .. [#] Well, that is not the whole story, as the client may still ask a different (lower) dialect... .. _dialects: http://mc-computing.com/Databases/Firebird/SQL_Dialect.html .. _kinterbasdb: http://sourceforge.net/projects/kinterbasdb iN(texctschemattypestsqltutil(tbasetdefaultt FBNumericcBs)eZdZdZdZdZRS(s-Handle ``NUMERIC(precision,scale)`` datatype.cCs5|idjodSdh|id6|id6SdS(NtNUMERICs!NUMERIC(%(precision)s, %(scale)s)t precisiontscale(R tNoneR (tself((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt get_col_specrscCsdS(N(R (R tdialect((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytbind_processoryscCs |iodSd}|SdS(NcSs&t|tio t|S|SdS(N(t isinstancetdecimaltDecimaltfloat(tvalue((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytprocesss (t asdecimalR (R RR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytresult_processor|s  (t__name__t __module__t__doc__R RR(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRos  tFBFloatcBseZdZdZRS(s%Handle ``FLOAT(precision)`` datatype.cCs%|ipdSdh|id6SdS(NtFLOATsFLOAT(%(precision)s)R (R (R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s (RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRst FBIntegercBseZdZdZRS(sHandle ``INTEGER`` datatype.cCsdS(NtINTEGER((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRstFBSmallIntegercBseZdZdZRS(sHandle ``SMALLINT`` datatype.cCsdS(NtSMALLINT((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRst FBDateTimecBs eZdZdZdZRS(sHandle ``TIMESTAMP`` datatype.cCsdS(Nt TIMESTAMP((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR scCs d}|S(NcSsN|djpt|tio|Stid|id|id|iSdS(Ntyeartmonthtday(R RtdatetimeR#R$R%(R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs   ((R RR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs (RRRR R(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR!s tFBDatecBseZdZdZRS(sHandle ``DATE`` datatype.cCsdS(NtDATE((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR'stFBTimecBseZdZdZRS(sHandle ``TIME`` datatype.cCsdS(NtTIME((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR)stFBTextcBseZdZdZRS(s9Handle ``BLOB SUB_TYPE 1`` datatype (aka *textual* blob).cCsdS(NsBLOB SUB_TYPE 1((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR+stFBStringcBseZdZdZRS(s$Handle ``VARCHAR(length)`` datatype.cCs%|iodh|id6SdSdS(NsVARCHAR(%(length)s)tlengthsBLOB SUB_TYPE 1(R-(R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s (RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR,stFBCharcBseZdZdZRS(s!Handle ``CHAR(length)`` datatype.cCs%|iodh|id6SdSdS(NsCHAR(%(length)s)R-sBLOB SUB_TYPE 1(R-(R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s (RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR.stFBBinarycBseZdZdZRS(s8Handle ``BLOB SUB_TYPE 0`` datatype (aka *binary* blob).cCsdS(NsBLOB SUB_TYPE 0((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR/st FBBooleancBseZdZdZRS(s1Handle boolean values as a ``SMALLINT`` datatype.cCsdS(NR ((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR s(RRRR (((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR0scCstS((R(tr((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytstSHORTcCstS((R(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stLONGcCstS((R(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stQUADcCstS((R(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2sRcCstS((R'(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2sR(cCstS((R)(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2sR*cCst|dS(tflen(R,(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stTEXTcCstd|dd|ddS(R tfprecR tfscalei(R(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stINT64cCstS((R(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stDOUBLEcCstS((R!(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2sR"cCst|dS(R6(R,(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stVARYINGcCst|dS(R6(R.(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stCSTRINGcCs"|ddjo tptS(tstypei(R+R/(R1((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR2stBLOBtfirebird_returningtFBExecutionContextcBseZRS((RR(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRA st FBDialectcBseZdZdZeZeZdZeZ eZ dddZ dZ e e Z dZdZd Zd Zd Zd Zdd ZdZdZdZdZdZdZRS(sFirebird dialecttfirebirdiiicKs)tii||||_||_dS(N(RtDefaultDialectt__init__t type_convtconcurrency_level(R RFRGtkwargs((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyREs cCsddk}|S(Ni(t kinterbasdb(tclsRI((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytdbapis cCs|idd}|ido'd|d|df|d<|d=n|i|i|id|i}|id|i}t o3|idj o#t a|ii d|d|ng|fS(Ntusernametusertports%s/%sthostRFRG( ttranslate_connect_argstgettupdatetquerytpopRFRGt_initialized_kbRKR tTruetinit(R turltoptsRFRG((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytcreate_connect_args"s cCsti|tS(N(tsqltypest adapt_typetcolspecs(R ttypeobj((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyttype_descriptor1scCsddkl}|ii}|i}|d|}|ptd|ntg}|idddD]}|t|ql~S(sGet 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. i(tmatchs0\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+) \w+ (\d+)\.(\d+)s,Could not determine version from string '%s'iii(treR`t connectiontserver_versiontAssertionErrorttupletgrouptint(R RbR`tfbconntversiontmt_[1]tx((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytserver_version_info4s  cCse|o |i}|djodS|i|jo%|ii|i o |iS|SdS(s/Convert the name to lowercase if it is possibleN(trstripR tuppertidentifier_preparert_requires_quotestlower(R tname((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt_normalize_nameKs  - cCsR|djodS|i|jo%|ii|i o |iS|SdS(s6Revert a *normalized* name to its uppercase equivalentN(R RrRpRqRo(R Rs((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt_denormalize_nameXs  - cCs;d}g}|i|D]}||i|dq~S(sDReturn a list of *normalized* table names omitting system relations.sk SELECT r.rdb$relation_name FROM rdb$relations r WHERE r.rdb$system_flag=0 i(texecuteRt(R RbRtsRktrow((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt table_namesbscCsJd}|i||i|g}|i}|dj otStSdS(sAReturn ``True`` if the given table exists, ignoring the `schema`.s SELECT 1 FROM rdb$database WHERE EXISTS (SELECT rdb$relation_name FROM rdb$relations WHERE rdb$relation_name=?) N(RvRutfetchoneR RVtFalse(R Rbt table_nameRttblqrytcRx((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt has_tablels   cCsJd}|i||i|g}|i}|dj otStSdS(s9Return ``True`` if the given sequence (generator) exists.s SELECT 1 FROM rdb$database WHERE EXISTS (SELECT rdb$generator_name FROM rdb$generators WHERE rdb$generator_name=?) N(RvRuRzR RVR{(R Rbt sequence_nametgenqryR~Rx((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt has_sequence|s   cCsit||iiodt|jSt||iio$t|}d|jp d|jStSdS(Ns*Unable to complete network request to hostsInvalid connection statesInvalid cursor state(RRKtOperationalErrortstrtProgrammingErrorR{(R tetmsg((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt is_disconnects   c Csd}d}d}d}|i|i}|i|d|g} g} | iD]} | |i| dqS~ } |i||g} t} xto| i}|djoPnt} |i|d}|o||joqn|g}h}t i |di }|djo.t i dt|d|fti}n ||}|i||| j|d scKs[|o=|i|idt|d|ii||i|iS|i|i|SdS(Ntasfromt (RtoriginalRVtpreparert format_aliast _anonymizeRs(R taliasRRH((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt visit_aliasAs=t substringcCs#|io|i|iSdSdS(Nt(tclausesRt clause_expr(R tfunc((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytfunction_argspecKs cCsdS(Ns FROM rdb$database((R ((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt default_fromQscCsd|ii|S(Ns gen_id(%s, 1)(Rtformat_sequence(R tseq((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytvisit_sequenceTscCs`d}|io|d|i7}n|io|d|i7}n|io|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``... Rs FIRST %d sSKIP %d s DISTINCT (t_limitt_offsett _distinct(R tselecttresult((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytget_select_precolumnsWs   cCsdS(s<Already taken care of in the `get_select_precolumns` method.R((R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt limit_clausefst char_lengthcCs2|idjo |idStt|i|S(sSubstitute the ``length`` function. On newer FB there is a ``char_length`` function, while older ones need the ``strlen`` UDF. R-s%(expr)s(RstLENGTH_FUNCTION_NAMEtsuperRtfunction_string(R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRls cCsg|it}d}g}||D]}||i|dtq'~}|ddi|7}|S(NcssMxF|D]>}t|tiiox|iD] }|Vq-Wq|VqWdS(N(RRt expressiont Selectabletcolumns(tcollistR~tco((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytflatten_columnlistys  twithin_columns_clauses RETURNING s, (RHtRETURNING_KW_NAMERRVtjoin(R Rtstmttreturning_colsRRkR~R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyt_append_returningws   /cCsAtt|i|}t|ijo|i||S|SdS(N(RRt visit_updateRRHR(R t update_stmtR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRscCsAtt|i|}t|ijo|i||S|SdS(N(RRt visit_insertRRHR(R t insert_stmtR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRscCsAtt|i|}t|ijo|i||S|SdS(N(RRt visit_deleteRRHR(R t delete_stmtR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs(RRRRtcompilertDefaultCompilert operatorstcopyRRtmodR{Rt functionsRRRRRRRRRRRR(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyR7s$           tFBSchemaGeneratorcBs eZdZdZdZRS(s!Firebird syntactic idiosincrasiescKs|ii|}|d|ii|ii7}|i|}|dj o|d|7}n|i p |i o|d7}n|S(NRs DEFAULT s NOT NULL( Rt format_columnttypet dialect_implRR tget_column_default_stringR RR(R tcolumnRHtcolspecR((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytget_column_specifications# cCsW|i p|ii|i|i o+|id|ii||indS(s;Generate a ``CREATE GENERATOR`` statement for the sequence.sCREATE GENERATOR %sN( t checkfirstRRRbRsRRRRv(R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs((RRRR R(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs tFBSchemaDroppercBseZdZdZRS(s!Firebird syntactic idiosincrasiescCsV|i p|ii|i|io+|id|ii||indS(s9Generate a ``DROP GENERATOR`` statement for the sequence.sDROP GENERATOR %sN( RRRRbRsRRRRv(R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs'(RRRR(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRstFBDefaultRunnercBseZdZdZRS(s Firebird specific idiosincrasiescCs |id|iii|S(s8Get the next value from the sequence using ``gen_id()``.s&SELECT gen_id(%s, 1) FROM rdb$database(texecute_stringRRpR(R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs (RRRR(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRstactiontactivetaddtadmintaftertalltaltertandtanytastasct ascendingtattautotautoddltavgtbasedtbasenamet base_nametbeforetbegintbetweentbiginttblobtblobedittbuffertbytcachetcascadetcasetcasttchart charactertcharacter_lengthRtchecktcheck_point_lentcheck_point_lengthtclosetcollatet collationR Rt committedt compiletimetcomputedt conditionaltconnectt constraintt containingtcontinuetcounttcreatetcstringtcurrenttcurrent_connectiont current_datet current_rolet current_timetcurrent_timestamptcurrent_transactiont current_userRtdatabasetdateR%tdb_keytdebugtdecRtdeclareRtdeletetdesct descendingtdescribet descriptort disconnecttdisplaytdistincttdotdomaintdoubletdroptechotedittelsetendt entry_pointtescapeteventt exceptionRvtexiststexittexterntexternaltextracttfetchtfiletfilterRtfortforeigntfoundtfree_ittfromtfulltfunctiontgdscodet generatortgen_idtglobaltgototgrantRft group_commit_tgroup_commit_waitthavingthelpthourtift immediatetintinactivetindext indicatorRWtinnertinputt input_typetinsertRgtintegertintotist isolationtisqlRtkeyt lc_messagestlc_typetleftR-tlevtleveltliketlogfiletlog_buffer_sizet log_buf_sizetlongtmanualtmaxtmaximumtmaximum_segmentt max_segmenttmergetmessagetmintminimumtminutet module_nameR$tnamestnationaltnaturaltnchartnotnoautotnottnulltnumerictnum_log_bufferst num_log_bufst octet_lengthtoftontonlytopentoptiontortordertoutertoutputt output_typetoverflowtpaget pagelengthtpagest page_sizet parametertpasswordtplantpositiont post_eventR tpreparetprimaryt privilegest proceduret protectedtpublictquittraw_partitionss rdb$db_keytreadtrealtrecord_versiontrecreatet referencestreleasetreservt reservingtrestricttretaintreturntreturning_valuestreturnstrevoketrighttroleRt row_counttruntimet savepointRtsecondtsegmentRtsettshadowtsharedtshelltshowtsingulartsizetsmallinttsnapshottsometsorttsqlcodetsqlerrort sqlwarningt stabilitytstartingtstartsRtstatict statisticstsub_typetsumtsuspendRt terminatortthenttimet timestampttot transactiont translatet translationttriggerttrimRt uncommittedtuniontuniqueRRRoRMtusingRtvaluestvarchartvariabletvaryingRitviewtwaitt wait_timetweekdaytwhentwhenevertwheretwhiletwithtworktwriteR#tyeardaytFBIdentifierPreparercBseZdZeZdZRS(s)Install Firebird specific reserved words.cCs tt|i|dtdS(Nt omit_schema(RRRERV(R R((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyREs(RRRtRESERVED_WORDStreserved_wordsRE(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pyRs(ERR&RRat sqlalchemyRRRR[RRtsqlalchemy.engineRRR{RUtNumericRtFloatRtIntegerRt SmallintegerRtDateTimeR!R'tTimeR)tTextR+tStringR,tCHARR.tBinaryR/tBooleanR0tDateR]RRtDefaultExecutionContextRARDRBR RRRRtSchemaGeneratorRt SchemaDropperRt DefaultRunnerRRRtIdentifierPreparerRRtstatement_compilertschemageneratort schemadroppert defaultrunnerRtexecution_ctx_cls(((sA/usr/lib/python2.6/site-packages/sqlalchemy/databases/firebird.pytcs$(                            ! d  !