XׯdM ddlmZddlmZddlmZddlZedddZGd d eZe ej j d Z e ej ejfd Ze ejejd Ze ejej jdZe ejej jejdZe ejej jdZe ejej jdZe ejdZe ej dZe ej jej jdZe ej ej jdZe ej ej jejdZe ej ej jejejdZe ej ej jejejdZe ej ej jejejdZ e ej ej jejejdZ!e ej ej jejejdZ"e ej j#ej jejej ejfej$dZ%e ejej jej j#dZ&e ej j#ej jejdZ'e ejej jej j(dZ)e ejej jej j(d Z*e ejej jej j(d!Z+e ejej jej j(d"Z,e ejej jej j(d#Z-dS)$)GenericReverseEngineering) DefineModule)find_object_with_nameN DbSql92REz Oracle Corp.z1.0)nameauthorversioncPeZdZedZedZedZedZedZedZ efdZ efdZ ed Z ed Z ed Zed Zed ZedZxZS)Sql92ReverseEngineeringcdS)NSql92)clss ..\modules\db_sql92_re_grt.pygetTargetDBMSNamez)Sql92ReverseEngineering.getTargetDBMSName swc tttd||dDS)zReturns a list of the available catalogs. [NOTE] This will in fact return the name of the database we are connected to. c3&K|] }|dV dSrNr.0rows r z:Sql92ReverseEngineering.getCatalogNames..+s>GG#s1vGGGGGGrz3SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLESsortedlistset execute_query)r connections rgetCatalogNamesz'Sql92ReverseEngineering.getCatalogNames%sp d3GG1B1B:PE2F2FGGGGGHHJJ Jrc d}tttd||||DS)z;Returns a list of schemata for the given connection object.zZSELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = ?c3&K|] }|dV dSrrrs rrz9Sql92ReverseEngineering.getSchemaNames..5s&dd#s1vddddddrr)rr catalog_namequerys rgetSchemaNamesz&Sql92ReverseEngineering.getSchemaNames.sK#d3dd1B1B:uVb1c1cdddddeegggrc d}tttd|||||DS)NzSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'c3&K|] }|dV dSrrrs rrz8Sql92ReverseEngineering.getTableNames..=&qq#s1vqqqqqqrrrrr# schema_namer$s r getTableNamesz%Sql92ReverseEngineering.getTableNames8sOVd3qq1B1B:uVbdo1p1pqqqqqrrtttrc d}tttd|||||DS)NzlSELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ?c3&K|] }|dV dSrrrs rrz7Sql92ReverseEngineering.getViewNames..Er(rrr)s r getViewNamesz$Sql92ReverseEngineering.getViewNames@sN8d3qq1B1B:uVbdo1p1pqqqqqrrtttrc d}tttd|||||DS)NzuSELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_CATALOG = ? AND TRIGGER_SCHEMA = ?c3&K|] }|dV dSrrrs rrz:Sql92ReverseEngineering.getTriggerNames..Mr(rrr)s rgetTriggerNamesz'Sql92ReverseEngineering.getTriggerNamesHsN<d3qq1B1B:uVbdo1p1pqqqqqrrtttrc (d} tttd|||||DS#t$r9 t t ||||cYS#gcYcYSxYwwxYw)NzSELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_CATALOG = ? AND ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'c3&K|] }|dV dSrrrs rrz.V&"u"uc3q6"u"u"u"u"u"ur)rrrr Exceptionsuperr getProcedureNamesrrr#r*r$ __class__s rr7z)Sql92ReverseEngineering.getProcedureNamesPs[ $s"u"uS5F5FzSXZfhs5t5t"u"u"uuuvvxx x    4c::LLZYegrsssss   *AA B)BBB  B Bc (d} tttd|||||DS#t$r9 t t ||||cYS#gcYcYSxYwwxYw)NzSELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_CATALOG = ? AND ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'FUNCTION'c3&K|] }|dV dSrrrs rrz;Sql92ReverseEngineering.getFunctionNames..dr4r)rrrrr5r6r getFunctionNamesr8s rr=z(Sql92ReverseEngineering.getFunctionNames^sZ $s"u"uS5F5FzSXZfhs5t5t"u"u"uuuvvxx x    4c::KKJXdfqrrrrr   r:cdSNr)rrcatalogs rreverseEngineerUserDatatypesz4Sql92ReverseEngineering.reverseEngineerUserDatatypesns rc"|jj}|}|jjD]6}|j|ks|d|jDvr|cS7|jD]#}|j|kr|cS$dS)Nc6g|]}|Sr)upper)rss r z=Sql92ReverseEngineering.getColumnDatatype..ws!EhEhEhTUaggiiEhEhEhr)ownerrD_rdbmssimpleDatatypesrsynonyms userDatatypes) rrtablecolumn type_namer@ up_type_namestypeutypes rgetColumnDatatypez)Sql92ReverseEngineering.getColumnDatatypers+# (( Z/  Ez!!\11\EhEhY^YgEhEhEh5h5h 6i*  Ez!!\11 2trc *|j}|j}d|jd|jd|jd}|||}|D]O\ }}} } } } } }}}tj}||_| dk|_| |_| | nd|_| | nd|_ ||nd|_ | |||| }t|tjj r||_nt|tjjr||_nn| |||d|_d |_d | d |jd |jd |jd }tjd|z|z||QdS)NaSELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='z' AND TABLE_SCHEMA='z' AND TABLE_NAME='z' ORDER BY ORDINAL_POSITIONNOVARCHARzColumn datatype "z" for column " " in table ".z1" is unknown, reverse engineering as VARCHAR(255)z %s reverseEngineerTableColumns: r)rGrrgrtclasses db_Column isNotNulllength precisionscale defaultValuerR isinstancedb_SimpleDatatype simpleTypedb_UserDatatypeuserType send_warningr addColumn)rrrLschemar@r$ table_columns column_namecolumn_default is_nullablerNchar_max_lengthr`radatetime_precisioncharset collationrMdatatypemsgs rreverseEngineerTableColumnsz3Sql92ReverseEngineering.reverseEngineerTableColumnss ,&-\\\6;;; L))*e<< ;H $ $ 8[.+y/S\^c"GY[**,,F%FK*d2F +FM,5,AyyrF $)$5552FL4B4N..TVF ,,Z RRH(CK$ABB f$,!!Hck&ABB f"*$'$9$9*eVU^$_$_! # BKBKBKMSMXMXMXZ`ZeZeZeglgqgqgqr !CsG\G\G^G^!^ad!deee OOF # # # #qrc f|j}|j}d|jd|jd|jd}t|jdkr3t j|d|jddS|||}|rtj }|dd|_d|_ d|_ d |_ |D]\}} t|j| } | s?t j|d | d |jd |jd dStj } |jdz| z| _| | _|j| ||_||dS)z9Reverse engineers the primary key(s) for the given table.aSELECT tc.CONSTRAINT_NAME, kcu.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu ON kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA AND kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND kcu.TABLE_NAME = tc.TABLE_NAME WHERE tc.CONSTRAINT_TYPE='PRIMARY KEY' AND tc.TABLE_CATALOG = 'z' AND tc.TABLE_SCHEMA = 'z' AND tc.TABLE_NAME = 'z7' ORDER BY tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITIONrz3 reverseEngineerTablePK: Reverse engineer of table 5 was attempted but the table has no columns attributePRIMARYz0 reverseEngineerTablePK: Could not find column "rYz(" referenced by primary key constraint "z%". The primary key will not be added.rZ)rGrlencolumnsr[ send_errorrrfetchallr\db_Index isPrimaryunique indexTyperrhdb_IndexColumnreferencedColumnappend primaryKeyaddIndex) rrrLrjr@r$fk_rowsindex_pk_col table_column index_columns rreverseEngineerTablePKz.Sql92ReverseEngineering.reverseEngineerTablePKs$,=DLLL&+++W\WaWaWac u}   " " N585J5J5L5L5L5LejjjZ [ [ [1##J66??AA  "K((**E AEJEOEL'EO$ 3 3 64U]FKK #$mpnCnCnEnEnEnEGMGMGMOTOYOYOY[`[e[e[e&fhhh11"{99;; $)J$4v$= !0< - $$\2222$E  NN5 ! ! !qrc L|jj}|j}d}t|jdkr3tj|d|jddS||||j|j|j}d}|j |D]`\}} } } } } }|r | |jkrh|r|j |tj }| |_||_| |_| |_d|_t#|j| }|s0tj|d| d| d t#|j| }|s4tj|d | d | d| d ,t|jdkr4tj|d|jddS||_|}t#|j|}|sAtj|d |jd |jd |d| d |j |t#|jj| }|s7tj|d | d | d | d| d F|j |b|r|j |dS)z7Reverse engineers the foreign keys for the given table.a<SELECT kcu1.COLUMN_NAME, rc.CONSTRAINT_NAME, kcu2.TABLE_SCHEMA, kcu2.TABLE_NAME, kcu2.COLUMN_NAME, rc.UPDATE_RULE, rc.DELETE_RULE FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu1 ON kcu1.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG AND kcu1.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND kcu1.CONSTRAINT_NAME = rc.CONSTRAINT_NAME JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu2 ON kcu2.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG AND kcu2.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA AND kcu2.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY' AND kcu1.ORDINAL_POSITION = kcu2.ORDINAL_POSITION AND kcu1.TABLE_CATALOG = ? AND kcu1.TABLE_SCHEMA = ? AND kcu1.TABLE_NAME = ? ORDER BY kcu1.CONSTRAINT_NAME, kcu1.ORDINAL_POSITIONrz7 reverseEngineerTableFKs: Reverse engineering of table rwrxNz< reverseEngineerTableFKs: Could not find referenced schema "z" for foreign key constraint ""z; reverseEngineerTableFKs: Could not find referenced table "rZz1 reverseEngineerTableFKs: Could not find column "z< reverseEngineerTableFKs: Could not find referenced column ")rGrzr{r[r|rrr foreignKeys remove_allrr\ db_ForeignKeyrD deleteRule updateRule modelOnlyrschematarhtablesreferencedTablereferencedColumns)rrrLr@rjr$cursor current_fkcol_namefk_name ref_schema ref_tableref_colupd_ruledel_rule foreign_keyreferenced_schemareferenced_tablerMreferenced_columns rreverseEngineerTableFKsz/Sql92ReverseEngineering.reverseEngineerTableFKss+#<( u}   " " NX[XmXmXoXoXoXoqvq{q{q{} ~ ~ ~1"":uglFKQVQ[\\  $$&&&U[( C( C QHgz9gx )JO!;!;9%,,Z888!k7799 #*  $) !)1)9)9 &)1)9)9 &() %$9':JJ$W$W!($JMJ_J_JaJaJaJacmcmcmovovov&xyyy#89J9QS\#]#] '$JMJ_J_JaJaJaJacmcmcmoxoxox{B{B{B&CDDD'/00A55N`c`u`u`w`w`w`wzJzOzOzO$PQQQ11.> +( *5=(CCF  FIF[F[F]F]F]F]_e_j_j_jlqlvlvlvyAyAyACJCJCJ"KLLL   % %f - - - 5j6P6XZa b b $  FIF[F[F]F]F]F]_i_i_iktktktv}v}v}@G@G@G"HIII  ( / /0A B B B B  1   $ $Z 0 0 0qrcd|jjd|jd}|jt |||jj|j}d|dzz }d}|||D]|\}}tj||zd|jd|tj } |pd | _|| _|| _ |j | |d z }}dS) NzgSELECT TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG ='z' AND TABLE_SCHEMA = ''g?g|=rzReverse engineering view rZrVrx) rGrviewsrrzr.rr[ send_progressr\db_View sqlDefinitionr) rrrjr$ view_countstepidx view_nameview_definitionviews rreverseEngineerViewsz,Sql92ReverseEngineering.reverseEngineerViews,sAG @Q@Q@QSYS^S^S^`  !!!))*fl6GUUVV j5()*-*;*;J*N*N   &I  cDjjfkkk[d[d*e f f f;&&((D!RDIDJ!0D  L   % % % 1HCCqr)__name__ __module__ __qualname__ classmethodrr r%r+r.r1r7r=rArRrurrr __classcell__)r9s@rr r s[JJ[Jhh[huu[uuu[uuu[u    [     [   [   [ $$[$N,,[,^PP[Pf[rr c6tdS)Nzsql92_rdbms_info.xml)r initializeDBMSInforrrrrBs " 5 56L M MMrc4tSr?)r getDataSourceNamesrrrrrFs " 5 5 7 77rc6t|Sr?)r quoteIdentifier)rs rrrKs " 2 24 8 88rc6t|Sr?)r fullyQualifiedObjectName)objs rrrPs " ; ;C @ @@rc8t||Sr?)r connect)rpasswords rrrUs " * *:x @ @@rc6t|Sr?)r disconnectrs rrrZs " - -j 9 99rc6t|Sr?)r isConnectedrs rrr^s " . .z : ::rc4tSr?)r rrrrrrbs " 4 4 6 66rc4tSr?)r getSupportedObjectTypesrrrrrfs " : : < < >>rc8t||Sr?)r r%rr#s rr%r%rs " 1 1*l K KKrc:t|||Sr?)r r+rr#r*s rr+r+vs " 0 0\; W WWrc:t|||Sr?)r r.rs rr.r.zs " / / L+ V VVrc:t|||Sr?)r r1rs rr1r1~s " 2 2:|[ Y YYrc:t|||Sr?)r r7rs rr7r7s " 4 4Z{ [ [[rc:t|||Sr?)r r=rs rr=r=s " 3 3J k Z ZZrc<t||||Sr?)r reverseEngineer)rr# schemata_listcontexts rrrs " 2 2:|]\c d ddrc8t||Sr?)r rA)rr@s rrArAs " ? ? G T TTrc8t||Sr?)r reverseEngineerCatalogrs rrrs " 9 9*l S SSrc8t||Sr?)r reverseEngineerTablesrrjs rrrs " 8 8V L LLrc8t||Sr?)r rrs rrrs " 7 7 F K KKrc8t||Sr?)r reverseEngineerProceduresrs rrrs " < rsH,877777111111 \ ^U S S S ^^^^^7^^^F  3;,--NN.-N CHcj)**88+*8 3:sz**99+*9 3:s{9::AA;:A 37CK:CJGGAAHGA 37CK:;;::<;: 37CK:;;;;<;; 3:777 38=== 3;)3;+IJJ@@KJ@ 38S[;<<??=<? 38S[;SZHHLLIHL 38S[;SZTTXXUTX 38S[;SZTTWWUTW 38S[;SZTTZZUTZ 38S[;SZTT\\UT\ 38S[;SZTT[[UT[ 3;)3;+I3:X[X`beblWmorowxxeeyxe 37CK:CK