ó Þ@Qc@s‚ddlmZddlmZddlmZddlZeddddd d ƒZd efd „ƒYZej ej j ƒd „ƒZ ej ej ejfƒd„ƒZej ejejƒd„ƒZej ejej jƒd„ƒZej ejej jejƒd„ƒZej ejej jƒd„ƒZej ejej jƒd„ƒZej ejƒd„ƒZej ej ƒd„ƒZej ej jej jƒd„ƒZej ej ej jƒd„ƒZej ej ej jejƒd„ƒZej ej ej jejejƒd„ƒZej ej ej jejejƒd„ƒZej ej ej jejejƒd„ƒZ ej ej ej jejejƒd„ƒZ!ej ej ej jejejƒd„ƒZ"ej ej j#ej jejej ejfej$ƒd„ƒZ%ej ejej jej j#ƒd„ƒZ&ej ej j#ej jejƒd „ƒZ'ej ejej jej j(ƒd!„ƒZ)ej ejej jej j(ƒd"„ƒZ*ej ejej jej j(ƒd#„ƒZ+ej ejej jej j(ƒd$„ƒZ,ej ejej jej j(ƒd%„ƒZ-dS(&iÿÿÿÿ(tGenericReverseEngineering(t DefineModule(tfind_object_with_nameNtnamet DbSql92REtauthors Oracle Corp.tversions1.0tSql92ReverseEngineeringcBsÚeZed„ƒZed„ƒZed„ƒZed„ƒZed„ƒZed„ƒZed„ƒZ ed„ƒZ ed„ƒZ ed „ƒZ ed „ƒZ ed „ƒZed „ƒZed „ƒZRS(cCsdS(NtSql92((tcls((s..\modules\db_sql92_re_grt.pytgetTargetDBMSNamescCs,tttd„|j|dƒDƒƒƒƒS(s‰Returns a list of the available catalogs. [NOTE] This will in fact return the name of the database we are connected to. css|]}|dVqdS(iN((t.0trow((s..\modules\db_sql92_re_grt.pys 'ss3SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES(tsortedtlisttsett execute_query(R t connection((s..\modules\db_sql92_re_grt.pytgetCatalogNames!scCs5d}tttd„|j|||ƒDƒƒƒƒS(s;Returns a list of schemata for the given connection object.sZSELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = ?css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys 1s(R RRR(R Rt catalog_nametquery((s..\modules\db_sql92_re_grt.pytgetSchemaNames*sc Cs8d}tttd„|j||||ƒDƒƒƒƒS(Ns‹SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE'css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys 9s(R RRR(R RRt schema_nameR((s..\modules\db_sql92_re_grt.pyt getTableNames4sc Cs8d}tttd„|j||||ƒDƒƒƒƒS(NslSELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ?css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys As(R RRR(R RRRR((s..\modules\db_sql92_re_grt.pyt getViewNames<sc Cs8d}tttd„|j||||ƒDƒƒƒƒS(NsuSELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_CATALOG = ? AND TRIGGER_SCHEMA = ?css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys Is(R RRR(R RRRR((s..\modules\db_sql92_re_grt.pytgetTriggerNamesDsc Csd}y6tttd„|j||||ƒDƒƒƒƒSWn<tk rzy tt|ƒj|||ƒSWq{gSXnXdS(NsŒSELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_CATALOG = ? AND ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'PROCEDURE'css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys Rs(R RRRt ExceptiontsuperRtgetProcedureNames(R RRRR((s..\modules\db_sql92_re_grt.pyRLs6  c Csd}y6tttd„|j||||ƒDƒƒƒƒSWn<tk rzy tt|ƒj|||ƒSWq{gSXnXdS(Ns‹SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_CATALOG = ? AND ROUTINE_SCHEMA = ? AND ROUTINE_TYPE = 'FUNCTION'css|]}|dVqdS(iN((R R ((s..\modules\db_sql92_re_grt.pys `s(R RRRRRRtgetFunctionNames(R RRRR((s..\modules\db_sql92_re_grt.pyRZs6  cCsdS(N((R Rtcatalog((s..\modules\db_sql92_re_grt.pytreverseEngineerUserDatatypesjsc Cs¡|jj}|jƒ}xU|jjD]G}|jjƒ|ksh|g|jD]}|jƒ^qMkr%|Sq%Wx*|jD]} | jjƒ|krz| SqzWdS(N(townertuppert_rdbmstsimpleDatatypesRtsynonymst userDatatypestNone( R Rttabletcolumnt type_nameRt up_type_nametstypetstutype((s..\modules\db_sql92_re_grt.pytgetColumnDatatypens  =c Cs¹|j}|j}d|j|j|jf}|j||ƒ}xr|D]j\ }}} } } } } }}}tjjƒ}||_| dk|_| |_| dk r­| nd|_ | dk rÈ| nd|_ |dk rã|nd|_ |j |||| ƒ}t |tjjƒr%||_nt |tjjƒrF||_n^|j |||dƒ|_d|_d| |j|j|jf}tjd|jƒ|ƒ|j|ƒqGWd S( NsOSELECT 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='%s' AND TABLE_SCHEMA='%s' AND TABLE_NAME='%s' ORDER BY ORDINAL_POSITIONtNOiÿÿÿÿttVARCHARiÿseColumn datatype "%s" for column "%s" in table "%s.%s" is unknown, reverse engineering as VARCHAR(255)s %s reverseEngineerTableColumns: i(R RRtgrttclassest db_Columnt isNotNulltlengthR&t precisiontscalet defaultValueR.t isinstancetdb_SimpleDatatypet simpleTypetdb_UserDatatypetuserTypet send_warningR t addColumn(R RR'tschemaRRt table_columnst column_nametcolumn_defaultt is_nullableR)tchar_max_lengthR7R8tdatetime_precisiontcharsett collationR(tdatatypetmsg((s..\modules\db_sql92_re_grt.pytreverseEngineerTableColumns|s0  (     c Csu|j}|j}d|j|j|jf}t|jƒdkrgtjd|jƒ|jfƒdS|j||ƒjƒ}|rqtj j ƒ}|dd|_d|_ d|_ d|_ x•|D]\}} t|j| ƒ} | stjd|jƒ| |j|jfƒdStj jƒ} |jd| | _| | _|jj| ƒqÇW||_|j|ƒndS(s9Reverse engineers the primary key(s) for the given table.s SELECT 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 = '%s' AND tc.TABLE_SCHEMA = '%s' AND tc.TABLE_NAME = '%s' ORDER BY tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITIONisl%s reverseEngineerTablePK: Reverse engineer of table %s was attempted but the table has no columns attributeitPRIMARYs‘%s reverseEngineerTablePK: Could not find column "%s" in table "%s" referenced by primary key constraint "%s". The primary key will not be added.t.(R RtlentcolumnsR2t send_errorR RtfetchallR3tdb_Indext isPrimarytuniquet indexTypeRR?tdb_IndexColumntreferencedColumntappendt primaryKeytaddIndex( R RR'RARRtfk_rowstindext_tpk_colt table_columnt index_column((s..\modules\db_sql92_re_grt.pytreverseEngineerTablePK¤s6          c CsÀ|jj}|j}d}t|jƒdkrTtjd|jƒ|jfƒdS|j|||j|j|jƒ}d }|j j ƒx|D] \}} } } } } }| sÃ| |jkrî|rÜ|j j |ƒntj j ƒ}| |_||_|jƒ|_| jƒ|_d|_t|j| ƒ}|sbtjd|jƒ| | fƒq’nt|j| ƒ}|s£tjd|jƒ| | | fƒq’nt|jƒdkrÜtjd|jƒ|jfƒdS||_|}nt|j|ƒ}|s8tjd|jƒ|j|j|| fƒq’n|jj |ƒt|jj| ƒ}|stjd|jƒ| | | | fƒq’n|jj |ƒq’W|r¼|j j |ƒndS( s7Reverse engineers the foreign keys for the given table.s<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_POSITIONisp%s reverseEngineerTableFKs: Reverse engineering of table %s was attempted but the table has no columns attributeisa%s reverseEngineerTableFKs: Could not find referenced schema "%s" for foreign key constraint "%s"sc%s reverseEngineerTableFKs: Could not find referenced table "%s.%s" for foreign key constraint "%s"s\%s reverseEngineerTableFKs: Could not find column "%s.%s.%s" for foreign key constraint "%s"sg%s reverseEngineerTableFKs: Could not find referenced column "%s.%s.%s" for foreign key constraint "%s"N(R RORPR2RQR RRR&t foreignKeyst remove_allRYR3t db_ForeignKeyR!t deleteRulet updateRulet modelOnlyRtschemataR?ttablestreferencedTabletreferencedColumns(R RR'RRARtcursort current_fktcol_nametfk_namet ref_schemat ref_tabletref_coltupd_ruletdel_rulet foreign_keytreferenced_schematreferenced_tableR(treferenced_column((s..\modules\db_sql92_re_grt.pytreverseEngineerTableFKsÔsf   $ "         # c Csðd|jj|jf}|jjƒt|j||jj|jƒƒ}d|d}d}x‹|j||ƒD]w\}}tj||d|j|fƒtj j ƒ} |p¶d| _|| _|| _ |jj | ƒ|d7}qqWdS(Ns‚SELECT TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG ='%s' AND TABLE_SCHEMA = '%s'gð?g»½×Ùß|Û=isReverse engineering view %s.%sR0i( R RtviewsRdRORRR2t send_progressR3tdb_Viewt sqlDefinitionRY( R RRARt view_counttsteptidxt view_nametview_definitiontview((s..\modules\db_sql92_re_grt.pytreverseEngineerViews(s $!  (t__name__t __module__t classmethodR RRRRRRRRR.RLRbRzR…(((s..\modules\db_sql92_re_grt.pyRs  (0TcCs tjdƒS(Nssql92_rdbms_info.xml(RtinitializeDBMSInfo(((s..\modules\db_sql92_re_grt.pyR‰>scCs tjƒS(N(RtgetDataSourceNames(((s..\modules\db_sql92_re_grt.pyRŠBscCs tj|ƒS(N(RtquoteIdentifier(R((s..\modules\db_sql92_re_grt.pyR‹GscCs tj|ƒS(N(RtfullyQualifiedObjectName(tobj((s..\modules\db_sql92_re_grt.pyRŒLscCstj||ƒS(N(Rtconnect(Rtpassword((s..\modules\db_sql92_re_grt.pyRŽQscCs tj|ƒS(N(Rt disconnect(R((s..\modules\db_sql92_re_grt.pyRVscCs tj|ƒS(N(Rt isConnected(R((s..\modules\db_sql92_re_grt.pyR‘ZscCs tjƒS(N(RR (((s..\modules\db_sql92_re_grt.pyR ^scCs tjƒS(N(RtgetSupportedObjectTypes(((s..\modules\db_sql92_re_grt.pyR’bscCs tj|ƒS(N(RtgetServerVersion(R((s..\modules\db_sql92_re_grt.pyR“fscCs tj|ƒS(N(RR(R((s..\modules\db_sql92_re_grt.pyRjscCstj||ƒS(N(RR(RR((s..\modules\db_sql92_re_grt.pyRnscCstj|||ƒS(N(RR(RRR((s..\modules\db_sql92_re_grt.pyRrscCstj|||ƒS(N(RR(RRR((s..\modules\db_sql92_re_grt.pyRvscCstj|||ƒS(N(RR(RRR((s..\modules\db_sql92_re_grt.pyRzscCstj|||ƒS(N(RR(RRR((s..\modules\db_sql92_re_grt.pyR~scCstj|||ƒS(N(RR(RRR((s..\modules\db_sql92_re_grt.pyR‚scCstj||||ƒS(N(RtreverseEngineer(RRt schemata_listtcontext((s..\modules\db_sql92_re_grt.pyR”†scCstj||ƒS(N(RR(RR((s..\modules\db_sql92_re_grt.pyRŠscCstj||ƒS(N(RtreverseEngineerCatalog(RR((s..\modules\db_sql92_re_grt.pyR—ŽscCstj||ƒS(N(RtreverseEngineerTables(RRA((s..\modules\db_sql92_re_grt.pyR˜’scCstj||ƒS(N(RR…(RRA((s..\modules\db_sql92_re_grt.pyR…–scCstj||ƒS(N(RtreverseEngineerProcedures(RRA((s..\modules\db_sql92_re_grt.pyR™šscCstj||ƒS(N(RtreverseEngineerFunctions(RRA((s..\modules\db_sql92_re_grt.pyRšžscCstj||ƒS(N(RtreverseEngineerTriggers(RRA((s..\modules\db_sql92_re_grt.pyR›¢s(.tdb_generic_re_grtRtwbRtworkbench.utilsRR2t ModuleInfoRtexportR3t db_mgmt_RdbmsR‰tLISTtSTRINGRŠR‹tGrtNamedObjectRŒtINTtdb_mgmt_ConnectionRŽRR‘R R’t GrtVersionR“RRRRRRRt db_CatalogtDICTR”RR—t db_SchemaR˜R…R™RšR›(((s..\modules\db_sql92_re_grt.pyts> ÿ$$!$*$$'$*00000B------