Xׯdh ddlZddlZddlmZddlmZddlmZddl m Z ddl Z ddl Z eddd ZGd d eZee jjd Zee je jfd Zee jdZee je jdZee je jjdZee je jje jdZee je jjdZee je jjdZ ee je jjdZ!ee jdZ"ee jj#e jjdZ$ee je jjdZ%ee je jje jdZ&ee je jje je jdZ'ee je jje je jdZ(ee je jje je jdZ)ee je jje je jdZ*ee je jje je jdZ+ee jj,e jje je je jfe j-dZ.ee je jje jj,dZ/ee jj,e jje jd Z0ee je jje jj1d!Z2ee je jje jj1d"Z3ee je jje jj1d#Z4ee je jje jj1d$Z5ee je jje jj1d%Z6ee je jjd&Z7dS)'N) DefineModule) db_driver)find_object_with_name)NotConnectedError DbGenericREz Oracle Corp.z1.0)nameauthorversionceZdZiZedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"edZ#ed Z$ed!Z%ed"Z&ed#Z'd$S)%GenericReverseEngineeringcRtjrtjdSN)grt query_status UserInterruptclss ..\modules\db_generic_re_grt.pycheck_interruptionz,GenericReverseEngineering.check_interruption)s,     &#%% % & &c|jj}|j}|D]}||jks ||jvrd|fcS|D]}||jkrd|fcSdS)a} Finds the datatype object corresponding to the given datatype name. Returns: a tuple of the form (is_simple_datatype, datatype) where: is_simple_datatype: True if the datatype was found among the simple datatypes for its corresponding RDBMS datatype: The actual datatype object. None if not found TF)FN)_rdbmssimpleDatatypes userDatatypesrsynonyms)rcatalog datatype_name simple_types user_types simple_type user_types rfind_datatype_objectz.GenericReverseEngineering.find_datatype_object/sz1 * ' + +K 000M[EY4Y4Yk****5Z# * *I ..y))))/}rc||j|jvr|j|jdStd|jz)N connectionzNo open connection to %s)__id__ _connectionsrhostIdentifier)rconnection_objects rget_connectionz(GenericReverseEngineering.get_connectionBsB  #s'7 7 7#$5$<=lK K#$>ARAa$abb brcn||j|g|Ri|S)zRetrieves 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 )r)cursorexecute)rr(queryargskwargss r execute_queryz'GenericReverseEngineering.execute_queryJsD Fs!!"344;;==Ee]d]]]V\]]]rctjtjt j||_tjj j j |j|jSr) r unserializeospathjoin ModuleInfomoduleDataDirectoryrrootwb rdbmsMgmtrdbmsappend)r xml_data_paths rinitializeDBMSInfoz,GenericReverseEngineering.initializeDBMSInfoSsO_RW\\*2PR_%`%`aa   #**3:666zrc tjtj}ddl}|}t |D]#\}}||d|d|d$|S)Nr|z ())rListSTRINGpyodbc dataSourceslistitemsr<)rresultrDsourceskeyvalues rgetDataSourceNamesz,GenericReverseEngineering.getDataSourceNamesZs}#*%% $$&&w}}// < z.s&[[3A[[[[[[rrFsetr)r+rNrls rgetCatalogNamesz)GenericReverseEngineering.getCatalogNamessO C[[#*<*.s&oo3Aoooooorrr)rr$ catalog_names rgetSchemaNamesz(GenericReverseEngineering.getSchemaNamessUCoo#*<*.s^II3psp~AHqHqHqHqHqHqHIIrrschemarrr$r schema_names r getTableNamesz'GenericReverseEngineering.getTableNamesstCII&&z2299;;BB<`kBllIIIIIJJ Jrc ttd||||DS)Nc3:K|]}|jdk |jVdS)VIEWNrrs rrz9GenericReverseEngineering.getViewNames..s^HH3psp~AGqGqGqGqGqGqGHHrrrrs r getViewNamesz&GenericReverseEngineering.getViewNamesstCHH&&z2299;;BB<`kBllHHHHHII IrcgSrrPrs rgetTriggerNamesz)GenericReverseEngineering.getTriggerNames rc ttd||||DS)Nc3$K|] }|jV dSr)procedure_namers rrz>GenericReverseEngineering.getProcedureNames..s=sss*ssssssrr)rFrr)r+ proceduresrs rgetProcedureNamesz+GenericReverseEngineering.getProcedureNamesstCss&&z2299;;FF|doFppssssstt trcgSrrPrs rgetFunctionNamesz*GenericReverseEngineering.getFunctionNamesrrc p tjdd||||}tjddii}i}i}i} |dd} |dd} |dd} |d d} d }d }d}D]f}|| r$t ||||nd|<| r$t ||||nd||<|| rIt ||||t | |||znd||<| r$t | |||nd||<|||z||z||zd z| |<|| |z }tj|d|t d zz zzd |z|d z }hd}D]}d| |d |z z}t|j |}|rE||| |d zz z}| r|tj d|ztj|||z|j|jdt%}|d|z|||tj||z }tj|d|z|||| |d zz z}| rl|tj d|ztj|||z|||tj||z }tj|d|z|||| |d zz z}| r|tj d|ztj|||ztjd d||||tjtjdd t1||tjtj||z }tj|d|z|||| |d zz z}| rl|tj d|ztj|||z|||tjd}tj|d|z|tjd|d|d| rt7fd|j D}|j D]}|jvr |d|j|d zz z}tj d |jztj|||z|||tj||z }tj|d!|ztjd d"|S)#Nrz'Reverse engineering catalog informationg?z Preparing...reverseEngineerTablesTreverseEngineerTriggersreverseEngineerViewsreverseEngineerRoutines绽|=zGathered stats for %s?g?g333333?z"Reverse engineering tables from %s_rev_eng_progress_flags%s_tables_first_passz@First pass of table reverse engineering for schema %s completed!z!Reverse engineering views from %sz5Reverse engineering of views for schema %s completed!z$Reverse engineering routines from %sg?z8Reverse engineering of routines for schema %s completed!z$Reverse engineering triggers from %sg?z8Reverse engineering of triggers for schema %s completed!z The schema z was not found in the catalog z. Skipping it.c3DK|]}|jv |jVdSrr)rr schemata_listtable_count_per_schemas rrz.WsbCCvekepuBfBfB5fkBfBfBfBfBCCrz8Reverse engineering foreign keys for tables in schema %szASecond pass of table reverse engineering for schema %s completed!zReverse engineering completed!)r send_progressrreverseEngineerCataloggetlenrrrrrrschematarcbegin_progress_stepr&r% setdefaultrdiscardrend_progress_steprreverseEngineerProceduresreverseEngineerFunctionsr send_warningsumr)rr$rrcontextrview_count_per_schemaroutine_count_per_schematrigger_count_per_schematotal_count_per_schema get_tables get_triggers get_views get_routinestotaliaccumulated_progressrschema_progress_sharerstep_progress_shareprogress_flags total_tablesrs ` @rreverseEngineerz)GenericReverseEngineering.reverseEngineers !FGGG    ,,ZFF #~...!# "#% #% !#[[!8$?? {{# > K$'+A+E+EkSV+W+WZ_+_$` !*7+;[IIF: &;?UVa?bf|~IgJMRgR@S'T#,**,,,M"F"TUUU+,@BVYlBlmmm%(%5j6G%H%S%STmorotot%u%uN"**+AK+OPPP--j&AAA)+++$(;;$!"68z~I9IJJJ'RUh>hiii))*f===%'''$(;;$!"68{J9JKKKK #?@@@rc6|j|||jD]=}t j}|d|_t|dtr|dndx|_ x|_ x|_ |_t|dtr |d|_t|dtr |d|_dddd}|d B|t%|d d d|_nd|_|d d v|_|j|?dS) Nrr)rrar,)zN'')r remove_allr)r+ getTypeInforrrZdb_SimpleDatatyperYintcharacterMaximumLengthcharacterOctetLengthnumericPrecisiondateTimePrecisionnumericPrecisionRadix numericScalerrsplitparameterFormatType needsQuotesr<)rr$rtype_rowsimple_datatypeparameter_format_type_mappings rreverseEngineerUserDatatypesz6GenericReverseEngineering.reverseEngineerUserDatatypesjs**,,,**:66==??KKT[T`Kaa < zAGenericReverseEngineering.reverseEngineerTables..stvrrrzRetrieving table rWz...rfk_namesz-Reverse engineering of foreign keys in table z completedr)r&r%rrrXrNrrrrrrrrZdb_Tabler<commentreverseEngineerTableColumnsreverseEngineerTablePKreverseEngineerTableIndicesaddreverseEngineerTableFKs) rr$rr is_first_passr table_namesrrrrtables rrz/GenericReverseEngineering.reverseEngineerTablessR)**;<GGHaceff3fkAnT  lG M $ $ & & &++J fkRRK;B3H\;];]!v!7!7cvcv  $$u,EA)   !!e))FKKKYcYcYc-deee ,,..'  $$U+++$ 2 2:u E E // EBBB**:u===// EBBBS   5 C D D D DA &&.E>@C Z. / ;  ++J>>>!!e))ouozozoz}B}G}G}G.HIIISqrc |j}|j}d|jD}d|jD}td||D}|||j|j|j}|D]} tj } | d| _| ddk| _ | d| _ | d | _| d| _d} || d } || } n#t$t&f$r |j|| } d} | | _n#t&t*t,f$rkd} |d } d | _ d | d| jd|jd|jd }tjd|z|zYnwxYwYnwxYwt3| t4r|j| | _|| dS)Nc@g|]}|jSrPrupperrdatatypes r zIGenericReverseEngineering.reverseEngineerTableColumns..s& a a aH(-"5"5"7"7 a a arc@g|]}|jSrPrrs rr zIGenericReverseEngineering.reverseEngineerTableColumns..s& _ _ _H(-"5"5"7"7 _ _ _rc32K|]}|j|jfVdSr) data_type type_name)rdtypes rrzHGenericReverseEngineering.reverseEngineerTableColumns..sCGGeAGGGGGGrrrrrrYESrVARCHARzColumn datatype "z" for column "z " in table "rWz$" reverse engineered as VARCHAR(255)z %s reverseEngineerTableColumns: r)rXrrdictr)r+rcolumnsrrrZ db_Column isNotNulllengthscale precisionrindexKeyError ValueErroruserType TypeError NameErrorrryrYr simpleType addColumn)rr$rrrsimple_datatypes_listuser_datatypes_listodbc_datatypes table_columns column_infocolumnr r user_datatypemsgs rrz5GenericReverseEngineering.reverseEngineerTableColumnss, a aH_ a a a _ _H] _ _ _GGsOaOablOmOmOtOtOvOvPCPCPEPEGGGGG**:66==??GGPWP\ekepx}yCGDD ( $ $K[**,,F%a.FK*2%7F 'NFM&q>FL*1~F H 4*;q>:@@BB 066yAAj) 4 4 4 4$+$9:M:S:ST]:^:^$_M $H&3FOO#Iy9iii$(M4::9EEH$'FMMyByByBDJDODODOQWQ\Q\Q\^c^h^h^hiC$%G#J_J_JaJa%adg%ghhhhh i 4(C(( F$+$;H$E! OOF # # # #qs785E..H2 F* H2*A?H,)H2+H,,H21H2c|j}|j}t|jdkrtjd|jzdS|||j|j|j }|r |dj nd}i}|| |j|j|jD]F}|j tjkr||jg|G||vrhddlm} | dgd} |D]Q} | d |j|jdd |dd| jd d d d }||g|Rt+|D]\} } tj}| |_| |krdnd|_| dj |_|jrd nd |_t;| d D]o}t=|j|j}|rQtj}| dz|jz|_||_ |j|p|!||jr||_"dS)z6Reverse engineers the primary key for the given table.rz~Migration: reverseEngineerTablePKAndIndices: Reverse engineer of table %s was attempted but the table has no columns attributerarrq) namedtupleIndexRow) table_cat table_schemr non_uniqueindex_qualifier index_nametypeordinal_position column_name asc_or_desc cardinalitypagesfilter_conditionNAUNIQUEINDEXc|dS)NrP)elems rrzBGenericReverseEngineering.reverseEngineerTablePK..s ar)rJrW)#rXrrrrerr)r+ primaryKeysfetchallpk_name statisticsr5constantSQL_TABLE_STATrr4r< collectionsr.r7rFrGrZdb_Index isPrimaryr2unique indexTypesortedrdb_IndexColumnreferencedColumnaddIndex primaryKey)rr$rrr pk_index_rows pk_index_name indices_dictrr.Row pk_index_rowr4row_listrr* index_columns rrz0GenericReverseEngineering.reverseEngineerTablePKs[, u}   " " N\_d_ii j j j1**:66==??KKT[T`ioit}B}GKHHQQSS 4AI a(00r  %%j1188::EEglcicnv{wAEBB D DCx8222  # #CNB 7 7 > >s C C C C  , , . . . . . .*Z*V*V*VWWC!. G G c$ UZD-QRTUWcWoqtvz}ACGHH'' r::AA#FFFF$(););)=)=$>$> ) ) JK((**E#EJ#-#>#>aaAEO'{55EL*/,ChhGEOh,@,@AAA 7 7.u}coNN7#&;#=#=#?#?L(2S(83?(JL%4:L1M((666 NN5 ! ! ! )#( qrcdSrrP)rr$rs rrz5GenericReverseEngineering.reverseEngineerTableIndicess rc  dfd}t|jdkrtjd|jzdS|jj}|j|ji} j|jD]0}| |j g |1t|D]\} |sdt D} fdt!||d gzD} d t#jtt'd t| D} t!| | D]\} } | r|||| | |||| dS) z7Reverse engineers the foreign keys for the given table.c|dS|tjkrdS|tjkrdS|tjkrdS|tjkrdS|tjkrdSdS)NrqCASCADERESTRICTzSET NULLz NO ACTIONz SET DEFAULT)rF SQL_CASCADE SQL_RESTRICT SQL_SET_NULL SQL_NO_ACTIONSQL_SET_DEFAULT)rKs r get_actionzEGenericReverseEngineering.reverseEngineerTableFKs..get_action(sp}r(... y(///!z(///!z(000"{(222$}rrcPtj}| j jdvr= dt jddz}||z j jdvrn7||z }||_||_ |dj |_  |dj |_ d|_ |djr t|j|djn }|djr t|j|djn||_|D]}t|j|j}|s&tjd|jd|jdDt|jj|j} | s+tjd|jd|jjd|j||j| | j jd|j<|j|dS) NrTz_%06dri?Bz,Migration: reverseEngineerTableFKs: Column "z" not found in table "rS)rrZ db_ForeignKeyr&r%randomrandintrrX delete_rule deleteRule update_rule updateRule modelOnly pktable_schemrr pktable_namerNreferencedTabler fkcolumn_namere pkcolumn_namer<referencedColumns foreignKeys)rrfk_namefk_rows foreign_keysuffixreferenced_schemafk_rowr* ref_columnrr$rcrs r process_fkzEGenericReverseEngineering.reverseEngineerTableFKs..process_fk8s+3355K#*:+<=jIII$v~a'@'@@F's/? @Q/RS]/^^^6!&K  %K %/Z 0F%G%GK "%/Z 0F%G%GK "$%K !fmmneoe}!J 5g6FPQ H` a a aDJ v}~wAwN+Y*?@Q@XZabcZdZq*r*r*rTYK '! A A.u}f>RSSNNpvqEqEqEGLGQGQGQ$RTTT2;3N3VX^Xlmm !NNpvqEqEqEGRGbGgGgGg$hjjj#**6222-44Z@@@@PUC Z. / ;K.ks)[[[93YZIZIZ3IZIZIZrc*g|]\}}||SrPrP)rrj fk_columnss rr zEGenericReverseEngineering.reverseEngineerTableFKs..ls%SSSda*QqS/SSSrNcg|]}d|zS)zFK_generated_%06drP)rids rr zEGenericReverseEngineering.reverseEngineerTableFKs..mstttR 3b 8tttri@B)rrrrerrXrsrr)r+rrtr<rFrG enumerateziprfsamplerange)rr$rr{rfk_dictrrtindicesslices random_namesslice random_namerrcrs`` @@@rrz1GenericReverseEngineering.reverseEngineerTableFKs$s<    ! 2! 2! 2! 2! 2! 2! 2! 2H u}   " " NSV[V`` a a a1+# $$&&&%%j1188::FFU[U`otoyFzz < 6R6RSSStt6=QUV[\cVdVdQeQegjkqgrgrCsCsttt *-fl*C*CGG&E;G" 7E;FFFG 7E7J????qrc|||jj|jD].}tj|d|d/dS)Nz5 reverseEngineerViews: Cannot reverse engineer view "rSr)rrXrrrcry)rr$r view_names rrz.GenericReverseEngineering.reverseEngineerViewsvsc))*fl6GUU  I MZ]ZoZoZqZqZqZqs|s|s|} ~ ~ ~ ~qrc|||jj|jD].}tj|d|d/dS)Nz? reverseEngineerProcedures: Cannot reverse engineer procedure "rSr)rrXrrrcry)rr$rrs rrz3GenericReverseEngineering.reverseEngineerProcedures}s"33J @QSYS^__ N NN Mdgdydyd{d{d{d{~L~L~LM N N N Nqrc|||jj|jD].}tj|d|d/dS)Nz= reverseEngineerFunctions: Cannot reverse engineer function "rSr)rrXrrrcry)rr$r function_names rrz2GenericReverseEngineering.reverseEngineerFunctionss!11*fl>OQWQ\]] K KM Mbebwbwbybybyby|I|I|IJ K K K Kqrc|||jj|jD].}tj|d|d/dS)Nz; reverseEngineerTriggers: Cannot reverse engineer trigger "rSr)rrXrrrcry)rr$r trigger_names rrz1GenericReverseEngineering.reverseEngineerTriggerss // FLrLrQrUr^rdrmrorvryrrrrrrrrrrrrrrrrrrrrrrPrrr r %sL&&[& [$cc[c^^[^[ [[ 00[0--[-[B[ AA[ALL[L [[]][]qq[q JJ[J II[I [tt[t [ yy[yx<<[<0["$$[$L(([(V33[3l  [ NN[Nb[ [[[[rr c6tdS)Nzgeneric_rdbms_info.xml)r r>rPrrr>r>s $ 7 78P Q QQrc4tSr)r rLrPrrrLrLs $ 7 7 9 99rc4tSr)r rQrPrrrQrQs $ < < > >>rc6t|Sr)r rUrs rrUrUs $ 4 4T : ::rc6t|Sr)r r^)r]s rr^r^s $ = =c B BBrc8t||Sr)r rd)r$rgs rrdrds $ , ,Z B BBrc6t|Sr)r rmr$s rrmrms $ / / ; ;;rc6t|Sr)r rors rroros $ 0 0 < < >z6 R RRrc8t||Sr)r rrs rrrs $ = =j& Q QQrc8t||Sr)r rrs rrrs $ < LISTrCrLrQrUGrtNamedObjectr^INTdb_mgmt_Connectionrdrmrorvryr{rrrrrrrrr\DICTrrrr[rrrrrrrPrrrs, 111111222222 \ ~u U U U s s s s s s s s l 3;,--RR.-R CHcj)**::+*: 38??? 3:sz**;;+*; 3:s{9::CC;:C 37CK:CJGGCCHGC 37CK:;;<<<;< 37CK:;;==<;= 3:s{=>>CC?>C 3:999 3;)3;+IJJBBKJB 38S[;<<AA=<A 38S[;SZHHNNIHN 38S[;SZTTZZUTZ 38S[;SZTTYYUTY 38S[;SZTT\\UT\ 38S[;SZTT^^UT^ 38S[;SZTT]]UT] 3;)3;+I3:X[X`beblWmorowxxggyxg 37CK:CK