@Qc@sddlZddlZddlmZddlmZddlmZddl m Z ddl Z ddl Z edddd d d Zd efd YZeje jjdZeje je jfdZeje jdZeje je jdZeje je jjdZeje je jje jdZeje je jjdZeje je jjdZ eje jdZ!eje jj"e jjdZ#eje je jjdZ$eje je jje jdZ%eje je jje je jdZ&eje je jje je jdZ'eje je jje je jdZ(eje je jje je jdZ)eje je jje je jdZ*eje jj+e jje je je jfe j,dZ-eje je jje jj+d Z.eje jj+e jje jd!Z/eje je jje jj0d"Z1eje je jje jj0d#Z2eje je jje jj0d$Z3eje je jje jj0d%Z4eje je jje jj0d&Z5dS('iN(t DefineModule(t db_driver(tfind_object_with_name(tNotConnectedErrortnamet DbGenericREtauthors Oracle Corp.tversions1.0tGenericReverseEngineeringcBseZiZedZedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"edZ#RS( cCstjrtjndS(N(tgrtt query_statust UserInterrupt(tcls((s..\modules\db_generic_re_grt.pytcheck_interruption$s cCs;|j|jkr$|j|jdStd|jdS(Nt connectionsNo open connection to %s(t__id__t _connectionsRthostIdentifier(R tconnection_object((s..\modules\db_generic_re_grt.pytget_connection*scOs"|j|jj|||S(sRetrieves a connection and executes the given query returning a cursor to iterate over results. The remaining positional and keyword arguments are passed with the query to the execute function (Rtcursortexecute(R Rtquerytargstkwargs((s..\modules\db_generic_re_grt.pyt execute_query2scCsGtjtjjtj||_tjj j j j |j|jS(N( R t unserializetostpathtjoint ModuleInfotmoduleDataDirectoryt_rdbmstroottwbt rdbmsMgmttrdbmstappend(R t xml_data_path((s..\modules\db_generic_re_grt.pytinitializeDBMSInfo;s$cCsetjtj}ddl}|j}x4|jD]&\}}|jd|||fq7W|S(Nis %s|%s (%s)(R tListtSTRINGtpyodbct dataSourcestitemsR%(R tresultR*tsourcestkeytvalue((s..\modules\db_generic_re_grt.pytgetDataSourceNamesAs   cCsdgS(Nttablessdb.TabletTables(stablessdb.TableR3((R ((s..\modules\db_generic_re_grt.pytgetSupportedObjectTypesKscCsd|jddS(Ns"%s"t"(treplace(R R((s..\modules\db_generic_re_grt.pytquoteIdentifierQscCs|j}|rt|tjjr|jrt|jtjjr|j|jjd|j|jd|j|jSn?|rt|tjjr|j|jd|j|jS|j|jS(Nt.(townert isinstanceR tclassest db_Schemat db_CatalogR7R(R tobjR9((s..\modules\db_generic_re_grt.pytfullyQualifiedObjectNameUs !>$cCsyq|j|}y(|jjds9tdnWn3tk ro}tjd|jtdnXWntk r}tjd|jtj ||}|stj dt |ntjdi|d6|j |j s(tlisttsetRRR2(R R((s..\modules\db_generic_re_grt.pytgetCatalogNamesscCs5ttd|j|jjd|DS(s;Returns a list of schemata for the given connection object.css|]}|dVqdS(iN((RSRT((s..\modules\db_generic_re_grt.pys stcatalog(RURVRRR2(R Rt catalog_name((s..\modules\db_generic_re_grt.pytgetSchemaNamesscCs;ttd|j|jjd|d|DS(Ncss'|]}|jdkr|jVqdS(tTABLEN(t table_typet table_name(RSRT((s..\modules\db_generic_re_grt.pys sRXtschema(RURVRRR2(R RRYt schema_name((s..\modules\db_generic_re_grt.pyt getTableNamess cCs;ttd|j|jjd|d|DS(Ncss'|]}|jdkr|jVqdS(tVIEWN(R\R](RSRT((s..\modules\db_generic_re_grt.pys sRXR^(RURVRRR2(R RRYR_((s..\modules\db_generic_re_grt.pyt getViewNamess cCsgS(N((R RRYR_((s..\modules\db_generic_re_grt.pytgetTriggerNamesscCs;ttd|j|jjd|d|DS(Ncss|]}|jVqdS(N(tprocedure_name(RSRT((s..\modules\db_generic_re_grt.pys sRXR^(RURVRRt procedures(R RRYR_((s..\modules\db_generic_re_grt.pytgetProcedureNamess cCsgS(N((R RRYR_((s..\modules\db_generic_re_grt.pytgetFunctionNamesscstjdd|j|j||}tjddii}i}i}i} |jdt} |jdt} |jdt} |jdt} d }d }d}xSD]K}|j| rt|j|||nd|<| rt|j|||nd||<|j| ret|j |||t|j |||nd||<| rt|j |||nd||<|||||||d | |<|| |7}tj|d|td d ||d 7}qWd }xD]}d| j|d |}t |j |}|r||| |d }| r|jtjd|tj||||j|jjdt}|jd||j||tjn||7}tj|d||||| |d }| ru|jtjd|tj||||j||tjn||7}tj|d||||| |d }| rJ|jtjd|tj|||tjd d|j|||jtjtjdd t||tjtjn||7}tj|d||||| |d }| r|jtjd|tj||||j||tjnd}tj|d|qtjd||fqW| rtfd|j D}x|j D]}|jkrYq>n|jd |j|d }tjd|jtj||||j||tj||7}tj|d|q>Wntjd d|S( Nis'Reverse engineering catalog informationg?s Preparing...treverseEngineerTablestreverseEngineerTriggerstreverseEngineerViewstreverseEngineerRoutinesg|=gsGathered stats for %sg?g?g333333?s"Reverse engineering tables from %st_rev_eng_progress_flagss%s_tables_first_passs@First pass of table reverse engineering for schema %s completed!s!Reverse engineering views from %ss5Reverse engineering of views for schema %s completed!s$Reverse engineering routines from %sg?s8Reverse engineering of routines for schema %s completed!s$Reverse engineering triggers from %sg?s8Reverse engineering of triggers for schema %s completed!s;The schema %s was not found in the catalog %s. Skipping it.c3s+|]!}|jkr|jVqdS(N(R(RSR^(ttable_count_per_schemat schemata_list(s..\modules\db_generic_re_grt.pys 5ss8Reverse engineering foreign keys for tables in schema %ssASecond pass of table reverse engineering for schema %s completed!sReverse engineering completed!(R t send_progressR treverseEngineerCatalogtgettTruetlenR`RbRfRgRcRtschemataRBtbegin_progress_stepRRt setdefaultRVtdiscardRhtend_progress_stepRjtreverseEngineerProcedurestreverseEngineerFunctionsRit send_warningtsumR(R RRYRntcontextRXtview_count_per_schematroutine_count_per_schemattrigger_count_per_schemattotal_count_per_schemat get_tablest get_triggerst get_viewst get_routinesttotaltitaccumulated_progressR_tschema_progress_shareR^tstep_progress_sharetprogress_flagst total_tables((RmRns..\modules\db_generic_re_grt.pytreverseEngineers   ++ D+**                "   cCs_|jjxK|j|jjd|jD]%}tjj}|d|_t |dt rq|dnd|_ |_ |_ |_t |dt r|d|_nt |dt r|d|_nidd6dd6dd6}|d dk r+|jt|d jd d|_n d|_|d dk|_|jj|q2WdS(NRXiiiiiiiit,isN't'(sN'R(tsimpleDatatypest remove_allRRt getTypeInfoRR R;tdb_SimpleDatatypeR:tinttcharacterMaximumLengthtcharacterOctetLengthtnumericPrecisiontdateTimePrecisiontnumericPrecisionRadixt numericScaletNoneRqRstsplittparameterFormatTypet needsQuotesR%(R RRXttype_rowtsimple_datatypetparameter_format_type_mapping((s..\modules\db_generic_re_grt.pytreverseEngineerUserDatatypesHs" + ;  + cCstjj}||_|j|||j||p@dg}|jjxa|D]Y}tjj}||_||_ t |dr|j ||n|jj |qWW|S(NttreverseEngineerSequences( R R;R=RRRZRtRR<R9thasattrRR%(R RRYRXtschemata_namesR_R^((s..\modules\db_generic_re_grt.pyRpas     c Cs|j|jjdg}d|j|k}|r0|j}|jj|j||j|j}t|d}d}x|D]} t j ||d|j| ft j j } | | _|jj | || _|j|| |j|| |j|| |d7}qW|jd|jnkd}t|jd}xO|jD]D} |j|| t j ||d|j| jf|d7}qSWdS( NRls%s_tables_first_passg|=gsRetrieving table %s.%s...g?s<Reverse engineering of foreign keys in table %s.%s completedi(RRRvRR9R2RR`RsR RoR;tdb_TableR%treverseEngineerTableColumnstreverseEngineerTablePKtreverseEngineerTableIndicestaddtreverseEngineerTableFKs( R RR^Rt is_first_passRXt table_namesRRR]ttable((s..\modules\db_generic_re_grt.pyRhss4   !  $cCs<|j}|j}g|jD]}|jj^q}g|jD]}|jj^qA}td|j|jjD}|j|jj d|jd|jd|j} xx| D]p} t j j } | d| _| ddk| _ | d| _| d | _| d| _d}y'|| d j} |j| }Wnttfk ry|j|j| } Wnrtttfk rd} |jd }d | _d | | j|j|jf}t jd|j|qXd}| | _nXt|tr'|j|| _n|j| qWdS(Ncss!|]}|j|jfVqdS(N(t data_typet type_name(RStdtype((s..\modules\db_generic_re_grt.pys sRXR^RiitYESiiitVARCHARisXColumn datatype "%s" for column "%s" in table "%s.%s" reverse engineered as VARCHAR(255)s %s reverseEngineerTableColumns: i(R9RRtuppert userDatatypestdictRRRtcolumnsR R;t db_Columnt isNotNulltlengthtscalet precisionRtindextKeyErrort ValueErrort TypeErrort NameErrorR{RLtuserTypeR:Rt simpleTypet addColumn(R RRR^RXtdatatypetsimple_datatypes_listtuser_datatypes_listtodbc_datatypest table_columnst column_infotcolumnRt user_datatypetmsg((s..\modules\db_generic_re_grt.pyRs@  %%+6       cCs$|j}|j}t|jdkr?tjd|jdS|j|jjd|jd|jd|jj }|r|j nd}i}xr|j|jj d|jd|jd|jD]:}|j t jkrqn|j|jgj|qWx|jD]\} } tjj} | | _| |krNdnd| _| dj | _| jrwdnd | _xwt| d d D]`}t|j|j} | rtjj} | d |j| _| | _| jj| qqW|j| | jr| |_qqWdS( s9Reverse engineers the primary key(s) for the given table.is~Migration: reverseEngineerTablePKAndIndices: Reverse engineer of table %s was attempted but the table has no columns attributeiRXR^RRtUNIQUEtINDEXR/cSs|dS(Ni((telem((s..\modules\db_generic_re_grt.pytsR8( R9RsRR RDRRRt primaryKeystfetchonetpk_namet statisticsttypetconstanttSQL_TABLE_STATRvt index_nameR%t iteritemsR;tdb_Indext isPrimaryt non_uniquetuniquet indexTypetsortedRt column_nametdb_IndexColumntreferencedColumntaddIndext primaryKey(R RRR^RXt pk_index_rowt pk_index_namet indices_dictRTRtrow_listRRt index_column((s..\modules\db_generic_re_grt.pyRs:  <=     cCsdS(N((R RR((s..\modules\db_generic_re_grt.pyRscsdfd}t|jdkrHtjd|jdS|jj}|j|jji}xQ|j|j jdjd|jD]"}|j |j gj |qWx|j D]\}}|sgt|D]!\} } | jdkr| ^q} gt| | d gD]\} } || | !^q.}gtjtdt|D]}d |^ql}xOt||D](\}}|r|||||qqWq|||||qWdS( s7Reverse engineers the foreign keys for the given table.cSsw|dkrdS|tjkr#dS|tjkr6dS|tjkrIdS|tjkr\dS|tjkrodSdSdS(NRtCASCADEtRESTRICTsSET NULLs NO ACTIONs SET DEFAULT(RRt SQL_CASCADEt SQL_RESTRICTt SQL_SET_NULLt SQL_NO_ACTIONtSQL_SET_DEFAULT(R0((s..\modules\db_generic_re_grt.pyt get_actions c sxtjj}||_||_|dj|_|dj|_d|_ |dj r|t |j |dj n}|dj rt |j|dj n||_x|D]}t |j|j}|stjd|j|jfqnt |jj|j}|s@tjd|j|jjfqn|jj||jj|qW|jj|dS(NisGMigration: reverseEngineerTableFKs: Column "%s" not found in table "%s"(R R;t db_ForeignKeyRR9t delete_rulet deleteRulet update_rulet updateRulet modelOnlyt pktable_schemRRtt pktable_nameR2treferencedTableRt fkcolumn_nameRDt pkcolumn_nameR%treferencedColumnst foreignKeys( RXRtfk_nametfk_rowst foreign_keytreferenced_schematfk_rowRt ref_column(RR^(s..\modules\db_generic_re_grt.pyt process_fk s(   ,/  isuMigration: reverseEngineerTableFKs: Reverse engineer of table %s was attempted but the table has no columns attributeit foreignSchemat foreignTablei@BsFK_generated_%06dN(RsRR RDRR9RRRRRvRR%Rt enumeratetkey_seqtzipRtrandomtsampletrange(R RRRRXtfk_dictRTRt fk_columnstidxtitemtindicesRtjtslicestidt random_namestslicet random_name((R^Rs..\modules\db_generic_re_grt.pyRs*    4 465cCsJxC|j||jj|jD]#}tjd|j|fqWdS(Ns:%s reverseEngineerViews: Cannot reverse engineer view "%s"i(RbR9RR RBRL(R RR^t view_name((s..\modules\db_generic_re_grt.pyRj@s%!cCsJxC|j||jj|jD]#}tjd|j|fqWdS(NsD%s reverseEngineerProcedures: Cannot reverse engineer procedure "%s"i(RfR9RR RBRL(R RR^Rd((s..\modules\db_generic_re_grt.pyRyGs%!cCsJxC|j||jj|jD]#}tjd|j|fqWdS(NsB%s reverseEngineerFunctions: Cannot reverse engineer function "%s"i(RgR9RR RBRL(R RR^t function_name((s..\modules\db_generic_re_grt.pyRzOs%!cCsJxC|j||jj|jD]#}tjd|j|fqWdS(Ns@%s reverseEngineerTriggers: Cannot reverse engineer trigger "%s"i(RcR9RR RBRL(R RR^t trigger_name((s..\modules\db_generic_re_grt.pyRiWs%!($t__name__t __module__Rt classmethodR RRR'R1R4R7R?RCRIRJRLRRRWRZR`RbRcRfRgRRRpRhRRRRRjRyRzRi(((s..\modules\db_generic_re_grt.pyR!sB   "  }$,.JcCs tjdS(Nsgeneric_rdbms_info.xml(RR'(((s..\modules\db_generic_re_grt.pyR'`scCs tjS(N(RR1(((s..\modules\db_generic_re_grt.pyR1dscCs tjS(N(RR4(((s..\modules\db_generic_re_grt.pyR4iscCs tj|S(N(RR7(R((s..\modules\db_generic_re_grt.pyR7nscCs tj|S(N(RR?(R>((s..\modules\db_generic_re_grt.pyR?sscCstj||S(N(RRC(RRF((s..\modules\db_generic_re_grt.pyRCxscCs tj|S(N(RRI(R((s..\modules\db_generic_re_grt.pyRI}scCs tj|S(N(RRJ(R((s..\modules\db_generic_re_grt.pyRJscCs tjS(N(RRL(((s..\modules\db_generic_re_grt.pyRLscCs tj|S(N(RRR(R((s..\modules\db_generic_re_grt.pyRRscCs tj|S(N(RRW(R((s..\modules\db_generic_re_grt.pyRWscCstj||S(N(RRZ(RRY((s..\modules\db_generic_re_grt.pyRZscCstj|||S(N(RR`(RRYR_((s..\modules\db_generic_re_grt.pyR`scCstj|||S(N(RRb(RRYR_((s..\modules\db_generic_re_grt.pyRbscCstj|||S(N(RRc(RRYR_((s..\modules\db_generic_re_grt.pyRcscCstj|||S(N(RRf(RRYR_((s..\modules\db_generic_re_grt.pyRfscCstj|||S(N(RRg(RRYR_((s..\modules\db_generic_re_grt.pyRgscCstj||||S(N(RR(RRYRnR}((s..\modules\db_generic_re_grt.pyRscCstj||S(N(RR(RRX((s..\modules\db_generic_re_grt.pyRscCstj||S(N(RRp(RRY((s..\modules\db_generic_re_grt.pyRpscCstj||S(N(RRh(RR^((s..\modules\db_generic_re_grt.pyRhscCstj||S(N(RRj(RR^((s..\modules\db_generic_re_grt.pyRjscCstj||S(N(RRy(RR^((s..\modules\db_generic_re_grt.pyRyscCstj||S(N(RRz(RR^((s..\modules\db_generic_re_grt.pyRzscCstj||S(N(RRi(RR^((s..\modules\db_generic_re_grt.pyRis(6R tos.pathRR"Rt workbenchRtworkbench.utilsRtworkbench.exceptionsRR tSQLEXTRRtobjectRtexportR;t db_mgmt_RdbmsR'tLISTR)R1R4R7tGrtNamedObjectR?tINTtdb_mgmt_ConnectionRCRIRJRLRMRRRWRZR`RbRcRfRgR=tDICTRRRpR<RhRjRyRzRi(((s..\modules\db_generic_re_grt.pytsH    A$!$*$$'$*00000B------