mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
200 lines
5.0 KiB
ABAP
200 lines
5.0 KiB
ABAP
CLASS zcl_abapgit_persistence_db DEFINITION
|
|
PUBLIC
|
|
CREATE PUBLIC .
|
|
|
|
PUBLIC SECTION.
|
|
CONSTANTS:
|
|
c_tabname TYPE tabname VALUE 'ZABAPGIT',
|
|
c_lock TYPE viewname VALUE 'EZABAPGIT'.
|
|
|
|
TYPES: ty_type TYPE c LENGTH 12.
|
|
TYPES: ty_value TYPE c LENGTH 12.
|
|
|
|
TYPES: BEGIN OF ty_content,
|
|
type TYPE ty_type,
|
|
value TYPE ty_value,
|
|
data_str TYPE string,
|
|
END OF ty_content,
|
|
tt_content TYPE SORTED TABLE OF ty_content WITH UNIQUE KEY type value.
|
|
|
|
CONSTANTS:
|
|
c_type_settings TYPE ty_type VALUE 'SETTINGS',
|
|
c_type_repo TYPE ty_type VALUE 'REPO',
|
|
c_type_background TYPE ty_type VALUE 'BACKGROUND',
|
|
c_type_user TYPE ty_type VALUE 'USER'.
|
|
|
|
METHODS:
|
|
list_by_type
|
|
IMPORTING iv_type TYPE ty_type
|
|
RETURNING VALUE(rt_content) TYPE tt_content,
|
|
list
|
|
RETURNING VALUE(rt_content) TYPE tt_content,
|
|
add
|
|
IMPORTING iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
iv_data TYPE ty_content-data_str
|
|
RAISING zcx_abapgit_exception,
|
|
delete
|
|
IMPORTING iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
RAISING zcx_abapgit_exception,
|
|
update
|
|
IMPORTING iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
iv_data TYPE ty_content-data_str
|
|
RAISING zcx_abapgit_exception,
|
|
modify
|
|
IMPORTING iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
iv_data TYPE ty_content-data_str
|
|
RAISING zcx_abapgit_exception,
|
|
read
|
|
IMPORTING iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
RETURNING VALUE(rv_data) TYPE ty_content-data_str
|
|
RAISING zcx_abapgit_not_found,
|
|
lock
|
|
IMPORTING iv_mode TYPE enqmode DEFAULT 'E'
|
|
iv_type TYPE ty_type
|
|
iv_value TYPE ty_content-value
|
|
RAISING zcx_abapgit_exception.
|
|
|
|
PRIVATE SECTION.
|
|
METHODS: validate_and_unprettify_xml
|
|
IMPORTING iv_xml TYPE string
|
|
RETURNING VALUE(rv_xml) TYPE string
|
|
RAISING zcx_abapgit_exception.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS ZCL_ABAPGIT_PERSISTENCE_DB IMPLEMENTATION.
|
|
|
|
|
|
METHOD add.
|
|
|
|
* todo, change instantiation back to private? make sure this class is a singleton?
|
|
|
|
DATA ls_table TYPE ty_content.
|
|
|
|
ls_table-type = iv_type.
|
|
ls_table-value = iv_value.
|
|
ls_table-data_str = iv_data.
|
|
|
|
INSERT (c_tabname) FROM ls_table. "#EC CI_SUBRC
|
|
ASSERT sy-subrc = 0.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD delete.
|
|
|
|
lock( iv_type = iv_type
|
|
iv_value = iv_value ).
|
|
|
|
DELETE FROM (c_tabname)
|
|
WHERE type = iv_type
|
|
AND value = iv_value.
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( 'DB Delete failed' ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD list.
|
|
SELECT * FROM (c_tabname)
|
|
INTO TABLE rt_content. "#EC CI_SUBRC
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD list_by_type.
|
|
SELECT * FROM (c_tabname)
|
|
INTO TABLE rt_content
|
|
WHERE type = iv_type. "#EC CI_SUBRC
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD lock.
|
|
|
|
CALL FUNCTION 'ENQUEUE_EZABAPGIT'
|
|
EXPORTING
|
|
mode_zabapgit = iv_mode
|
|
type = iv_type
|
|
value = iv_value
|
|
EXCEPTIONS
|
|
foreign_lock = 1
|
|
system_failure = 2
|
|
OTHERS = 3.
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( |Could not aquire lock { iv_type } { iv_value }| ).
|
|
ENDIF.
|
|
|
|
* trigger dummy update task to automatically release locks at commit
|
|
CALL FUNCTION 'BANK_OBJ_WORKL_RELEASE_LOCKS'
|
|
IN UPDATE TASK.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD modify.
|
|
|
|
DATA: ls_content TYPE ty_content.
|
|
|
|
lock( iv_type = iv_type
|
|
iv_value = iv_value ).
|
|
|
|
ls_content-type = iv_type.
|
|
ls_content-value = iv_value.
|
|
ls_content-data_str = iv_data.
|
|
|
|
MODIFY (c_tabname) FROM ls_content.
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( 'DB modify failed' ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD read.
|
|
|
|
SELECT SINGLE data_str FROM (c_tabname) INTO rv_data
|
|
WHERE type = iv_type
|
|
AND value = iv_value. "#EC CI_SUBRC
|
|
IF sy-subrc <> 0.
|
|
RAISE EXCEPTION TYPE zcx_abapgit_not_found.
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD update.
|
|
|
|
DATA lv_data LIKE iv_data.
|
|
|
|
lv_data = validate_and_unprettify_xml( iv_data ).
|
|
|
|
lock( iv_type = iv_type
|
|
iv_value = iv_value ).
|
|
|
|
UPDATE (c_tabname) SET data_str = lv_data
|
|
WHERE type = iv_type
|
|
AND value = iv_value.
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( 'DB update failed' ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD. "update
|
|
|
|
|
|
METHOD validate_and_unprettify_xml.
|
|
|
|
rv_xml = zcl_abapgit_xml_pretty=>print(
|
|
iv_xml = iv_xml
|
|
iv_unpretty = abap_true
|
|
iv_ignore_errors = abap_false ).
|
|
|
|
ENDMETHOD. " validate_and_unprettify_xml
|
|
ENDCLASS.
|