XׯdߛddlZddlZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z GddeZGd d eZdS) N) WizardPageWizardProgressPage) DataMigrator)request_password)Version)DataCopyFactoryc>eZdZdZdZdZdZdZdZdZ dZ d S) SetupMainViewctjtjtj}|||dd}|t||dz | rNt||dz | t||dzddSdS)N _entry_check_duplicateF)mformsnewFileChooserForm main_formSaveFile set_titlereplaceset_pathgetattrget_string_value run_modal set_valueget_pathsetattr)selfoptiontitleform ctrl_names %..\modules\migration_data_transfer.py _browse_fileszSetupMainView._browse_files!s$V[%:%:%<%>   A D)h. / / 9 9$--// J J J D)&88% @ @ @ @ @ A Ac@|ddtjd}|dtj|} | || d|z|| ddtjd} | dtjd} | dtj|} | || | ddtj } | |dz| |ffd | | dd| j tj }|d |d | ||ffd | |dd| | ddtj|}||d z|tj| |dd| d|| dd||ddt#d zdt#dz| t#dz| t#dz| dS)Nr r Fz %s OptionTz Valuec,t|dzdS)NrT)r)rrr"s r#z>SetupMainView._add_script_radiobutton_option..;swtU^asUsuyGzGzr%z Browse...Browsec0||SN)r$)rr rs r#r)z>SetupMainView._add_script_radiobutton_option..AstOaOabhjoOpOpr%z Helpr _radiobuttonr_vbox)rrnewBox set_spacingnewRadioButtonset_textset_nameaddnewLabel newTextEntryadd_changed_callbackadd_clicked_callback_script_radio_option_callback newButton set_styleSmallHelpTextStyle set_enabledr)rboxnamecaption path_captionbrowser_caption label_captionridholderradiovboxfile_box path_label file_entrybuttonlabelr"s` @r#_add_script_radiobutton_optionz,SetupMainView._add_script_radiobutton_option*sLLb)) u%%1%c** w {T)*** 5%&&&}U## =&&Q_\22 D!!! Z---(** D8O,,,''D(z(z(z(z(z{{{ Zt,,, ""4#EFFF!## $$$!!!##$o$p$p$p$p$pqqq VUD))) 5$''' .. tg~&&& 1222 t$$$  4%%% t$$$i"44e<<<i.0%888i(*J777i')400000r%c|j|j|j|jdSr,)CopyScript_vboxr=CopyScript_radiobutton get_activeBulkCopyScript_vboxBulkCopyScript_radiobuttonrs r#r9z+SetupMainView._script_radio_option_callbackPsT (()D)O)O)Q)QRRR  ,,T-L-W-W-Y-YZZZZZr%c tj||d|j|ddt jd}|d|j|ddt j tj }| d|j|ddt j d}||| d|dtj}t j||_|jd |jd |j|j||jddt,jd kr||d d ddd|n||d dddd|||ddddd|t j tj }| d|j|ddt j d|_|j d|jd||jt j|_|jd|jd|j|jddt j d}|dt jd}|d||ddt j|_|jd|jd|jd d!||jddt j }|!tj"#$d"|%d#||dd|j|ddt j|_&|j&d$|j&d%|j|j&ddt j|_'|j'd&|j'd'|j|j'ddt j tj |_(|j( d(|j|j(ddt j d}| d|dt jd)}|d*|)tj*||ddt j+tj,|_-|j-.tj/d+d,d|j-.tj0d-d.d|j-.tj0d/d0d|j-1||j-dd|j(||j-2|j3d|_4|j(5ddS)1NzData Transfer Setup DataMigrationzsSelect options for the copy of the migrated schema tables in the target MySQL server and click [Next >] to execute.zPage DescriptionFTz Data Copyz)Online copy of table data to target RDBMSz Online Copywin32z Copy Scriptz4Create a batch file to copy the data at another timez Batch File:zSave AszZYou should edit this file to add the source and target server passwords before running it.z=Create a shell script to copy the data from outside WorkbenchzShell Script File:zBulk Copy ScriptzUCreate a shell script to use native server dump and load abilities for fast migrationzBulk Data Copy Script:a'Edit the generated file and change passwords at the top of the generated script. Run it on the source server to create a zip package containing a data dump as well as a load script. Copy this to the target server, extract it, and run the import script. See the script output for further details.Options zATruncate target tables (i.e. delete contents) before copying dataTruncatez Worker tasksz Worker TaskszWorker Tasks Count2zmini_notice.pngzNumber of tasks to use for data transfer. Each task will open a connection to both source and target RDBMSes to copy table rows. Default value 2.z"Enable debug output for table copyzEnable Debug Outputz+Driver sends data already encoded as UTF-8.zSend UTF8 DatazTables to CopyzYou can limit the number of rows to be copied for certain tables. Tables that are referenced by foreign keys from other tables cannot be limited, unless data copy from the referencing tables is also disabled. All tables are copied by default. DescriptionTablez Limit CopydzReferencing Tablesi)6r__init__mainadd_wizard_pagerr5r3contentr4newPanelTitledBoxPanelrr/ set_paddingr0 RadioButtonnew_idr1_copy_dbr2r8r9sysplatformrM options_box newCheckBox _truncate_dbr6 _worker_countrset_size newImageBox set_imageAppgetget_resource_path set_tooltip _debug_copy_driver_sends_utf8_advanced_panelr;r< newTreeView TreeDefault_tree add_columnIconStringColumnTypeStringColumnType end_columnsset_cell_edited_callback _cell_edited _advbox_shownshow) rrerLpanelr>rDhbox worker_labells r#rdzSetupMainView.__init__Ts&D$(=>>> !!$9NOOO!VWW )*** t,,, 566  $$$ t,,,mE"" #   ''))-c22  JKKK }--- **4+MNNN  ud+++ <7 " "  / /]Dz}JLUWsux y y y y  / /]EDFZ\egCEH I I I ++C1CF]_wyBDoqt u u u 566  """ t,,,!=// $$R((( $$Q''' $"###".00 ""#fggg "":... T.t<<<}T"" ~66 n--- ud+++#022 ##$8999 $$S))) ##B+++ #UD111    FJNN$$667HIIJJJ _ ` ` ` E4    T5$///!-// !!"FGGG !!"7888 T-ud;;;"("4"6"6 (()VWWW (()9::: T4eTBBB &v/DEE &&'7888 -tT:::mE""   O% & & =!!! F-... 5$'(:;;  f97COOO f5|S$OOO f57KSRWXXX      D$'''   %%% ++D,=>>>" !!%(((((r%cL |j} t|}|dkrtdn4#t$r'tjdddddYdSwxYw||jjj j d<|j r1|j |jjj j d<nA|jjj j dd r|jjj j d=|j r1|j|jjj j d <nA|jjj j d d r|jjj j d =|j rdnd |jjj j d <|j rdnd |jjj j d <|j rdnd |jjj j d<|j rdnd |jjj j d<t+|jjj j D]}|dr|jjj j |=|dr|jjj j |=|dr|jjj j |=|dr|jjj j |=g}t1|jD]}|j|}|j|}|d}|s||h t|}|d kr!||jjj j d|j z<#tCj"d|zYxYw||jjj j d<|jjj j drtGj$|S|j%ddS)Nz Bad value Invalid Valuez3Worker thread count must be a number larger than 0.OKr workerCountGenerateCopyScriptFGenerateBulkCopyScriptr LiveDataCopyDebugTableCopyDriverSendsDataAsUTF8TruncateTargetTablesz :rangeKeyz :rangeStartz :rangeEndz :rowCountz %s:rowCountz,Invalid value in Migration DataCopy tree: %s tableList)&rsrint Exceptionr Utilities show_errorreplanstatedataBulkTransferParamsrPrQCopyScript_entryrxrSBulkCopyScript_entryrmr{r|rrlistkeysendswithrangercount node_at_row _tables_by_idget_tag get_stringappend__id__grt log_errorrgo_next go_next_page)rirkeytables_to_copyrowntables r#rzSetupMainView.go_nextsT   / / 1 1 FFEqyy ,,,      ' '9nptvxz| } } } FF FK 3MB  & 1 1 3 3 VPTPePvPvPxPxDIN 78L M My~#:>>?SUZ[[ VIN(?@TU  * 5 5 7 7 ZTXTmT~T~UAUADIN 78P Q Qy~#:>>?WY^__ ZIN(?@XYKO=KcKcKeKeFlaakl 3NCMQM]MhMhMjMjHqpq 34DETXTkTvTvTxTxOqq~ 34KLSWSdSoSoSqSqNxaawx 34JK ,CHHJJKK E EC||K(( EIN(?D||M** EIN(?D||K(( EIN(?D||K(( EIN(?D))++,, X XC &&s++A&qyy{{3ELLOOE X%%e,,,,XJJEqyydi ,CMTYT`D`aXM"PQV"VWWWWWCQ 3K@ 9>  6{ C %d++ + I " "1 % % % Fs$A-A10A1,6P##P>c|rX|jjjjddr|jdn|jd|t|jjjj D]}|jjjj |=tj dkr-tjtjdz}n,tjtjdz}|j|d|_|jjj}|s1|jdd}t1jdn|d krHt4jtjtjd }nGt4jtjtjd }|j|d|_t?j ||dS) N CreateInDBTFrXz\copy_migrated_tables.cmdz/copy_migrated_tables.shr z-Cannot get operating system of source server.windowszbulk_copy_tables.cmdzbulk_copy_tables.sh)!rerrobjectCreationParamsrxrm set_activerefresh_table_listrrrrnrorrget_special_folderDesktoprrCopyScript_check_duplicatemigrationSourceget_osrSr=r send_warningospathjoinrBulkCopyScript_check_duplicaterpage_activated)r advancingkfilename source_osbulk_copy_filenames r#rzSetupMainView.page_activateds  7y~#8<<\4PP 0 ((.... ((///  # # % % %$)..EJJLLMM C CIN(?BB|w&&!+>>v~NNOkk!+>>v~NNOii  ! + +H 5 5 5.2D + 6==??I ~/;;EBBB%'" !PQQQQi''%'W\\&2B2U2UV\Vd2e2eg}%~%~""%'W\\&2B2U2UV\Vd2e2eg|%}%}"  % / /0B C C C26D / !$ 22222r%c |j|jjjj}i|_i|_|jD]z}|j D]p}||j|j <|j D]W}|j rN|j |j j g}||||j|j j <Xq{t|jdk}|jD]r}|j D]f}|j}|dd|r&|d|jd|jn|d|j|jr|ddn|dd|j |j g}|rA|ddt-d |Dn@|ddt-d |D||j htdS) Nrrzdb.Table.16x16.png.0r r, c<g|]}|jjdz|jzS)r)ownerr?.0tbls r# z4SetupMainView.refresh_table_list..Ps)5b5b5bVYcinS6H6Q5b5b5br%cg|] }|j Sr?rs r#rz4SetupMainView.refresh_table_list..Rs5O5O5O3ch5O5O5Or%)rclearrermigrationTargetcatalogr_table_referencesschematatablesr foreignKeysreferencedTablerxrlenadd_node set_icon_path set_stringr? commentedOutrsetset_tag) rtarget_catalogschemarfkrprepend_schemanoderefss r#rz SetupMainView.refresh_table_list2sr 7?!#$- N NF N N38"5<0+NNB)N 266r7I7PRTUULM.r/A/HI N N^4559$- + +F + +z**,,""1&:;;;!3OOA&+++uzz'JKKKKOOAuz222%+OOAs++++OOAr***-11%,CC!SOOAtyy5b5b]a5b5b5b1c1c'd'deeeeOOAtyy5O5O$5O5O5O1P1P'Q'QRRR U\****! + + +r%cf|dkr'd}|rZ t|}|dkrtdn4#t$r'tjdddddYdSwxYw||j|g}d}|tt|krttt|}|D]5}| |j|j g6|tt|kt|rtj dd | dd d |Dd d zddd}|tjkrdSdt|D} |D]q} t|jD]H} |j| } | | vr| ddIr|d|dSdSdS)NrrzCan't be negativerzfRow limit must be an integer value larger than or equal to 0. To copy all rows, leave the value blank.rr zLimit Table CopyzTable z) is directly or indirectly referenced by cg|] }|j Srrrrs r#rz.SetupMainView._cell_edited..ns5nDnDnDyznontnDnDnDr%z. zdLimiting the number of rows to be copied will require also disabling copy of the referencing tables.zDisable Copy of ReferencesCancelcg|] }|j Sr)rrs r#rz.SetupMainView._cell_edited..ss(E(E(Ea(E(E(Er%r)r ValueErrorrrrrrxrrrextendr show_warningr ResultCancelrrrrr) rrcolumnvaluerrcur_sizerresulttables_to_disablerrrs r#rzSetupMainView._cell_editedVs Q;;E JJEqyy()<===!!$//BjlprtvxyyyFF -11$,,.."EE#c$ii..00"3t99~~H!NN D$:$>$>qx$L$LMMMM#c$ii..00  5#-::;M;MY]YhYhijYkYkYkYknDnDCnDnDnDnDnDECC8(BHHF!444(E(E3t99(E(E(E%!%55#()9)9););#<#<55C $ 6 6s ; ;A yy{{.??? ! Q 4 4 45 5)))))G ;! s$2-A#"A#N) __name__ __module__ __qualname__r$rMr9rdrrrrrr%r#r r sAAA$1$1$1L[[[i)i)i)ZBBB\ 3 3 3F!+!+!+H$*$*$*$*$*r%r czeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdS)TransferMainViewctj||ddd|_d|_t j|_|jd|j|j t j d|_ |j |j|j |jdd|j |jdd|j |j dd|jd|j|ddt'|_dS)NzBulk Data TransferT)use_private_message_handlingFRetryrV)rrd _autostart_resumerr: retry_buttonr2r8go_retryr/ retry_boxrgremove _detail_labelr4rrerfr_tables_to_exclude)rres r#rdzTransferMainView.__init__s1#D$0Dcghhhh ",.. ""7+++ ..t}===t,, D./// 4-ud;;; 4,eT::: 555 u%%% !!$9MNNN"&&&r%c|r|jjjjdr|jjjj}|dd}|dd}||jdd|dkr!||jdd|_|dkr!||j dd |_ |d d s|d d rB| |j d d |_ | |jdd|_d |_i|_|d d r|jjjj}|#t)|jjjj}|jjjj}|~|jjjjj|jjjjjkrF|jjjjjd|jjjjjdkr|}|#t)|jjjj}nd}d}t3||jjjj|jjjj||jjjj||_|jjj|j_t;j||dS)Nrrrz!Prepare information for data copyz!Prepare Information for Data Copyz!Create shell script for data copyz!Create Shell Script for Data Copyz&Create shell script for bulk data copyz&Create Shell Script for Bulk Data CopyrFGenerateDumpScriptz Determine number of rows to copyzCopy data to target RDBMSuserName)rerrrrxadd_task _prepare_copy_create_copy_script_copy_script_task_create_bulk_copy_script_bulk_copy_script_taskadd_threaded_task _count_rows_migrate_task1 _migrate_data_migrate_task2_migrating_data_progress_per_tablerpasswordr connectionrhostIdentifierparameterValuesr _transfererwbcopytables_path_bincopytable_pathrr)rroptions copy_scriptbulk_copy_scriptsource_passwordtarget_passwords r#rzTransferMainView.page_activateds & S-D[Q& Sin*AG!++&:DAAK&{{+CTJJ  MM$,.QSv w w wd"")-t7OQtwZ*[*[&4''.2mmD511 KW[[AUW\5]5] K&*&<&511 '"&)."@"I"*&6ty~7U7`&a&aO"&)."@"I"*y~5@OSWS\SaSqS|TLLL9>9DTU_`dhdmdreCeNe^_iejjj.=O"*&6ty~7U7`&a&aO"&"&+D$).2F2]).8C_).8C_ V VD /3in.RD  +)$ :::::r%c||dtj|dS)NT) clear_tasksresetrgo_backrTs r#r.zTransferMainView.go_backs=  4"4(((((r%c*tj|Sr,)r update_statusrTs r#r0zTransferMainView.update_statuss!/555r%c ( |jjjj}|jjjjd}|jjjjjjj dk}|jjjjjjj dk}|jjj }|jjj }t|jjj jj d}d}d|jjjjj vr.t|jjjjj d}i|_|D]A} d} |jD]7} | j| jjkr | jD]} | j| jkr| } nn8| s'|d| jd| jdm| j|jvr||rq|| jjj} | jr| j}n||| jjdz|| jz}n>|r || jj} nd} || j}|| jj}|| j}| | |||| ||d |j| dz|z<g}g}g}| jD]}|jr | |rZ|||j|||j| jd |jzd}|rB||d ||j|||jt;|dkrd |nd |j| dz|zd<t;|dkrd |nd |j| dz|zd<d||j| dz|zd<CdS)Nrrtimeoutr zSource table for  (z) not found, skipping... r)r source_schema source_table target_schema target_tabletarget_table_objectttimeoutstimeoutzcolumnTypeCastExpression:%s?,-source_primary_keytarget_primary_keyrselect_expression)rerrrrrr driverrdoesSupportCatalogs module_dbrstrr" _working_setrr?oldNamer send_errorrquoteIdentifiercolumns generatedisPrimaryKeyColumnr customDatarxrrr)rsource_catalogr has_catalogs has_schemasource_db_moduletarget_db_moduler9r:rstablesschemat schema_name table_nametarg_schema_nametarg_table_namer@source_pk_listtarget_pk_listrcasts r#rzTransferMainView._prepare_copys7?%<[Iy~5@GMadee Y^3>EK_cdd 9>9CCEE9>9CCEEty~5@PQZ[\\  6AQ Q Q49>9DTU^_``H7 n7 nEF)2  <5;#666$^""6U]22%&F!E3E 7  W\WaWaWachcpcpcp qrrrzT444 K.>>v|?Q?VWW >K!'JJ!1!A!A&,BS!T!TWZ!Z]m]}]}EJ^K^K"KJJ%"2"B"B6>uzJJOGL(3J(8.3U]=_=_D k#oj8 9!# NN- _ _#++F33Y"))*:*J*J6>*Z*Z[[["))*:*J*J6;*W*WXXX'++,IFK,WY]^^_%,,T\\#?O?_?_`f`n?o?o-p-pqqqq%,,-=-M-Mfn-]-]^^^^nqsAoBoBEFoFoFRURZRZ[iRjRjRjLOD k#oj8 9:N OnqsAoBoBEFoFoFRURZRZ[iRjRjRjLOD k#oj8 9:N OQUQZQZ[lQmQmD k#oj8 9:M N No7 n7 nr%c|jjjjd}|jjjjd}|jjjjd}|jjjjd}t |d}t jdkrd}n-tj|dd }| d | |d | |d tj tj jjjz| |d | |d| |d| |d | |d|jjjjjd|jjjjjjjd| |d|jjjjjz| dt jdkrE| d| d| d| d| d| d| d| dtjzdz| d|z| d| d| d | |rd nd!d"z| d#| |rd nd!d$z| d| d%d&}| d'|z| d(|zt3|jD]1}g} | |d)| |d*| |d+| |d,| |d-d.d/| |d0d.d/| |d1d.d/d2d3| d4|} | | dz3| d| d5| d6|j d7d7D]} | d8| z| d9|j!d7D]} | d8| z| d:| d;| d| d<| d=|zn| d>| d?| d@| dA| dB| dC| dD|z| dE| d| dF| |rd ndGdHz| dI| |rd ndGdJz| d| |jjj"| dK|j d7d7D]} | dL| z| dM|j!d7D]} | dL| z| dN| dOt3|jD]}dP|d)dQ|d*dQ|d+dQ|d,dQ|d-d.d.dQ|d0d.d.dQ|d1d.d.d.} | dR| z| d|#|$dS|zdS)TNrrrrzw+rXcd|zdzS)NREM  rss r#cmtz1TransferMainView._create_copy_script..cmtsax}$r%icd|zdzS)N# r_rr`s r#rbz1TransferMainView._create_copy_script..cmtsAvd{"r%z #!/bin/sh z Workbench Table Data copy scriptzWorkbench Version: %sr z=Execute this to copy table data from a source RDBMS to MySQL.zUEdit the options below to customize it. You will need to provide passwords, at least.z Source DB: r3)z Target DB: %sz z @ECHO OFF z#REM Source and target DB passwords zset arg_source_password= zset arg_target_password= zset arg_source_ssh_password= zset arg_target_ssh_password= r_zS REM Set the location for wbcopytables.exe in this variable set "wbcopytables_path=a{" if not [%wbcopytables_path%] == [] set wbcopytables_path=%wbcopytables_path% set wbcopytables=%wbcopytables_path%\wbcopytables.exe if not exist "%wbcopytables%" ( echo "wbcopytables.exe doesn't exist in the supplied path. Please set 'wbcopytables_path' with the proper path(e.g. to Workbench binaries)" exit 1 ) IF [%arg_source_password%] == [] ( IF [%arg_target_password%] == [] ( IF [%arg_source_ssh_password%] == [] ( IF [%arg_target_ssh_password%] == [] ( ECHO WARNING: All source and target passwords are empty. You should edit this file to set them. ) ) ) ) zset arg_worker_count=%d z %s r4r5r6r7r>'z\'r?r@zECHO  z >> z"%wbcopytables%"z ^ Tz %s ^ zy --source-password="%arg_source_password%" ^ --target-password="%arg_target_password%" ^ --table-file="%table_file%" ^ zg --source-ssh-password="%arg_source_ssh_password%" ^ --target-ssh-password="%arg_target_ssh_password%"zQ --thread-count=%arg_worker_count% ^ %arg_truncate_target% ^ %arg_debug_output%z0REM Removes the file with the table definitions zDEL %s z!# Source and target DB passwords zarg_source_password= zarg_target_password= zarg_source_ssh_password= zarg_target_ssh_password= z if [ -z "$arg_source_password" ] && [ -z "$arg_target_password" ] && [ -z "$arg_source_ssh_password" ] && [ -z "$arg_target_ssh_password" ] ; then echo WARNING: All source and target passwords are empty. You should edit this file to set them. fi zarg_worker_count=%d z:# Uncomment the following options according to your needs z8# Whether target tables should be truncated before copy rdz&arg_truncate_target=--truncate-target z# Enable debugging output z$arg_debug_output=--log-level=debug3 z \ z %s \ zX --source-password="$arg_source_password" \ --target-password="$arg_target_password" \ zh --source-ssh-password="$arg_source_ssh_password" \ --target-ssh-password="$arg_target_ssh_password" \ zQ --thread-count=$arg_worker_count \ $arg_truncate_target \ $arg_debug_output \ z --table 'z' 'r zTable copy script written to %s)%rerrropenrnrorchmodwriterfromgrtrrootwbinfoversionrr r!rArr@rgetcwdrrEvaluesrrrr#helper_basic_arglisthelper_ssh_arglistwbcopytables_pathclose send_info) rrdebug_table_copytruncate_target_tables worker_countfrbrrfieldslineargopts r#rz$TransferMainView._create_copy_scriptss y~#:;OP9>/FGWX!%!5!LMc!dy~+B=Q t   <7 " " % % % % HT5 ! ! ! # # # GGM " " " 677888 +gochk>N>V.W.WWXXYYY B STTUUU kllmmm B DIN,J,U,d,d,d*.).*H*S*Z*`*h*h*hjkk l l l Odin&D&O&^^__```  <7 " " GGM " " " GG: ; ; ; GG0 1 1 1 GG0 1 1 1 GG4 5 5 5 GG4 5 5 5 GGDMMM GGY[[),   , GG/,> ? ? ? GGS T T T GGDMMM GGQ R R R GG2>bbBoo p p p GG3 4 4 4 GG,8bb&+I+]+]+_+_I' (IN299;; IN299;;  Iy7PQQT.557788)[QQQQQr%c |d|j|j}|d|t |jfzt |jD]@}|d|dd|dd|dd AdS) Nz$Counting number of rows in tables...z-%i total rows in %i tables need to be copied:- r4rr5z: row_counterror)rvr#count_table_rowsrErrrqrx)rtotaltasks r#rzTransferMainView._count_rowss =>>> 11$2CDD F%QTUYUfQgQgIhhiii*113344 z zD NNND,A,A,A4CWCWCWY]YaYabmovYwYwYwx y y y y z zr%c Td}t|j}t|jD]6}||ddz }||d7|d|jr|jjj j dd}|dd|_ d |_ |j ||j}d |_ d|_ n#d |_ d|_ wxYw|d|d d}t|_d|_t|jD]*}||d d z|d zd}|dd}|r|\} } nd} d} | r| |kr|dz}|d d |d } d| d|d|dd |d} |d| | |d|d d |d d| d|d |j|d |d|d d |d d| d|d |jdz|_,|d||fz|j jrt)jd|jr|ddSdS|ddS)Nrrr8r rrzMigrating data...FTzData copy results:r6rr7rzSucceeded : copied z of z rows from r4r5rz has succeeded (z rows copied)z has FAILED (z!%i tables of %i were fully copiedzCanceled by userz9Click [Retry] to retry copying remaining data from tableszNothing to be done)rrErrqrxcreate_transfer_logrvrerrr_log_progress_textrr# migrate_datar_count_of_failed_tables add_log_entryr interruptedr UserInterruptr) rr table_countr thread_countsucceeded_tasks fully_copiedrnrokrr7messages r#rzTransferMainView._migrate_datas4,-- *113344 B BD TXXk1-- -E  $ $T*?%@ A A A A r  / 19>/FJJ=Z[\\L NN. / / /&+D ##'D  -"&"2"?"? dN_"`"`*.'',$$+/'',$,,,, NN2    NN/ 0 0 0L&*ffD #+,D (T.557788 T T&**4+@+DT.EY+Y[_`` HH[!44  $IBEB T%9,,#/!#3L.2?.C.C.CT.EYEY#ZLLOTuuV_V_V_`det`u`u`uw{}KxLxLMG&&q,@@@NNNUYZiUjUjUjlpqmAmAmACHCHCHJSJSJS$TUUU+2243GHHHHNNNRVWfRgRgRgimn|i}i}i}@E@E@EGPGPGP$QRRR373ORS3SD00 NN>,P[A\\ ] ] ]+ <'(:;;;| \Z[[[[[ \ \ NN/ 0 0 0 0 0s  DDc0|ddS)NzKChecking if number of rows copied to target tables matches source tables...)rvrTs r# _verify_copyzTransferMainView._verify_copys deeeeer%ctj}||_|jjj}||jj j }||jj }|d||_ ||_|jjj j |dS)Nr)rclasses GrtLogObject logObjectrerrrCrHrr?rdataTransferLogr)rr7logrQ logSchemalogTables r#rz$TransferMainView.create_transfer_logsk&&(($ 9>9CCEE$44S]5H5MNN #33CM4FGG'ii2$  ,33C88888r%cV|jjjjD]}||jkr|cSdSr,)rerrrr?)rr7rs r#get_log_objectzTransferMainView.get_log_object s@9>'7  Csx'' (  r%c||}tj}||_||_|j|dSr,)rrr GrtLogEntry entryTyper?entriesr)rtyper7rrentrys r#rzTransferMainView.add_log_entrysS'' 55  ''))   '''''r%c0|ddSNF)show_retry_buttonrTs r#tasks_finishedzTransferMainView.tasks_finisheds u%%%%%r%c|jrB|dtjdd|jzddddS|ddS)NTzCopying TableszTable data copy failed for %i tables. Please review the logs for details. If you'd like to retry copying from the last successful point, click [Retry].rr F)rrrr show_messager)rcanceleds r# tasks_failedzTransferMainView.tasks_faileds} < *  " "4 ( ( (   ) )*:=W,0,H=I+/R 9 9 9 9 9  " "5 ) ) ) ) )r%cd|_|jd||dSr)rr rr-startrTs r#r zTransferMainView.go_retry's>  u%%%  r%c|jt||j| dSr,)r rbool next_buttonr=)r_shows r#rz"TransferMainView.show_retry_button-s> tE{{+++ $$Y/////r%c||_dSr,)r)rrs r#_update_resume_statusz&TransferMainView._update_resume_status1s  r%N)rrrrdrr.r0rrrrrrrrrrrr rrrr%r#rr~s;)))&(;(;(;V))) 666FnFnFnXPAPAPAh R R Rzzz919191xfff 9 9 9 (((&&&*** 000r%r)rnrrr workbench.uirrrmigration_source_selectionrworkbench.utilsrmigration_bulk_copy_datarr rrr%r#rs, 77777777%%%%%%777777######444444Z*Z*Z*Z*Z*JZ*Z*Z*| ttttt)tttttr%