CLASS zcl_abapgit_persist_migrate DEFINITION PUBLIC CREATE PUBLIC. PUBLIC SECTION. CLASS-METHODS: run RAISING zcx_abapgit_exception. PROTECTED SECTION. PRIVATE SECTION. CONSTANTS c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT. CLASS-METHODS table_create RAISING zcx_abapgit_exception. CLASS-METHODS table_exists RETURNING VALUE(rv_exists) TYPE abap_bool. CLASS-METHODS lock_create RAISING zcx_abapgit_exception. CLASS-METHODS lock_exists RETURNING VALUE(rv_exists) TYPE abap_bool. CLASS-METHODS gui_status_create RAISING zcx_abapgit_exception. CLASS-METHODS gui_status_exists RETURNING VALUE(rv_exists) TYPE abap_bool. ENDCLASS. CLASS zcl_abapgit_persist_migrate IMPLEMENTATION. METHOD gui_status_create. DATA ls_cua TYPE zcl_abapgit_objects_program=>ty_cua. IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false. RETURN. " No autocreation for full version ENDIF. IF gui_status_exists( ) = abap_true. RETURN. ENDIF. ls_cua = lcl_own_cua_provider=>get( ). IF ls_cua IS INITIAL. " Full version or something wrong with abapmerged version RETURN. ENDIF. TRY. lcl_cua_interface=>new( )->put_own_cua( ls_cua ). CATCH zcx_abapgit_exception ##NO_HANDLER. ENDTRY. ENDMETHOD. METHOD gui_status_exists. DATA ls_own_cua TYPE zcl_abapgit_objects_program=>ty_cua. DATA ls_new_cua TYPE zcl_abapgit_objects_program=>ty_cua. DATA lv_x_own TYPE xstring. DATA lv_x_new TYPE xstring. DATA lv_h_own TYPE zif_abapgit_git_definitions=>ty_sha1. DATA lv_h_new TYPE zif_abapgit_git_definitions=>ty_sha1. TRY. ls_own_cua = lcl_cua_interface=>new( )->get_own_cua( ). CATCH zcx_abapgit_exception ##NO_HANDLER. ENDTRY. IF ls_own_cua IS INITIAL. rv_exists = abap_false. RETURN. ENDIF. ls_new_cua = lcl_own_cua_provider=>get( ). IF ls_new_cua IS INITIAL. rv_exists = abap_true. " own exists and new is not - nothing to compare with RETURN. ENDIF. EXPORT data = ls_own_cua TO DATA BUFFER lv_x_own. EXPORT data = ls_new_cua TO DATA BUFFER lv_x_new. TRY. lv_h_own = zcl_abapgit_hash=>sha1_raw( lv_x_own ). lv_h_new = zcl_abapgit_hash=>sha1_raw( lv_x_new ). CATCH zcx_abapgit_exception. rv_exists = abap_true. " own exists and some issue with calculating hash ... assume own is OK RETURN. ENDTRY. " New exists and differs from own - then it is really new, needs to be installed rv_exists = boolc( lv_h_own = lv_h_new ). ENDMETHOD. METHOD lock_create. DATA: lv_obj_name TYPE tadir-obj_name, ls_dd25v TYPE dd25v, lt_dd26e TYPE STANDARD TABLE OF dd26e WITH DEFAULT KEY, lt_dd27p TYPE STANDARD TABLE OF dd27p WITH DEFAULT KEY. FIELD-SYMBOLS: LIKE LINE OF lt_dd26e, LIKE LINE OF lt_dd27p. ls_dd25v-viewname = zcl_abapgit_persistence_db=>c_lock. ls_dd25v-aggtype = 'E'. ls_dd25v-roottab = zcl_abapgit_persistence_db=>c_tabname. ls_dd25v-ddlanguage = zif_abapgit_definitions=>c_english. ls_dd25v-ddtext = c_text. APPEND INITIAL LINE TO lt_dd26e ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -tabname = zcl_abapgit_persistence_db=>c_tabname. -tabpos = '0001'. -fortabname = zcl_abapgit_persistence_db=>c_tabname. -enqmode = 'E'. APPEND INITIAL LINE TO lt_dd27p ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -objpos = '0001'. -viewfield = 'TYPE'. -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'TYPE'. -keyflag = abap_true. APPEND INITIAL LINE TO lt_dd27p ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -objpos = '0002'. -viewfield = 'VALUE'. -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'VALUE'. -keyflag = abap_true. CALL FUNCTION 'DDIF_ENQU_PUT' EXPORTING name = zcl_abapgit_persistence_db=>c_lock dd25v_wa = ls_dd25v TABLES dd26e_tab = lt_dd26e dd27p_tab = lt_dd27p EXCEPTIONS enqu_not_found = 1 name_inconsistent = 2 enqu_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. lv_obj_name = zcl_abapgit_persistence_db=>c_lock. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'ENQU' wi_tadir_obj_name = lv_obj_name wi_set_genflag = abap_true wi_test_modus = abap_false wi_tadir_devclass = '$TMP' EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. CALL FUNCTION 'DDIF_ENQU_ACTIVATE' EXPORTING name = zcl_abapgit_persistence_db=>c_lock EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_ACTIVATE' ). ENDIF. ENDMETHOD. METHOD lock_exists. DATA: lv_viewname TYPE dd25l-viewname. SELECT SINGLE viewname FROM dd25l INTO lv_viewname WHERE viewname = zcl_abapgit_persistence_db=>c_lock. rv_exists = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD run. IF table_exists( ) = abap_false. table_create( ). ENDIF. IF lock_exists( ) = abap_false. lock_create( ). ENDIF. gui_status_create( ). ENDMETHOD. METHOD table_create. DATA: lv_rc LIKE sy-subrc, lv_obj_name TYPE tadir-obj_name, ls_dd02v TYPE dd02v, ls_dd09l TYPE dd09l, lt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY. FIELD-SYMBOLS: LIKE LINE OF lt_dd03p. ls_dd02v-tabname = zcl_abapgit_persistence_db=>c_tabname. ls_dd02v-ddlanguage = zif_abapgit_definitions=>c_english. ls_dd02v-tabclass = 'TRANSP'. ls_dd02v-ddtext = c_text. ls_dd02v-contflag = 'L'. ls_dd02v-exclass = '1'. ls_dd09l-tabname = zcl_abapgit_persistence_db=>c_tabname. ls_dd09l-as4local = 'A'. ls_dd09l-tabkat = '1'. ls_dd09l-tabart = 'APPL1'. ls_dd09l-bufallow = 'N'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'TYPE'. -position = '0001'. -keyflag = 'X'. -datatype = 'CHAR'. -leng = '000012'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'VALUE'. -position = '0002'. -keyflag = 'X'. -datatype = 'CHAR'. -leng = '000012'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'DATA_STR'. -position = '0003'. -datatype = 'STRG'. CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = zcl_abapgit_persistence_db=>c_tabname dd02v_wa = ls_dd02v dd09l_wa = ls_dd09l TABLES dd03p_tab = lt_dd03p EXCEPTIONS tabl_not_found = 1 name_inconsistent = 2 tabl_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. lv_obj_name = zcl_abapgit_persistence_db=>c_tabname. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'TABL' wi_tadir_obj_name = lv_obj_name wi_set_genflag = abap_true wi_test_modus = abap_false wi_tadir_devclass = '$TMP' EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = zcl_abapgit_persistence_db=>c_tabname auth_chk = abap_false IMPORTING rc = lv_rc EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0 OR lv_rc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ). ENDIF. ENDMETHOD. METHOD table_exists. DATA: lv_tabname TYPE dd02l-tabname. SELECT SINGLE tabname FROM dd02l INTO lv_tabname WHERE tabname = zcl_abapgit_persistence_db=>c_tabname. "#EC CI_NOORDER rv_exists = boolc( sy-subrc = 0 ). ENDMETHOD. ENDCLASS.