@Qcf@siddlZddlmZddlZddlmZmZedddddd Zd d efd d efd d efdd efdd efdde fdd efdd efdd efdd efdd efdde fdd efdd e fdd efdd e fdd efdd efdd efd d!efd"d!efd#d!efd$d efd%d efd&d efd'd(efd)d!efd*d+efd,de fd-d.efd/d.e fd0d1e fd2d1efd3d.efd4d.efd5d6efd7d8efd9d:efd;d<efd=d>efd?d@efdAdBefdCdDefdEdFefdGdHefdIdJefdKdLefdMdNefdOdPefdQdRefdSdTefdUdVefdWdXefdYdZefd[d\efd]d^efd_d`efdadbefdcddefdedfefdgdhefdidjefdkdlefdmdnefdodpefdqdrefdsdtefdudvefdwdxefdydzefd{d|efd}d~efddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefddefgdZ da defdYZ e Z ejejdZejejejejjdZejejjejjejjdZejejjejjejjejjdZejejjejjejjejjdZejejejjejjejjdZejejjejjejjejjdZejejj ejjejj!ejjdZ"ejejj#ejjejj$ejjdZ%ejejj&ejjejj'ejjdZ(ejej)ejj*fejjdZ+dS(iN(t DefineModule(tGenericMigrationtfind_object_with_nametnametDbMssqlMigrationtauthors Oracle Corp.tversions1.0tSQL_Latin1_General_Cp437_BINtutf8_general_citSQL_Latin1_General_Cp437_CS_AStSQL_Latin1_General_Cp437_CI_ASt#SQL_Latin1_General_Pref_CP437_CI_AStSQL_Latin1_General_Cp437_CI_AItSQL_Latin1_General_Cp850_BINtutf8_bintSQL_Latin1_General_Cp850_CS_AStSQL_Latin1_General_Cp850_CI_ASt#SQL_Latin1_General_Pref_CP850_CI_AStSQL_Latin1_General_Cp850_CI_AItSQL_1Xcompat_CP850_CI_AStLatin1_General_BINt latin1_bintSQL_Latin1_General_Cp1_CS_AStSQL_Latin1_General_Cp1_CI_ASt!SQL_Latin1_General_Pref_CP1_CI_AStSQL_Latin1_General_Cp1_CI_AItSQL_AltDiction_Cp850_CS_AStSQL_AltDiction_Pref_CP850_CI_AStSQL_AltDiction_Cp850_CI_AIt!SQL_Scandinavian_Pref_Cp850_CI_AStutf8_swedish_citSQL_Scandinavian_Cp850_CS_AStSQL_Scandinavian_Cp850_CI_AStSQL_AltDiction_Cp850_CI_AStLatin1_General_CS_AStLatin1_General_CI_AStDanish_Norwegian_CS_AStutf8_danish_citFinnish_Swedish_CS_AStIcelandic_CS_AStutf8_icelandic_cit Hungarian_BINtSQL_Latin1_General_Cp1250_CS_AStcp1250_general_citSQL_Latin1_General_Cp1250_CI_AStSQL_Czech_Cp1250_CS_AStcp1250_czech_cstSQL_Czech_Cp1250_CI_AStSQL_Hungarian_Cp1250_CS_AStSQL_Hungarian_Cp1250_CI_AStSQL_Polish_Cp1250_CS_AStsql_polish_cp1250_cs_astSQL_Polish_Cp1250_CI_AStsql_polish_cp1250_ci_astSQL_Romanian_Cp1250_CS_AStsql_romanian_cp1250_cs_astSQL_Romanian_Cp1250_CI_AStsql_romanian_cp1250_ci_astSQL_Croatian_Cp1250_CS_AStsql_croatian_cp1250_cs_astSQL_Croatian_Cp1250_CI_AStsql_croatian_cp1250_ci_astSQL_Slovak_Cp1250_CS_AStsql_slovak_cp1250_cs_astSQL_Slovak_Cp1250_CI_AStsql_slovak_cp1250_ci_astSQL_Slovenian_Cp1250_CS_AStsql_slovenian_cp1250_cs_astSQL_Slovenian_Cp1250_CI_AStsql_slovenian_cp1250_ci_astCyrillic_General_BINtcyrillic_general_bintSQL_Latin1_General_Cp1251_CS_AStsql_latin1_general_cp1251_cs_astSQL_Latin1_General_Cp1251_CI_AStsql_latin1_general_cp1251_ci_astSQL_Ukrainian_Cp1251_CS_AStsql_ukrainian_cp1251_cs_astSQL_Ukrainian_Cp1251_CI_AStsql_ukrainian_cp1251_ci_ast Greek_BINt greek_bintSQL_Latin1_General_Cp1253_CS_AStsql_latin1_general_cp1253_cs_astSQL_Latin1_General_Cp1253_CI_AStsql_latin1_general_cp1253_ci_astSQL_MixDiction_Cp1253_CS_AStsql_mixdiction_cp1253_cs_astSQL_AltDiction_Cp1253_CS_AStsql_altdiction_cp1253_cs_astSQL_Latin1_General_Cp1253_CI_AItsql_latin1_general_cp1253_ci_ait Turkish_BINt turkish_bintSQL_Latin1_General_Cp1254_CS_AStsql_latin1_general_cp1254_cs_astSQL_Latin1_General_Cp1254_CI_AStsql_latin1_general_cp1254_ci_ast Hebrew_BINt hebrew_bintSQL_Latin1_General_Cp1255_CS_AStsql_latin1_general_cp1255_cs_astSQL_Latin1_General_Cp1255_CI_AStsql_latin1_general_cp1255_ci_ast Arabic_BINt arabic_bintSQL_Latin1_General_Cp1256_CS_AStsql_latin1_general_cp1256_cs_astSQL_Latin1_General_Cp1256_CI_AStsql_latin1_general_cp1256_ci_astSQL_Latin1_General_Cp1257_CS_AStsql_latin1_general_cp1257_cs_astSQL_Latin1_General_Cp1257_CI_AStsql_latin1_general_cp1257_ci_astSQL_Estonian_Cp1257_CS_AStsql_estonian_cp1257_cs_astSQL_Estonian_Cp1257_CI_AStsql_estonian_cp1257_ci_astSQL_Latvian_Cp1257_CS_AStsql_latvian_cp1257_cs_astSQL_Latvian_Cp1257_CI_AStsql_latvian_cp1257_ci_astSQL_Lithuanian_Cp1257_CS_AStsql_lithuanian_cp1257_cs_astSQL_Lithuanian_Cp1257_CI_AStsql_lithuanian_cp1257_ci_astSQL_Danish_Pref_Cp1_CI_AStsql_danish_pref_cp1_ci_astSQL_SwedishPhone_Pref_Cp1_CI_AStsql_swedishphone_pref_cp1_ci_astSQL_SwedishStd_Pref_Cp1_CI_AStsql_swedishstd_pref_cp1_ci_astSQL_Icelandic_Pref_Cp1_CI_AStsql_icelandic_pref_cp1_ci_ast Japanese_BINt japanese_bintJapanese_CI_AStjapanese_ci_astKorean_Wansung_BINtkorean_wansung_bintKorean_Wansung_CI_AStkorean_wansung_ci_astChinese_Taiwan_Stroke_BINtchinese_taiwan_stroke_bintChinese_Taiwan_Stroke_CI_AStchinese_taiwan_stroke_ci_astChinese_PRC_BINtchinese_prc_bintChinese_PRC_CI_AStchinese_prc_ci_astJapanese_CS_AStjapanese_cs_astKorean_Wansung_CS_AStkorean_wansung_cs_astChinese_Taiwan_Stroke_CS_AStchinese_taiwan_stroke_cs_astChinese_PRC_CS_AStchinese_prc_cs_astThai_BINtthai_bint Thai_CI_ASt thai_ci_ast Thai_CS_ASt thai_cs_astSQL_EBCDIC037_CP1_CS_AStsql_ebcdic037_cp1_cs_astSQL_EBCDIC273_CP1_CS_AStsql_ebcdic273_cp1_cs_astSQL_EBCDIC277_CP1_CS_AStsql_ebcdic277_cp1_cs_astSQL_EBCDIC278_CP1_CS_AStsql_ebcdic278_cp1_cs_astSQL_EBCDIC280_CP1_CS_AStsql_ebcdic280_cp1_cs_astSQL_EBCDIC284_CP1_CS_AStsql_ebcdic284_cp1_cs_astSQL_EBCDIC285_CP1_CS_AStsql_ebcdic285_cp1_cs_astSQL_EBCDIC297_CP1_CS_AStsql_ebcdic297_cp1_cs_asitMSSQLMigrationcBsGeZdZdZdZdZdZdZdZRS(cCs0tjdtj}|}|jdr9|jdsW|jdrg|jdrg|dd!}n|j| r|rtjj}d|_ d||_ |j j |nt |d kr,td7a|d tt}|r,tjj}d|_ d ||f|_ |j j |q,n|S( Ns ^[^/\\.]+$t"t[t]iiiu8MSSQL migrateIdentifier: Could not migrate identifier %si@i>u.Identifier `%s` is too long, truncated to `%s`(tretcompiletUt startswithtendswithtmatchtgrttclassest GrtLogEntryt entryTypeRtentriestappendtlenttruncated_identifier_serialtstr(tselft mssql_nametlogtmysql_valid_regext mysql_nametentry((s$..\modules\db_mssql_migration_grt.pytmigrateIdentifiers&    cCsUtt|j|||}|j||jj|jj||\|_|_|S(N(tsuperRtmigrateTableToMySQLtmigrateCharsetCollationtownertdefaultCharacterSetNametdefaultCollationName(Rtstatet sourceTablet targetSchemat targetTable((s$..\modules\db_mssql_migration_grt.pyRs3cCs|}|jr|jj}|dkr?|dkrd}qn_|d kr|jdkrd}t|jjd|_|jd||d||fqn|r|jd r||kryt|Wqd }|jd ||d |qXqn|S( Nt TIMESTAMPs getdate()tCURRENT_TIMESTAMPtDATETIMEt SMALLDATETIMEis=Default value is %s, so type was changed from %s to TIMESTAMPt'tis!Default value %s is not supported(RR( t simpleTypeRt defaultValueRt targetCatalogtsimpleDatatypestaddMigrationLogEntryRtfloat(RRt default_valuet source_columnt target_columnttarget_default_valuetsource_datatype((s$..\modules\db_mssql_migration_grt.pytmigrateColumnDefaultValues(      "c Cs|j}td|jD}|j}| r`|jr`|jj}|jj|jjnd}|ri|j j }d} |dEkr|j dkrd} qd|j kodknrd} q|j j d krd nd} n|dFkrd} n|dGkr@d|j ko)dknr7d } qd } n|dHkr^|} d|_nz|dkr|} d|_d|jkr|jjdqn:|dkr d} d}d|_ d|jkr|jjdn|jd||d|| |j fn|dkrTd} d}d|_ |jd||d|| |j fn|dIkrid} no|dkr~d} nZ|dkr|jdkrd } d|_qn*|dJkrd} |jj|_|jj|_n|dKkrs|j dkrd&} qd|j kodknrB|d#kr9d'} qp|} qd|j ko\d(knrjd)} qd&} ne|dLkrd*} d|_nG|dMkrd.} n2|d0krd0} d|_n|d1krd1} d|_n|d2krd} d3|_ |jd||d4n|d5krGd } d6}|jd||d7n|dNkrd} d;}d<|_ |jd3||d|| |j fnG|d=krd } d6}|jd3||d|| |j fn|} |j| r|| |_nJtjd>d?| |f|jd@||dA|j |jj |ftS|redB||jjdC|j sRtVARCHARtNVARCHARitLONGTEXTiiitTEXTtNTEXTtCHARtNCHARtBIGINTtINTtSMALLINTtTINYINTtUNSIGNEDtUNIQUEIDENTIFIERsCAST(? as VARCHAR(64))i@tUNIQUEs,Source column type %s was migrated to %s(%s)tSYSNAMEsCAST(? as VARCHAR(160))itDECIMALtNUMERICtREALtFLOATitDOUBLEtMONEYt SMALLMONEYtIMAGEtBINARYt VARBINARYtLONGBLOBtTINYBLOBit MEDIUMBLOBRRt DATETIME2tDATETIMEOFFSETRt ROWVERSIONtDATEtTIMEtBITis1Source column type BIT was migrated to TINYINT(1)tXMLsCAST(? as NVARCHAR(max))s+Source column type XML was migrated to TEXTtGEOMETRYt GEOGRAPHYt HIERARCHYIDsCAST(? as VARCHAR(max))it SQL_VARIANTs MSSQL migrateTableColumnsToMySQLs#Can't find datatype %s for type %s is<Could not migrate column "%s" in "%s": Unknown datatype "%s"s%s as ?scolumnTypeCastExpression:%ss2Could not migrate type of column "%s" in "%s" (%s)(RR(RR(RR(RsINTR(RR(RR(RRR(sDATETIMEs SMALLDATETIMER R (s TIMESTAMPR (RRR(RtdictRRtuserTypet actualTypetflagstextendtNoneRRtlengthRt majorNumbert precisionRRtnumericPrecisiont numericScaletscalethas_keyRt log_warningRtFalset customDatatTruetformattedRawType( RRRRRtmysql_simpleTypest source_typettype_cast_expressionRttarget_datatype((s$..\modules\db_mssql_migration_grt.pytmigrateDatatypeForColumns      !                                           cCs.|r$|jd||d|dS||fS(Nis(Collation %s migrated to utf8_general_ciRR(RR(R(RRtcharsett collationt source_objectt target_object((s$..\modules\db_mssql_migration_grt.pyRNs  cCsXtj||||}|rT|jrT|jj}|dkrQ|j|_qQqTn|S(NRRRR(sINTsTINYINTsSMALLINTsBIGINT(RtmigrateTableColumnToMySQLRRtidentityt autoIncrement(RRRRRR((s$..\modules\db_mssql_migration_grt.pyR/Ws   cCstj||||}|S(N(RtmigrateTableForeignKeyToMySQL(RRt source_fkRt target_fk((s$..\modules\db_mssql_migration_grt.pyR2is( t__name__t __module__RRRR*RR/R2(((s$..\modules\db_mssql_migration_grt.pyRs    cCsdS(NtMssql((((s$..\modules\db_mssql_migration_grt.pytgetTargetDBMSNameqscCstj||S(N(tinstanceR(RR((s$..\modules\db_mssql_migration_grt.pyRuscCstj||S(N(R9tmigrateCatalog(Rt sourceCatalog((s$..\modules\db_mssql_migration_grt.pyR:yscCstj|||S(N(R9t migrateSchema(Rt sourceSchemaR((s$..\modules\db_mssql_migration_grt.pyR<~scCstj|||S(N(R9R(RRt target_schema((s$..\modules\db_mssql_migration_grt.pyRscCstj|||S(N(R9tmigrateTableToMySQL2ndPass(RRR((s$..\modules\db_mssql_migration_grt.pyR?scCstj|||S(N(R9R2(RR3R((s$..\modules\db_mssql_migration_grt.pyR2scCstj|||S(N(R9tmigrateTriggerToMySQL(Rtsource_triggert target_table((s$..\modules\db_mssql_migration_grt.pyR@scCstj|||S(N(R9tmigrateViewToMySQL(Rt source_viewR>((s$..\modules\db_mssql_migration_grt.pyRCscCstj|||S(N(R9tmigrateRoutineToMySQL(Rtsource_routineR>((s$..\modules\db_mssql_migration_grt.pyREscCs"tjtjtjjj}|S(N(RtListtOBJECTRtdb_migration_MigrationParametert__grtclassname__(Rtlist((s$..\modules\db_mssql_migration_grt.pytgetMigrationOptionss(,RtwbRRtdb_generic_migration_grtRRt ModuleInfoR"R$tMSSQL_COLLATION_MAPRRR9texporttSTRINGR8Rt GrtLogObjectRt db_Catalogtdb_migration_MigrationR:t db_SchemaR<tdb_TableRRR?tdb_mysql_ForeignKeyt db_ForeignKeyR2tdb_mysql_Triggert db_TriggerR@t db_mysql_Viewtdb_ViewRCtdb_mysql_Routinet db_RoutineREtLISTRIRL(((s$..\modules\db_mssql_migration_grt.pyts                                                                                                      *09969999