| #IMONTH# #DD#, #YYYY# |
| ',
+ p_daily_open_format => ' |
',
+ p_daily_close_format => '
',
+ p_weekly_title_format => ''||chr(10)||
+''||chr(10)||
+'| #WTITLE# | '||chr(10)||
+'
'||chr(10)||
+''||chr(10)||
+'| ',
+ p_weekly_day_of_week_format => ' | #IDAY# #MM#/#DD# | ',
+ p_weekly_month_open_format => '',
+ p_weekly_month_close_format => '
',
+ p_weekly_day_title_format => '',
+ p_weekly_day_open_format => '',
+ p_weekly_day_close_format => '
| ',
+ p_weekly_today_open_format => '',
+ p_weekly_weekend_title_format => '',
+ p_weekly_weekend_open_format => ' | ',
+ p_weekly_weekend_close_format => '
| ',
+ p_weekly_time_open_format => '',
+ p_weekly_time_close_format => '
| ',
+ p_weekly_time_title_format => '#TIME#',
+ p_weekly_hour_open_format => '',
+ p_weekly_hour_close_format => '
',
+ p_daily_day_of_week_format => '#IDAY# #DD#/#MM# | ',
+ p_daily_month_title_format => ' | #IMONTH# #DD#, #YYYY# |
'||chr(10)||
+'',
+ p_daily_month_open_format => '',
+ p_daily_month_close_format => ' |
',
+ p_daily_day_title_format => '',
+ p_daily_day_open_format => '',
+ p_daily_day_close_format => '
| ',
+ p_daily_today_open_format => '',
+ p_daily_time_open_format => ' | ',
+ p_daily_time_close_format => '
| ',
+ p_daily_time_title_format => '#TIME#',
+ p_daily_hour_open_format => '',
+ p_daily_hour_close_format => '
',
+ p_cust_month_title_format => ' '||chr(10)||
+' '||chr(10)||
+' | #WTITLE# | '||chr(10)||
+'
'||chr(10)||
+' '||chr(10)||
+' | ',
+ p_cust_day_of_week_format => ' | #IDAY# | ',
+ p_cust_month_open_format => ''||chr(10)||
+'',
+ p_cust_month_close_format => '
'||chr(10)||
+'
'||chr(10)||
+'
',
+ p_cust_week_title_format => '',
+ p_cust_week_open_format => '',
+ p_cust_week_close_format => '
',
+ p_cust_day_title_format => '#DD#
',
+ p_cust_day_open_format => '',
+ p_cust_day_close_format => ' | ',
+ p_cust_today_open_format => '',
+ p_cust_daily_title_format => '',
+ p_cust_daily_open_format => '',
+ p_cust_daily_close_format => '',
+ p_cust_nonday_title_format => ' #DD# ',
+ p_cust_nonday_open_format => ' | ',
+ p_cust_nonday_close_format => ' | ',
+ p_cust_weekend_title_format => '#DD#
',
+ p_cust_weekend_open_format => '',
+ p_cust_weekend_close_format => ' | ',
+ p_cust_hour_open_format => '',
+ p_cust_hour_close_format => '
',
+ p_cust_time_title_format => '#TIME#',
+ p_cust_time_open_format => '',
+ p_cust_time_close_format => '
| ',
+ p_cust_wk_month_title_format => ''||chr(10)||
+''||chr(10)||
+'| #WTITLE# | '||chr(10)||
+'
'||chr(10)||
+''||chr(10)||
+'| ',
+ p_cust_wk_day_of_week_format => ' | #IDAY# #MM#/#DD# | ',
+ p_cust_wk_month_open_format => ''||chr(10)||
+'',
+ p_cust_wk_month_close_format => '
',
+ p_cust_wk_week_title_format => '',
+ p_cust_wk_week_open_format => '',
+ p_cust_wk_week_close_format => '',
+ p_cust_wk_day_title_format => '',
+ p_cust_wk_day_open_format => '',
+ p_cust_wk_day_close_format => '
| ',
+ p_cust_wk_today_open_format => '',
+ p_cust_wk_weekend_title_format => '',
+ p_cust_wk_weekend_open_format => ' | ',
+ p_cust_wk_weekend_close_format => '
| ',
+ p_cust_month_day_height_pix => '100',
+ p_cust_month_day_height_per => '',
+ p_cust_week_day_width_pix => '100',
+ p_cust_week_day_width_per => '',
+ p_theme_id => 7,
+ p_theme_class_id => 2,
+ p_reference_id=> null);
+end;
+null;
+
+end;
+/
+
+--application/shared_components/user_interface/templates/calendar/small_calendar
+prompt ......template 4844722889414916
+
+begin
+
+begin
+wwv_flow_api.create_calendar_template(
+ p_id=> 4844722889414916 + wwv_flow_api.g_id_offset,
+ p_flow_id=> wwv_flow.g_flow_id,
+ p_cal_template_name=>'Small Calendar',
+ p_translate_this_template=> 'N',
+ p_day_of_week_format=> '#DY# | ',
+ p_month_title_format=> ' '||chr(10)||
+' '||chr(10)||
+' | #IMONTH# #YYYY# | '||chr(10)||
+'
'||chr(10)||
+' '||chr(10)||
+' ',
+ p_month_open_format=> '',
+ p_month_close_format=> ' | '||chr(10)||
+'
'||chr(10)||
+'
',
+ p_day_title_format=> '#DD#
',
+ p_day_open_format=> '',
+ p_day_close_format=> ' | ',
+ p_today_open_format=> '',
+ p_weekend_title_format=> ' #DD# ',
+ p_weekend_open_format => ' | ',
+ p_weekend_close_format => ' | ',
+ p_nonday_title_format => '#DD#
',
+ p_nonday_open_format => '',
+ p_nonday_close_format => ' | ',
+ p_week_title_format => '',
+ p_week_open_format => '',
+ p_week_close_format => '
',
+ p_daily_title_format => ' | #IMONTH# #DD#, #YYYY# |
| ',
+ p_daily_open_format => ' |
',
+ p_daily_close_format => '
',
+ p_weekly_title_format => ''||chr(10)||
+''||chr(10)||
+'| #WTITLE# | '||chr(10)||
+'
'||chr(10)||
+''||chr(10)||
+'| ',
+ p_weekly_day_of_week_format => ' | #DY# #MM#/#DD# | ',
+ p_weekly_month_open_format => '',
+ p_weekly_month_close_format => '
',
+ p_weekly_day_title_format => '',
+ p_weekly_day_open_format => '',
+ p_weekly_day_close_format => ' | ',
+ p_weekly_today_open_format => '',
+ p_weekly_weekend_title_format => '',
+ p_weekly_weekend_open_format => ' ',
+ p_weekly_weekend_close_format => ' | ',
+ p_weekly_time_open_format => ' ',
+ p_weekly_time_close_format => '
| ',
+ p_weekly_time_title_format => '#TIME#',
+ p_weekly_hour_open_format => ' ',
+ p_weekly_hour_close_format => ' ',
+ p_daily_day_of_week_format => ' #DY# #DD#/#MM# | ',
+ p_daily_month_title_format => ' | #IMONTH# #DD#, #YYYY# | '||chr(10)||
+'',
+ p_daily_month_open_format => '',
+ p_daily_month_close_format => ' | ',
+ p_daily_day_title_format => '',
+ p_daily_day_open_format => ' ',
+ p_daily_day_close_format => '
| ',
+ p_daily_today_open_format => ' ',
+ p_daily_time_open_format => ' | ',
+ p_daily_time_close_format => '
| ',
+ p_daily_time_title_format => '#TIME#',
+ p_daily_hour_open_format => ' ',
+ p_daily_hour_close_format => ' ',
+ p_cust_month_title_format => ' '||chr(10)||
+' '||chr(10)||
+' | #WTITLE# | '||chr(10)||
+' '||chr(10)||
+' '||chr(10)||
+' | ',
+ p_cust_day_of_week_format => ' | #DY# | ',
+ p_cust_month_open_format => '',
+ p_cust_month_close_format => ' '||chr(10)||
+' '||chr(10)||
+' ',
+ p_cust_week_title_format => '',
+ p_cust_week_open_format => ' ',
+ p_cust_week_close_format => ' ',
+ p_cust_day_title_format => ' #DD# ',
+ p_cust_day_open_format => ' ',
+ p_cust_day_close_format => ' | ',
+ p_cust_today_open_format => ' ',
+ p_cust_daily_title_format => '',
+ p_cust_daily_open_format => '',
+ p_cust_daily_close_format => '',
+ p_cust_nonday_title_format => ' #DD# ',
+ p_cust_nonday_open_format => ' | ',
+ p_cust_nonday_close_format => ' | ',
+ p_cust_weekend_title_format => ' #DD# ',
+ p_cust_weekend_open_format => ' ',
+ p_cust_weekend_close_format => ' | ',
+ p_cust_hour_open_format => ' ',
+ p_cust_hour_close_format => ' ',
+ p_cust_time_title_format => '#TIME#',
+ p_cust_time_open_format => ' ',
+ p_cust_time_close_format => '
| ',
+ p_cust_wk_month_title_format => ' '||chr(10)||
+''||chr(10)||
+'| #WTITLE# | '||chr(10)||
+' '||chr(10)||
+''||chr(10)||
+'| ',
+ p_cust_wk_day_of_week_format => ' | #DY# #MM#/#DD# | ',
+ p_cust_wk_month_open_format => '',
+ p_cust_wk_month_close_format => ' '||chr(10)||
+' '||chr(10)||
+' ',
+ p_cust_wk_week_title_format => '',
+ p_cust_wk_week_open_format => '',
+ p_cust_wk_week_close_format => '',
+ p_cust_wk_day_title_format => '',
+ p_cust_wk_day_open_format => ' ',
+ p_cust_wk_day_close_format => '
| ',
+ p_cust_wk_today_open_format => ' ',
+ p_cust_wk_weekend_title_format => '',
+ p_cust_wk_weekend_open_format => ' | ',
+ p_cust_wk_weekend_close_format => '
| ',
+ p_cust_month_day_height_pix => '14',
+ p_cust_month_day_height_per => '14',
+ p_cust_week_day_width_pix => '40',
+ p_cust_week_day_width_per => '14',
+ p_theme_id => 7,
+ p_theme_class_id => 3,
+ p_reference_id=> null);
+end;
+null;
+
+end;
+/
+
+prompt ...application themes
+--
+--application/shared_components/user_interface/themes/modern_blue
+prompt ......theme 4845000128414917
+begin
+wwv_flow_api.create_theme (
+ p_id =>4845000128414917 + wwv_flow_api.g_id_offset,
+ p_flow_id =>wwv_flow.g_flow_id,
+ p_theme_id => 7,
+ p_theme_name=>'Modern Blue',
+ p_default_page_template=>4837525507414910 + wwv_flow_api.g_id_offset,
+ p_error_template=>4837131094414910 + wwv_flow_api.g_id_offset,
+ p_printer_friendly_template=>4837724123414910 + wwv_flow_api.g_id_offset,
+ p_breadcrumb_display_point=>'REGION_POSITION_01',
+ p_sidebar_display_point=>'REGION_POSITION_02',
+ p_login_template=>4836711590414909 + wwv_flow_api.g_id_offset,
+ p_default_button_template=>4838226535414911 + wwv_flow_api.g_id_offset,
+ p_default_region_template=>4840201642414912 + wwv_flow_api.g_id_offset,
+ p_default_chart_template =>4839217975414912 + wwv_flow_api.g_id_offset,
+ p_default_form_template =>4839304121414912 + wwv_flow_api.g_id_offset,
+ p_default_reportr_template =>4840201642414912 + wwv_flow_api.g_id_offset,
+ p_default_tabform_template=>4840201642414912 + wwv_flow_api.g_id_offset,
+ p_default_wizard_template=>4840913627414912 + wwv_flow_api.g_id_offset,
+ p_default_menur_template=>4838801336414912 + wwv_flow_api.g_id_offset,
+ p_default_listr_template=>4839116402414912 + wwv_flow_api.g_id_offset,
+ p_default_irr_template=>4839831975414912 + wwv_flow_api.g_id_offset,
+ p_default_report_template =>4843113555414914 + wwv_flow_api.g_id_offset,
+ p_default_label_template=>4843803724414915 + wwv_flow_api.g_id_offset,
+ p_default_menu_template=>4844109108414915 + wwv_flow_api.g_id_offset,
+ p_default_calendar_template=>4844317242414915 + wwv_flow_api.g_id_offset,
+ p_default_list_template=>4842217442414913 + wwv_flow_api.g_id_offset,
+ p_default_option_label=>4843803724414915 + wwv_flow_api.g_id_offset,
+ p_default_required_label=>4844030761414915 + wwv_flow_api.g_id_offset);
+end;
+/
+
+prompt ...build options used by application 700
+--
+
+begin
+
+null;
+
+end;
+/
+
+--application/shared_components/globalization/messages
+prompt ...messages used by application: 700
+--
+--application/shared_components/globalization/dyntranslations
+prompt ...dynamic translations used by application: 700
+--
+--application/shared_components/globalization/language
+prompt ...Language Maps for Application 700
+--
+
+begin
+
+null;
+
+end;
+/
+
+prompt ...Shortcuts
+--
+prompt ...web services (9iR2 or better)
+--
+prompt ...shared queries
+--
+prompt ...report layouts
+--
+prompt ...authentication schemes
+--
+--application/shared_components/security/authentication/application_express
+prompt ......scheme 4845116734414920
+
+begin
+
+declare
+ s1 varchar2(32767) := null;
+ s2 varchar2(32767) := null;
+ s3 varchar2(32767) := null;
+ s4 varchar2(32767) := null;
+ s5 varchar2(32767) := null;
+begin
+s1 := null;
+s2 := null;
+s3 := null;
+s4:=s4||'-BUILTIN-';
+
+s5 := null;
+wwv_flow_api.create_auth_setup (
+ p_id=> 4845116734414920 + wwv_flow_api.g_id_offset,
+ p_flow_id=> wwv_flow.g_flow_id,
+ p_name=> 'Application Express',
+ p_description=>'Use internal Application Express account credentials and login page in this application.',
+ p_page_sentry_function=> s1,
+ p_sess_verify_function=> s2,
+ p_pre_auth_process=> s3,
+ p_auth_function=> s4,
+ p_post_auth_process=> s5,
+ p_invalid_session_page=>'101',
+ p_invalid_session_url=>'',
+ p_cookie_name=>'',
+ p_cookie_path=>'',
+ p_cookie_domain=>'',
+ p_use_secure_cookie_yn=>'',
+ p_ldap_host=>'',
+ p_ldap_port=>'',
+ p_ldap_string=>'',
+ p_attribute_01=>'',
+ p_attribute_02=>'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1',
+ p_attribute_03=>'',
+ p_attribute_04=>'',
+ p_attribute_05=>'',
+ p_attribute_06=>'',
+ p_attribute_07=>'',
+ p_attribute_08=>'',
+ p_required_patch => null + wwv_flow_api.g_id_offset);
+end;
+null;
+
+end;
+/
+
+--application/shared_components/security/authentication/database
+prompt ......scheme 4845226213414920
+
+begin
+
+declare
+ s1 varchar2(32767) := null;
+ s2 varchar2(32767) := null;
+ s3 varchar2(32767) := null;
+ s4 varchar2(32767) := null;
+ s5 varchar2(32767) := null;
+begin
+s1:=s1||'-DATABASE-';
+
+s2 := null;
+s3 := null;
+s4 := null;
+s5 := null;
+wwv_flow_api.create_auth_setup (
+ p_id=> 4845226213414920 + wwv_flow_api.g_id_offset,
+ p_flow_id=> wwv_flow.g_flow_id,
+ p_name=> 'DATABASE',
+ p_description=>'Use database authentication (user identified by DAD).',
+ p_page_sentry_function=> s1,
+ p_sess_verify_function=> s2,
+ p_pre_auth_process=> s3,
+ p_auth_function=> s4,
+ p_post_auth_process=> s5,
+ p_invalid_session_page=>'',
+ p_invalid_session_url=>'',
+ p_cookie_name=>'',
+ p_cookie_path=>'',
+ p_cookie_domain=>'',
+ p_use_secure_cookie_yn=>'',
+ p_ldap_host=>'',
+ p_ldap_port=>'',
+ p_ldap_string=>'',
+ p_attribute_01=>'',
+ p_attribute_02=>'',
+ p_attribute_03=>'',
+ p_attribute_04=>'',
+ p_attribute_05=>'',
+ p_attribute_06=>'',
+ p_attribute_07=>'',
+ p_attribute_08=>'',
+ p_required_patch => null + wwv_flow_api.g_id_offset);
+end;
+null;
+
+end;
+/
+
+--application/shared_components/security/authentication/database_account
+prompt ......scheme 4845319779414920
+
+begin
+
+declare
+ s1 varchar2(32767) := null;
+ s2 varchar2(32767) := null;
+ s3 varchar2(32767) := null;
+ s4 varchar2(32767) := null;
+ s5 varchar2(32767) := null;
+begin
+s1 := null;
+s2 := null;
+s3 := null;
+s4:=s4||'return false; end;--';
+
+s5 := null;
+wwv_flow_api.create_auth_setup (
+ p_id=> 4845319779414920 + wwv_flow_api.g_id_offset,
+ p_flow_id=> wwv_flow.g_flow_id,
+ p_name=> 'DATABASE ACCOUNT',
+ p_description=>'Use database account credentials.',
+ p_page_sentry_function=> s1,
+ p_sess_verify_function=> s2,
+ p_pre_auth_process=> s3,
+ p_auth_function=> s4,
+ p_post_auth_process=> s5,
+ p_invalid_session_page=>'101',
+ p_invalid_session_url=>'',
+ p_cookie_name=>'',
+ p_cookie_path=>'',
+ p_cookie_domain=>'',
+ p_use_secure_cookie_yn=>'',
+ p_ldap_host=>'',
+ p_ldap_port=>'',
+ p_ldap_string=>'',
+ p_attribute_01=>'',
+ p_attribute_02=>'wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1',
+ p_attribute_03=>'',
+ p_attribute_04=>'',
+ p_attribute_05=>'',
+ p_attribute_06=>'',
+ p_attribute_07=>'',
+ p_attribute_08=>'',
+ p_required_patch => null + wwv_flow_api.g_id_offset);
+end;
+null;
+
+end;
+/
+
+prompt ...plugins
+--
+--application/end_environment
+commit;
+commit;
+begin
+execute immediate 'begin dbms_session.set_nls( param => ''NLS_NUMERIC_CHARACTERS'', value => '''''''' || replace(wwv_flow_api.g_nls_numeric_chars,'''''''','''''''''''') || ''''''''); end;';
+end;
+/
+set verify on
+set feedback on
+prompt ...done
diff --git a/apex/install.sql b/apex/install.sql
new file mode 100644
index 0000000..87a2387
--- /dev/null
+++ b/apex/install.sql
@@ -0,0 +1,6 @@
+
+-- Install APEX Workspace
+@WTP_workspace.sql
+
+-- Install APEX Application
+@f700.sql
diff --git a/builds/OraEE213_AP212_ORDS222/README.md b/builds/OraEE213_AP212_ORDS222/README.md
new file mode 100644
index 0000000..3676ed9
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/README.md
@@ -0,0 +1,5 @@
+
+## Log Files
+* Oracle EE 21.3
+* APEX 21.2
+* ORDS 22.2
diff --git a/builds/OraEE213_AP212_ORDS222/build.log b/builds/OraEE213_AP212_ORDS222/build.log
new file mode 100644
index 0000000..d689a75
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/build.log
@@ -0,0 +1,3693 @@
+build.sh
+Running from /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+Setup Variables
+
+Capture Version
+
+build_initialize.sql
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:41:59 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.05
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.01
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: CDB$ROOT, tstmp: 15-APR-24 01.41.59.202630 AM +00:00
+
+Elapsed: 00:00:00.01
+
+Show PDBs
+
+ CON_ID CON_NAME OPEN MODE RESTRICTED
+---------- ------------------------------ ---------- ----------
+ 2 PDB$SEED READ ONLY NO
+ 3 TESTPDB READ WRITE NO
+ 4 DEVPDB READ WRITE NO
+ 6 AP212PDB READ WRITE NO
+
+Create PDB
+ALTER PLUGGABLE DATABASE "DEVPDB" CLOSE IMMEDIATE INSTANCES=ALL;
+DROP PLUGGABLE DATABASE "DEVPDB" INCLUDING DATAFILES;
+create pluggable database "DEVPDB"
+ admin user "PDB_ADMIN" identified by "PDB_ADMIN_Password"
+ default tablespace users datafile '/opt/oracle/oradata/EE213CDB/DEVPDB/users01.dbf' size 5M autoextend on
+ FILE_NAME_CONVERT = ('pdbseed', 'DEVPDB')
+ STORAGE UNLIMITED TEMPFILE REUSE;
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:14.80
+
+Open PDB
+
+Pluggable database altered.
+
+Elapsed: 00:00:08.33
+
+Show Services
+
+NAME
+----------------------------------------------------------------
+EE213CDB
+SYS$BACKGROUND
+ap212pdb
+SYS$USERS
+testpdb
+devpdb
+EE213CDBXDB
+
+7 rows selected.
+
+Elapsed: 00:00:00.03
+
+Update DEFAULT Profile
+
+Session altered.
+
+Elapsed: 00:00:00.03
+
+Profile altered.
+
+Elapsed: 00:00:00.14
+
+Session altered.
+
+Elapsed: 00:00:00.01
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Clear old wtpsrc logs
+
+Move to ../../wtpsrc
+
+../builds/OraEE213_AP212_ORDS222/build.sql wtpsrc
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:42:22 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.03
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.01
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: DEVPDB, tstmp: 15-APR-24 01.42.22.957182 AM +00:00
+
+Elapsed: 00:00:00.02
+
+PL/SQL procedure successfully completed.
+
+Identify this Module in V$SESSION
+Setup Abort on Error
+
+**************************
+* Run SYS Installation *
+**************************
+
+=== DBI Started: SYS/WTP.usr
+
+User created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:23 for a duration of .46 seconds (started at 2024-04-15T01:42:23)
+Setup Continue on Error
+
+*****************************
+* Run SYSTEM Installation *
+*****************************
+
+Connected.
+
+PL/SQL procedure successfully completed.
+
+=== DBI Started: SYSTEM/WTP_usr.grnt
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .42 seconds (started at 2024-04-15T01:42:23)
+
+*************************
+* Install Application *
+*************************
+
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WT_AD_HOC_REPORT.proc
+
+Warning: Procedure created with compilation errors.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WT_EXECUTE_TEST_RUNNER.proc
+
+Warning: Procedure created with compilation errors.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .13 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/CORE_DATA.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .19 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/HOOK.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .11 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .08 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WTPLSQL.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+
+Synonym created.
+
+
+Synonym created.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .18 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_ASSERT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+
+Synonym created.
+
+
+Synonym created.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .21 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_CORE_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .09 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/HOOKS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of 16.04 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_VERSIONS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of .31 seconds (started at 2024-04-15T01:42:41)
+=== DBI Started: WTP/HOOKS.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=WTP/HOOKS.ctl
+
+ 5 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of 4.38 seconds (started at 2024-04-15T01:42:41)
+=== DBI Started: WTP/WT_QUAL_TEST_RUNNERS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .36 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/CORE_DATA.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .1 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/HOOK.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/WTPLSQL.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .12 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: WTP/WT_ASSERT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .22 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: WTP/WT_CORE_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .08 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpsrc Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpsrc Install Type
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpsrc Install Type
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpsrc Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+create table odbcapture_installation_logs
+ (load_dtm date
+ ,install_type varchar2(10)
+ ,file_name varchar2(512)
+ ,contents clob);
+comment on column odbcapture_installation_logs.load_dtm is 'Date/Time the installation log file was loaded.';
+comment on column odbcapture_installation_logs.install_type is 'Type of installation (from TYPE_CONF).';
+comment on column odbcapture_installation_logs.file_name is 'Name of installation log file.';
+comment on column odbcapture_installation_logs.contents is 'Contents/Text of the installation log file.';
+comment on table odbcapture_installation_logs is 'ODBCAPTURE installation log files.';
+grant select on odbcapture_installation_logs to public;
+create public synonym odbcapture_installation_logs for odbcapture_installation_logs;
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+ 4 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:42:55 for a duration of 8.1 seconds (started at 2024-04-15T01:42:47)
+
+*****************
+* Run Reports *
+*****************
+
+
+Reporting Summary of Install Type Log Errors
+Processing file WTP/HOOKS.log (2024-04-15 01:42:55)
+Processing file install_sys.log (2024-04-15 01:42:55)
+Processing file install_system.log (2024-04-15 01:42:55)
+Processing file install_wtpsrc.log (2024-04-15 01:42:55)
+
+PL/SQL procedure successfully completed.
+
+
+Reporting Invalid Objects
+
+Reporting JUnit XML Database Build Status
+
+Reorting JUnit XML Installation Log
+
+"wtpsrc" Installation is Done.
+old 2: if '&INSTALL_TYPE.' like 'wtp%'
+new 2: if 'wtpsrc' like 'wtp%'
+old 5: values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+new 5: values ('wtpsrc', '1.003', 'INSTALL');
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Move Log Files to Build Folder
+'db_build_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/db_build_junit_report.xml'
+'install_sys.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/install_sys.log'
+'install_system.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/install_system.log'
+'install_wtpsrc.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/install_wtpsrc.log'
+'log_files_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/log_files_junit_report.xml'
+'odbcapture_installation_logs.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/odbcapture_installation_logs.log'
+'WTP/HOOKS.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsrc/WTP/HOOKS.log'
+
+Move back to /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+Clear old wtptst logs
+
+Move to ../../wtptst
+
+../builds/OraEE213_AP212_ORDS222/build.sql wtptst
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:42:57 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: DEVPDB, tstmp: 15-APR-24 01.42.57.313637 AM +00:00
+
+Elapsed: 00:00:00.00
+
+PL/SQL procedure successfully completed.
+
+Identify this Module in V$SESSION
+Setup Abort on Error
+
+**************************
+* Run SYS Installation *
+**************************
+
+Setup Continue on Error
+
+*****************************
+* Run SYSTEM Installation *
+*****************************
+
+Connected.
+
+PL/SQL procedure successfully completed.
+
+
+*************************
+* Install Application *
+*************************
+
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:57 for a duration of .1 seconds (started at 2024-04-15T01:42:57)
+=== DBI Started: WTP/WT_SELF_TEST.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:42:59 for a duration of 1.48 seconds (started at 2024-04-15T01:42:57)
+=== DBI Started: WTP/WT_SELF_TEST.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=WTP/WT_SELF_TEST.ctl
+
+ 2 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+
+PL/SQL procedure successfully completed.
+
+
+Commit complete.
+
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of 4.69 seconds (started at 2024-04-15T01:42:59)
+=== DBI Started: WTP/WT_SELF_TEST.tabtrg
+
+Trigger created.
+
+
+Trigger altered.
+
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of .13 seconds (started at 2024-04-15T01:43:03)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtptst Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtptst Install Type
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtptst Install Type
+alter trigger "WTP"."WT_SELF_TEST$TEST" ENABLE;
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtptst Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+ 4 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:43:06 for a duration of 2.77 seconds (started at 2024-04-15T01:43:03)
+
+*****************
+* Run Reports *
+*****************
+
+
+Reporting Summary of Install Type Log Errors
+Processing file WTP/WT_SELF_TEST.log (2024-04-15 01:43:05)
+Processing file install_sys.log (2024-04-15 01:43:05)
+Processing file install_system.log (2024-04-15 01:43:05)
+Processing file install_wtptst.log (2024-04-15 01:43:05)
+
+PL/SQL procedure successfully completed.
+
+
+Reporting Invalid Objects
+
+Reporting JUnit XML Database Build Status
+
+Reorting JUnit XML Installation Log
+
+"wtptst" Installation is Done.
+old 2: if '&INSTALL_TYPE.' like 'wtp%'
+new 2: if 'wtptst' like 'wtp%'
+old 5: values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+new 5: values ('wtptst', '1.003', 'INSTALL');
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Move Log Files to Build Folder
+'db_build_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtptst/db_build_junit_report.xml'
+'install_sys.log' -> '../builds/OraEE213_AP212_ORDS222/wtptst/install_sys.log'
+'install_system.log' -> '../builds/OraEE213_AP212_ORDS222/wtptst/install_system.log'
+'install_wtptst.log' -> '../builds/OraEE213_AP212_ORDS222/wtptst/install_wtptst.log'
+'log_files_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtptst/log_files_junit_report.xml'
+'odbcapture_installation_logs.log' -> '../builds/OraEE213_AP212_ORDS222/wtptst/odbcapture_installation_logs.log'
+'WTP/WT_SELF_TEST.log' -> '../builds/OraEE213_AP212_ORDS222/wtptst/WTP/WT_SELF_TEST.log'
+
+Move back to /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+Clear old wtpsav logs
+
+Move to ../../wtpsav
+
+../builds/OraEE213_AP212_ORDS222/build.sql wtpsav
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:07 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: DEVPDB, tstmp: 15-APR-24 01.43.07.620672 AM +00:00
+
+Elapsed: 00:00:00.01
+
+PL/SQL procedure successfully completed.
+
+Identify this Module in V$SESSION
+Setup Abort on Error
+
+**************************
+* Run SYS Installation *
+**************************
+
+Setup Continue on Error
+
+*****************************
+* Run SYSTEM Installation *
+*****************************
+
+Connected.
+
+PL/SQL procedure successfully completed.
+
+
+*************************
+* Install Application *
+*************************
+
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .09 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNNUMBER.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .06 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_DBOUTS_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .05 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_TESTCASES_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_TEST_RUNNERS_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .05 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUNS_SEQ.seq
+
+Sequence created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/JUNIT_XML_PERSIST_ALL.proc
+
+Warning: Procedure created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_DBOUT.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_JOB.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_PERSIST_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_PROFILE.pspec
+
+Warning: Package created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .08 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_RESULT.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .07 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TESTCASE.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUN.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .09 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUNNER.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:09 for a duration of .43 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .69 seconds (started at 2024-04-15T01:43:09)
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .34 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_DBOUTS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .39 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_DBOUT_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .56 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_PROFILES.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .34 seconds (started at 2024-04-15T01:43:11)
+=== DBI Started: WTP/WT_RESULTS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .38 seconds (started at 2024-04-15T01:43:11)
+=== DBI Started: WTP/WT_TESTCASES.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .33 seconds (started at 2024-04-15T01:43:12)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .7 seconds (started at 2024-04-15T01:43:12)
+=== DBI Started: WTP/WT_TEST_RUNNERS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .34 seconds (started at 2024-04-15T01:43:13)
+=== DBI Started: WTP/WT_TEST_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .69 seconds (started at 2024-04-15T01:43:13)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_DBOUTS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_RESULTS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .06 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_TEST_RUNS.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .14 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_DBOUT_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .7 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_PROFILES_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .55 seconds (started at 2024-04-15T01:43:15)
+=== DBI Started: WTP/WT_RESULTS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:16 for a duration of .61 seconds (started at 2024-04-15T01:43:15)
+=== DBI Started: WTP/WT_SCHEDULER_JOBS_VW.vw
+
+View created.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .42 seconds (started at 2024-04-15T01:43:16)
+=== DBI Started: WTP/WT_TESTCASE_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .5 seconds (started at 2024-04-15T01:43:17)
+=== DBI Started: WTP/WT_TEST_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .63 seconds (started at 2024-04-15T01:43:17)
+=== DBI Started: WTP/WT_DBOUT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .08 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_JOB.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .17 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_PERSIST_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .21 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_PROFILE.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .26 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_RESULT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_TESTCASE.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUN.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUNNER.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .06 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_DBOUT_RUNS.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_PROFILES.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_RESULTS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .11 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUNS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:20 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpsav Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpsav Install Type
+alter table "WTP"."PLSQL_PROFILER_DATA" ENABLE constraint "PLSQL_PROFILER_DATA_FK1";
+alter table "WTP"."PLSQL_PROFILER_UNITS" ENABLE constraint "PLSQL_PROFILER_UNITS_FK1";
+alter table "WTP"."WT_DBOUT_RUNS" ENABLE constraint "WT_DBOUT_RUNS_FK1";
+alter table "WTP"."WT_PROFILES" ENABLE constraint "WT_PROFILES_FK1";
+alter table "WTP"."WT_RESULTS" ENABLE constraint "WT_RESULTS_FK1";
+alter table "WTP"."WT_RESULTS" ENABLE constraint "WT_RESULTS_FK2";
+alter table "WTP"."WT_TESTCASE_RUNS" ENABLE constraint "WT_TESTCASE_RUNS_FK1";
+alter table "WTP"."WT_TESTCASE_RUNS" ENABLE constraint "WT_TESTCASE_RUNS_FK2";
+alter table "WTP"."WT_TEST_RUNS" ENABLE constraint "WT_TEST_RUNS_FK1";
+alter table "WTP"."WT_TEST_RUNS" ENABLE constraint "WT_TEST_RUNS_FK2";
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpsav Install Type
+alter trigger "WTP"."WT_SELF_TEST$TEST" ENABLE;
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpsav Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+ 3 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:43:23 for a duration of 3.41 seconds (started at 2024-04-15T01:43:20)
+
+*****************
+* Run Reports *
+*****************
+
+
+Reporting Summary of Install Type Log Errors
+Processing file install_sys.log (2024-04-15 01:43:22)
+Processing file install_system.log (2024-04-15 01:43:22)
+Processing file install_wtpsav.log (2024-04-15 01:43:22)
+
+PL/SQL procedure successfully completed.
+
+
+Reporting Invalid Objects
+
+Reporting JUnit XML Database Build Status
+
+Reorting JUnit XML Installation Log
+
+"wtpsav" Installation is Done.
+old 2: if '&INSTALL_TYPE.' like 'wtp%'
+new 2: if 'wtpsav' like 'wtp%'
+old 5: values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+new 5: values ('wtpsav', '1.003', 'INSTALL');
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Move Log Files to Build Folder
+'db_build_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/db_build_junit_report.xml'
+'install_sys.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/install_sys.log'
+'install_system.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/install_system.log'
+'install_wtpsav.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/install_wtpsav.log'
+'log_files_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/log_files_junit_report.xml'
+'odbcapture_installation_logs.log' -> '../builds/OraEE213_AP212_ORDS222/wtpsav/odbcapture_installation_logs.log'
+
+Move back to /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+Running ../util/setup_for_test.sql from /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:24 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+Last Successful login time: Mon Apr 15 2024 01:43:22 +00:00
+
+Connected to:
+Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+
+Show the Services for this PDB
+
+NAME
+----------------------------------------------------------------
+devpdb
+
+Using the following service at localhost:1521
+devpdb
+
+PL/SQL procedure successfully completed.
+
+
+Update PLSQL_CCFLAGS parameter
+OLD parm_value:
+NEW parm_value: WTPLSQL_SELFTEST:TRUE
+
+PL/SQL procedure successfully completed.
+
+
+Recompile All Packages
+alter PROCEDURE "WTP"."WT_AD_HOC_REPORT" compile
+alter PROCEDURE "WTP"."WT_EXECUTE_TEST_RUNNER" compile
+alter PACKAGE "WTP"."CORE_DATA" compile
+alter PACKAGE "WTP"."HOOK" compile
+alter PACKAGE "WTP"."JUNIT_CORE_REPORT" compile
+alter PACKAGE "WTP"."WTPLSQL" compile
+alter PACKAGE "WTP"."WT_ASSERT" compile
+alter PACKAGE "WTP"."WT_CORE_REPORT" compile
+alter VIEW "WTP"."WT_QUAL_TEST_RUNNERS_VW" compile
+alter TRIGGER "WTP"."WT_SELF_TEST$TEST" compile
+alter PROCEDURE "WTP"."JUNIT_XML_PERSIST_ALL" compile
+alter PACKAGE "WTP"."WT_DBOUT" compile
+alter PACKAGE "WTP"."WT_JOB" compile
+alter PACKAGE "WTP"."WT_PERSIST_REPORT" compile
+alter PACKAGE "WTP"."WT_PROFILE" compile
+alter PACKAGE "WTP"."WT_RESULT" compile
+alter PACKAGE "WTP"."WT_TESTCASE" compile
+alter PACKAGE "WTP"."WT_TEST_RUN" compile
+alter PACKAGE "WTP"."WT_TEST_RUNNER" compile
+alter VIEW "WTP"."WT_DBOUT_RUNS_VW" compile
+alter VIEW "WTP"."WT_PROFILES_VW" compile
+alter VIEW "WTP"."WT_RESULTS_VW" compile
+alter VIEW "WTP"."WT_SCHEDULER_JOBS_VW" compile
+alter VIEW "WTP"."WT_TESTCASE_RUNS_VW" compile
+alter VIEW "WTP"."WT_TEST_RUNS_VW" compile
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Running ../util/run_core_test.sql from /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:26 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+Connected to:
+Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+
+Setup for Unit Tests.
+
+PL/SQL procedure successfully completed.
+
+
+PL/SQL procedure successfully completed.
+
+
+Run Unit Test and Report.
+
+Done with Unit Tests.
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Running ../util/run_junit_test.sql from /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:49 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+Last Successful login time: Mon Apr 15 2024 01:43:39 +00:00
+
+Connected to:
+Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+
+Setup for Unit Tests.
+
+PL/SQL procedure successfully completed.
+
+
+PL/SQL procedure successfully completed.
+
+
+Initialize Hooks.
+3 "wt_core_report" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+0 "wt_test_run" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+0 "junit_core_report" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+
+Run and Report Unit Tests.
+
+Done with Reports
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Running ../util/run_save_test.sql from /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:04 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+Last Successful login time: Mon Apr 15 2024 01:43:56 +00:00
+
+Connected to:
+Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+
+Reporting Unit Test Results...
+
+PL/SQL procedure successfully completed.
+
+
+PL/SQL procedure successfully completed.
+
+
+Initialize Hooks.
+0 "wt_core_report" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+3 "junit_core_report" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+0 "wt_test_run" rows deleted from HOOKS table.
+
+PL/SQL procedure successfully completed.
+
+
+Run Unit Tests and Report.
+
+JUnit Report Unit Tests.
+
+Done with Reports
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Clear old grbsrc logs
+
+Move to ../../grbsrc
+
+../builds/OraEE213_AP212_ORDS222/build.sql grbsrc
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:28 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.01
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: DEVPDB, tstmp: 15-APR-24 01.44.28.229359 AM +00:00
+
+Elapsed: 00:00:00.01
+
+PL/SQL procedure successfully completed.
+
+Identify this Module in V$SESSION
+Setup Abort on Error
+
+**************************
+* Run SYS Installation *
+**************************
+
+=== DBI Started: SYS/ODBCAPTURE.usr
+
+User created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of 3.93 seconds (started at 2024-04-15T01:44:28)
+Setup Continue on Error
+
+*****************************
+* Run SYSTEM Installation *
+*****************************
+
+Connected.
+
+PL/SQL procedure successfully completed.
+
+=== DBI Started: SYSTEM/GRAB_SCRIPTS_DIR.dir
+
+Directory created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .17 seconds (started at 2024-04-15T01:44:32)
+=== DBI Started: SYSTEM/ODBCAPTURE_usr.grnt
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .33 seconds (started at 2024-04-15T01:44:32)
+
+*************************
+* Install Application *
+*************************
+
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .15 seconds (started at 2024-04-15T01:44:32)
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .07 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .11 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .05 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .22 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .35 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/INSTALL_TYPE_TIMING.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .34 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .06 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .39 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .46 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .4 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .41 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/ZIP_FILES.tab
+
+Table created.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .15 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .07 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .06 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+
+ 6 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:40 for a duration of 2.95 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+
+ 0 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:43 for a duration of 2.92 seconds (started at 2024-04-15T01:44:40)
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OTYPE_CONF.ctl
+
+ 35 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:45 for a duration of 2.82 seconds (started at 2024-04-15T01:44:43)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+
+ 105 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:48 for a duration of 2.78 seconds (started at 2024-04-15T01:44:45)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+
+ 9 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:51 for a duration of 2.9 seconds (started at 2024-04-15T01:44:48)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+
+ 3 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of 2.9 seconds (started at 2024-04-15T01:44:51)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .11 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .24 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .17 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .15 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .13 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .11 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .23 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .09 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .12 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .13 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .15 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .1 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .12 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .09 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .09 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/SCHEMA_OBJECTS_VW.vw
+
+View created.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .23 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/UOR_INSTALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .11 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .21 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .14 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:00 for a duration of .97 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .13 seconds (started at 2024-04-15T01:45:00)
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .15 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tabfk
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .19 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .07 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .09 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for grbsrc Install Type
+-- ODBCAPTURE Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for grbsrc Install Type
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK3";
+alter table "ODBCAPTURE"."ROLE_CONF" ENABLE constraint "ROLE_CONF_FK1";
+alter table "ODBCAPTURE"."SCHEMA_CONF" ENABLE constraint "SCHEMA_CONF_FK1";
+alter table "ODBCAPTURE"."TYPE_CONF" ENABLE constraint "TYPE_CONF_FK1";
+-- ODBCAPTURE Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for grbsrc Install Type
+-- ODBCAPTURE Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for grbsrc Install Type
+-- ODBCAPTURE Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+ 9 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:06 for a duration of 4.33 seconds (started at 2024-04-15T01:45:01)
+
+*****************
+* Run Reports *
+*****************
+
+
+Reporting Summary of Install Type Log Errors
+Processing file ODBCAPTURE/DLOAD_CONF.log (2024-04-15 01:45:05)
+Processing file ODBCAPTURE/OBJECT_CONF.log (2024-04-15 01:45:05)
+Processing file ODBCAPTURE/OTYPE_CONF.log (2024-04-15 01:45:05)
+Processing file ODBCAPTURE/ROLE_CONF.log (2024-04-15 01:45:05)
+Processing file ODBCAPTURE/SCHEMA_CONF.log (2024-04-15 01:45:05)
+Processing file ODBCAPTURE/TYPE_CONF.log (2024-04-15 01:45:05)
+Processing file install_grbsrc.log (2024-04-15 01:45:05)
+Processing file install_sys.log (2024-04-15 01:45:05)
+Processing file install_system.log (2024-04-15 01:45:05)
+
+PL/SQL procedure successfully completed.
+
+
+Reporting Invalid Objects
+
+Reporting JUnit XML Database Build Status
+
+Reorting JUnit XML Installation Log
+
+"grbsrc" Installation is Done.
+old 2: if '&INSTALL_TYPE.' like 'wtp%'
+new 2: if 'grbsrc' like 'wtp%'
+old 5: values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+new 5: values ('grbsrc', '1.003', 'INSTALL');
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Move Log Files to Build Folder
+'db_build_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/db_build_junit_report.xml'
+'install_grbsrc.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/install_grbsrc.log'
+'install_sys.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/install_sys.log'
+'install_system.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/install_system.log'
+'log_files_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/log_files_junit_report.xml'
+'odbcapture_installation_logs.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/odbcapture_installation_logs.log'
+'ODBCAPTURE/DLOAD_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/DLOAD_CONF.log'
+'ODBCAPTURE/OBJECT_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/OBJECT_CONF.log'
+'ODBCAPTURE/OTYPE_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/OTYPE_CONF.log'
+'ODBCAPTURE/ROLE_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/ROLE_CONF.log'
+'ODBCAPTURE/SCHEMA_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/SCHEMA_CONF.log'
+'ODBCAPTURE/TYPE_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/grbsrc/ODBCAPTURE/TYPE_CONF.log'
+
+Move back to /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
+
+Clear old wtpgrb logs
+
+Move to ../../wtpgrb
+
+../builds/OraEE213_AP212_ORDS222/build.sql wtpgrb
+
+SQL*Plus: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:07 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle. All rights reserved.
+
+
+New Session
+Connected.
+
+Reset Output Connections
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.01
+
+PL/SQL procedure successfully completed.
+
+Elapsed: 00:00:00.00
+
+Show Database Connection
+
+'DB:'||NAME||',CON:'||SYS_CONTEXT('USERENV','CON_NAME')||',TSTMP:'||SYSTIMESTAMP
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+db: EE213CDB, con: DEVPDB, tstmp: 15-APR-24 01.45.07.957753 AM +00:00
+
+Elapsed: 00:00:00.01
+
+PL/SQL procedure successfully completed.
+
+Identify this Module in V$SESSION
+Setup Abort on Error
+
+**************************
+* Run SYS Installation *
+**************************
+
+Setup Continue on Error
+
+*****************************
+* Run SYSTEM Installation *
+*****************************
+
+Connected.
+
+PL/SQL procedure successfully completed.
+
+
+*************************
+* Install Application *
+*************************
+
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:45:08 for a duration of .11 seconds (started at 2024-04-15T01:45:08)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK2";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+
+ 7 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:09 for a duration of 1.27 seconds (started at 2024-04-15T01:45:08)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK3";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+
+ 8 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:10 for a duration of 1.29 seconds (started at 2024-04-15T01:45:09)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."ROLE_CONF" DISABLE constraint "ROLE_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+
+ 0 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:12 for a duration of 1.27 seconds (started at 2024-04-15T01:45:10)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."SCHEMA_CONF" DISABLE constraint "SCHEMA_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+
+ 1 Row successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:13 for a duration of 1.22 seconds (started at 2024-04-15T01:45:12)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."TYPE_CONF" DISABLE constraint "TYPE_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+
+ 4 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:14 for a duration of 1.23 seconds (started at 2024-04-15T01:45:13)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpgrb Install Type
+-- ODBCAPTURE Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpgrb Install Type
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK3";
+alter table "ODBCAPTURE"."ROLE_CONF" ENABLE constraint "ROLE_CONF_FK1";
+alter table "ODBCAPTURE"."SCHEMA_CONF" ENABLE constraint "SCHEMA_CONF_FK1";
+alter table "ODBCAPTURE"."TYPE_CONF" ENABLE constraint "TYPE_CONF_FK1";
+-- ODBCAPTURE Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpgrb Install Type
+-- ODBCAPTURE Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpgrb Install Type
+-- ODBCAPTURE Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+ 8 Rows successfully loaded.
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:17 for a duration of 2.67 seconds (started at 2024-04-15T01:45:14)
+
+*****************
+* Run Reports *
+*****************
+
+
+Reporting Summary of Install Type Log Errors
+Processing file ODBCAPTURE/DLOAD_CONF.log (2024-04-15 01:45:16)
+Processing file ODBCAPTURE/OBJECT_CONF.log (2024-04-15 01:45:16)
+Processing file ODBCAPTURE/ROLE_CONF.log (2024-04-15 01:45:16)
+Processing file ODBCAPTURE/SCHEMA_CONF.log (2024-04-15 01:45:16)
+Processing file ODBCAPTURE/TYPE_CONF.log (2024-04-15 01:45:16)
+Processing file install_sys.log (2024-04-15 01:45:16)
+Processing file install_system.log (2024-04-15 01:45:16)
+Processing file install_wtpgrb.log (2024-04-15 01:45:16)
+
+PL/SQL procedure successfully completed.
+
+
+Reporting Invalid Objects
+
+Reporting JUnit XML Database Build Status
+
+Reorting JUnit XML Installation Log
+
+"wtpgrb" Installation is Done.
+old 2: if '&INSTALL_TYPE.' like 'wtp%'
+new 2: if 'wtpgrb' like 'wtp%'
+old 5: values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+new 5: values ('wtpgrb', '1.003', 'INSTALL');
+
+PL/SQL procedure successfully completed.
+
+Disconnected from Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
+Version 21.3.0.0.0
+
+Move Log Files to Build Folder
+'db_build_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/db_build_junit_report.xml'
+'install_sys.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/install_sys.log'
+'install_system.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/install_system.log'
+'install_wtpgrb.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/install_wtpgrb.log'
+'log_files_junit_report.xml' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/log_files_junit_report.xml'
+'odbcapture_installation_logs.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/odbcapture_installation_logs.log'
+'ODBCAPTURE/DLOAD_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/DLOAD_CONF.log'
+'ODBCAPTURE/OBJECT_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/OBJECT_CONF.log'
+'ODBCAPTURE/ROLE_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/ROLE_CONF.log'
+'ODBCAPTURE/SCHEMA_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/SCHEMA_CONF.log'
+'ODBCAPTURE/TYPE_CONF.log' -> '../builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/TYPE_CONF.log'
+
+Move back to /opt/DMSTEX_dev/wtPLSQL/builds/OraEE213_AP212_ORDS222
diff --git a/builds/OraEE213_AP212_ORDS222/build.sh b/builds/OraEE213_AP212_ORDS222/build.sh
new file mode 100644
index 0000000..4f3ec7f
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/build.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+#
+# Build Script for
+# -) Oracle Enterprise Edition 21.3
+# -) Application Express 21.2
+# -) Oracle REST Data Services 22.2
+#
+# Command Line Parameters
+# -) 1 - SYS Password
+# -) 2 - User Password
+# -) 3 - Version
+#
+
+SYS_PASS="${1}"
+USR_PASS="${2}"
+VERSION="${3}"
+
+# Copy stderr and stdout to log file
+exec &> >(tee build.log)
+
+########################################
+# Confirm starting location
+if ! ls "$(basename $0)"
+then
+ echo "This script must be run from its source location"
+ exit -1
+fi
+HOME_DIR="${PWD}"
+echo "Running from ${HOME_DIR}"
+
+########################################
+echo ""
+echo "Setup Variables"
+###
+BUILD_PATH='../builds/OraEE213_AP212_ORDS222'
+BUTIL_PATH='../builds/util'
+IFILE_PATH='../../../install_files'
+HOST_NAME_PORT='localhost:1521'
+CDB_NAME='EE213CDB'
+PDB_NAME='DEVPDB'
+###
+CDB_SYS="SYS/${SYS_PASS}@//${HOST_NAME_PORT}/${CDB_NAME} as sysdba"
+PDB_SYS="SYS/${SYS_PASS}@//${HOST_NAME_PORT}/${PDB_NAME} as sysdba"
+PDB_SYSTEM="SYSTEM/${SYS_PASS}@//${HOST_NAME_PORT}/${PDB_NAME}"
+PDB_WTP="WTP/26${USR_PASS}@//${HOST_NAME_PORT}/${PDB_NAME}"
+
+########################################
+# Source the Build Functions
+. ../util/build_functions.sh
+
+########################################
+clear_log_files
+capture_version
+build_init
+run_build 'wtpsrc'
+run_build 'wtptst'
+run_build 'wtpsav'
+setup_for_test
+run_core_test
+run_junit_test
+run_save_test
+run_build 'grbsrc'
+run_build 'wtpgrb'
+move_log_files
diff --git a/builds/OraEE213_AP212_ORDS222/build_initialize.sql b/builds/OraEE213_AP212_ORDS222/build_initialize.sql
new file mode 100644
index 0000000..d14194f
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/build_initialize.sql
@@ -0,0 +1,26 @@
+
+--
+-- Base Build Script
+--
+-- Command Line Parameters:
+-- 1 - PDB_NAME: Name of the Pluggable Database
+-- 2 - CDB_SYS: Connect String for SYS in the Container Database
+--
+
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+define PDB_NAME="&1."
+define CDB_SYS="&2."
+
+set linesize 2499
+set trimspool on
+set termout on
+set verify off
+set echo off
+set timing on
+
+@"../util/new_session.sql" "&CDB_SYS." "" ""
+@"../util/create_pdb.sql" "&PDB_NAME."
+
+exit
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/DLOAD_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/DLOAD_CONF.log
new file mode 100644
index 0000000..8f538b2
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/DLOAD_CONF.log
@@ -0,0 +1,57 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:39 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/DLOAD_CONF.ctl
+Data File: ODBCAPTURE/DLOAD_CONF.csv
+ Bad File: ODBCAPTURE/DLOAD_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."DLOAD_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+TABLE_NAME NEXT 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+BEFORE_SELECT_SQL NEXT 4000 , O(") CHARACTER
+WHERE_CLAUSE NEXT 4000 , O(") CHARACTER
+ORDER_BY_COLUMNS NEXT 4000 , O(") CHARACTER
+AFTER_ORDER_BY_SQL NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+value used for ROWS parameter changed from 250 to 60
+
+Table "ODBCAPTURE"."DLOAD_CONF":
+ 6 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 1038360 bytes(60 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 6
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:39 2024
+Run ended on Mon Apr 15 01:44:39 2024
+
+Elapsed time was: 00:00:00.47
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OBJECT_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OBJECT_CONF.log
new file mode 100644
index 0000000..e9ad3fb
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OBJECT_CONF.log
@@ -0,0 +1,54 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:41 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/OBJECT_CONF.ctl
+Data File: ODBCAPTURE/OBJECT_CONF.csv
+ Bad File: ODBCAPTURE/OBJECT_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."OBJECT_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_OTYPE NEXT 20 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+ONAME_FILTER NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+value used for ROWS parameter changed from 250 to 201
+
+Table "ODBCAPTURE"."OBJECT_CONF":
+ 0 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 1043592 bytes(201 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 0
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:41 2024
+Run ended on Mon Apr 15 01:44:42 2024
+
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OTYPE_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OTYPE_CONF.log
new file mode 100644
index 0000000..9d279a1
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/OTYPE_CONF.log
@@ -0,0 +1,56 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:44 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/OTYPE_CONF.ctl
+Data File: ODBCAPTURE/OTYPE_CONF.csv
+ Bad File: ODBCAPTURE/OTYPE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."OTYPE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+INSTALL_OTYPE FIRST 20 , O(") CHARACTER
+INSTALL_ORDER NEXT * , O(") CHARACTER
+EXT NEXT 6 , O(") CHARACTER
+EXT2 NEXT 6 , O(") CHARACTER
+EXT3 NEXT 6 , O(") CHARACTER
+NAME_CHECK_OTYPE NEXT 30 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+OBJECT_TYPE NEXT 30 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."OTYPE_CONF":
+ 35 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 348500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 35
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:44 2024
+Run ended on Mon Apr 15 01:44:45 2024
+
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/ROLE_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/ROLE_CONF.log
new file mode 100644
index 0000000..d45cb6d
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/ROLE_CONF.log
@@ -0,0 +1,51 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:47 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/ROLE_CONF.ctl
+Data File: ODBCAPTURE/ROLE_CONF.csv
+ Bad File: ODBCAPTURE/ROLE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."ROLE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+ROLENAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."ROLE_CONF":
+ 105 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 292000 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 105
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:47 2024
+Run ended on Mon Apr 15 01:44:47 2024
+
+Elapsed time was: 00:00:00.33
+CPU time was: 00:00:00.03
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/SCHEMA_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/SCHEMA_CONF.log
new file mode 100644
index 0000000..9f09eef
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/SCHEMA_CONF.log
@@ -0,0 +1,53 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:50 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/SCHEMA_CONF.ctl
+Data File: ODBCAPTURE/SCHEMA_CONF.csv
+ Bad File: ODBCAPTURE/SCHEMA_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."SCHEMA_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+TS_SIZE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+TABLESPACE_NAME NEXT 30 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."SCHEMA_CONF":
+ 9 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 303000 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 9
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:50 2024
+Run ended on Mon Apr 15 01:44:50 2024
+
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/TYPE_CONF.log b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/TYPE_CONF.log
new file mode 100644
index 0000000..b64af63
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/ODBCapture/TYPE_CONF.log
@@ -0,0 +1,51 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:53 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/TYPE_CONF.ctl
+Data File: ODBCAPTURE/TYPE_CONF.csv
+ Bad File: ODBCAPTURE/TYPE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."TYPE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+INSTALL_TYPE_PARENT NEXT 10 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."TYPE_CONF":
+ 3 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 262500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 3
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:44:53 2024
+Run ended on Mon Apr 15 01:44:53 2024
+
+Elapsed time was: 00:00:00.38
+CPU time was: 00:00:00.05
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/db_build_junit_report.xml b/builds/OraEE213_AP212_ORDS222/grbsrc/db_build_junit_report.xml
new file mode 100644
index 0000000..9fbf132
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/db_build_junit_report.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/install_grbsrc.log b/builds/OraEE213_AP212_ORDS222/grbsrc/install_grbsrc.log
new file mode 100644
index 0000000..e89eefc
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/install_grbsrc.log
@@ -0,0 +1,782 @@
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .15 seconds (started at 2024-04-15T01:44:32)
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .07 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .11 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .05 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .22 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .35 seconds (started at 2024-04-15T01:44:33)
+=== DBI Started: ODBCAPTURE/INSTALL_TYPE_TIMING.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .34 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .06 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .39 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .46 seconds (started at 2024-04-15T01:44:35)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .4 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .41 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/ZIP_FILES.tab
+
+Table created.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .15 seconds (started at 2024-04-15T01:44:36)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .07 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tab
+
+Table created.
+
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .06 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:40 for a duration of 2.95 seconds (started at 2024-04-15T01:44:37)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:43 for a duration of 2.92 seconds (started at 2024-04-15T01:44:40)
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OTYPE_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:45 for a duration of 2.82 seconds (started at 2024-04-15T01:44:43)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:48 for a duration of 2.78 seconds (started at 2024-04-15T01:44:45)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:51 for a duration of 2.9 seconds (started at 2024-04-15T01:44:48)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of 2.9 seconds (started at 2024-04-15T01:44:51)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .11 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .24 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .17 seconds (started at 2024-04-15T01:44:54)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .15 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .13 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .11 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .23 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .09 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .12 seconds (started at 2024-04-15T01:44:56)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .13 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .15 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .1 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .12 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .09 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+=== DBI Started: ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw
+
+View created.
+
+
+Warning: View created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .09 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/SCHEMA_OBJECTS_VW.vw
+
+View created.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .23 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/UOR_INSTALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .11 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw
+
+View created.
+
+
+View created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .21 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .14 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:00 for a duration of .97 seconds (started at 2024-04-15T01:44:59)
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .13 seconds (started at 2024-04-15T01:45:00)
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .15 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tabfk
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .19 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .07 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .09 seconds (started at 2024-04-15T01:45:01)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for grbsrc Install Type
+-- ODBCAPTURE Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for grbsrc Install Type
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK3";
+alter table "ODBCAPTURE"."ROLE_CONF" ENABLE constraint "ROLE_CONF_FK1";
+alter table "ODBCAPTURE"."SCHEMA_CONF" ENABLE constraint "SCHEMA_CONF_FK1";
+alter table "ODBCAPTURE"."TYPE_CONF" ENABLE constraint "TYPE_CONF_FK1";
+-- ODBCAPTURE Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for grbsrc Install Type
+-- ODBCAPTURE Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for grbsrc Install Type
+-- ODBCAPTURE Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:06 for a duration of 4.33 seconds (started at 2024-04-15T01:45:01)
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/install_sys.log b/builds/OraEE213_AP212_ORDS222/grbsrc/install_sys.log
new file mode 100644
index 0000000..5e7a689
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/install_sys.log
@@ -0,0 +1,269 @@
+=== DBI Started: SYS/ODBCAPTURE.usr
+
+User created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of 3.93 seconds (started at 2024-04-15T01:44:28)
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/install_system.log b/builds/OraEE213_AP212_ORDS222/grbsrc/install_system.log
new file mode 100644
index 0000000..6e4b9b7
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/install_system.log
@@ -0,0 +1,40 @@
+=== DBI Started: SYSTEM/GRAB_SCRIPTS_DIR.dir
+
+Directory created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .17 seconds (started at 2024-04-15T01:44:32)
+=== DBI Started: SYSTEM/ODBCAPTURE_usr.grnt
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .33 seconds (started at 2024-04-15T01:44:32)
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/log_files_junit_report.xml b/builds/OraEE213_AP212_ORDS222/grbsrc/log_files_junit_report.xml
new file mode 100644
index 0000000..85ba78d
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/log_files_junit_report.xml
@@ -0,0 +1,1082 @@
+
+
+
+
+
+
+
+=== DBI Started: ./installation_prepare.sql
+Create_Temp_Publicly_Updateable_Table_SQL
+Table created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .15 seconds (started at 2024-04-15T01:44:32)
+
+
+
+
+=== DBI Started: ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .11 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .14 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/COMMON_UTIL.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .07 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind
+Index created.
+Index created.
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .11 seconds (started at 2024-04-15T01:44:54)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of .24 seconds (started at 2024-04-15T01:44:54)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_OBJECTS_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .23 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .22 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .17 seconds (started at 2024-04-15T01:44:54)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .1 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:40 for a duration of 2.95 seconds (started at 2024-04-15T01:44:37)
+### SQL*Loader Log File: ODBCAPTURE/DLOAD_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:39 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/DLOAD_CONF.ctl
+Data File: ODBCAPTURE/DLOAD_CONF.csv
+ Bad File: ODBCAPTURE/DLOAD_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."DLOAD_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+TABLE_NAME NEXT 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+BEFORE_SELECT_SQL NEXT 4000 , O(") CHARACTER
+WHERE_CLAUSE NEXT 4000 , O(") CHARACTER
+ORDER_BY_COLUMNS NEXT 4000 , O(") CHARACTER
+AFTER_ORDER_BY_SQL NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+value used for ROWS parameter changed from 250 to 60
+Table "ODBCAPTURE"."DLOAD_CONF":
+ 6 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 1038360 bytes(60 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 6
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:39 2024
+Run ended on Mon Apr 15 01:44:39 2024
+Elapsed time was: 00:00:00.47
+CPU time was: 00:00:00.04
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .35 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.tabfk
+Table altered.
+Table altered.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:45:00 for a duration of .97 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/GRAB_SCRIPTS.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .11 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/INSTALL_TYPE_TIMING.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:43 for a duration of 2.92 seconds (started at 2024-04-15T01:44:40)
+### SQL*Loader Log File: ODBCAPTURE/OBJECT_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:41 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/OBJECT_CONF.ctl
+Data File: ODBCAPTURE/OBJECT_CONF.csv
+ Bad File: ODBCAPTURE/OBJECT_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."OBJECT_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_OTYPE NEXT 20 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+ONAME_FILTER NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+value used for ROWS parameter changed from 250 to 201
+Table "ODBCAPTURE"."OBJECT_CONF":
+ 0 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 1043592 bytes(201 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 0
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:41 2024
+Run ended on Mon Apr 15 01:44:42 2024
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .34 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.tabfk
+Table altered.
+Table altered.
+Table altered.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .19 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .09 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .05 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .12 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .06 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .13 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:34 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .06 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .12 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .07 seconds (started at 2024-04-15T01:44:34)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .08 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .15 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind
+Index created.
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .15 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .1 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .08 seconds (started at 2024-04-15T01:44:35)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind
+Index created.
+Index created.
+=== DBI Completed at 2024-04-15T01:44:55 for a duration of .13 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/OTYPE_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:45 for a duration of 2.82 seconds (started at 2024-04-15T01:44:43)
+### SQL*Loader Log File: ODBCAPTURE/OTYPE_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:44 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/OTYPE_CONF.ctl
+Data File: ODBCAPTURE/OTYPE_CONF.csv
+ Bad File: ODBCAPTURE/OTYPE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."OTYPE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+INSTALL_OTYPE FIRST 20 , O(") CHARACTER
+INSTALL_ORDER NEXT * , O(") CHARACTER
+EXT NEXT 6 , O(") CHARACTER
+EXT2 NEXT 6 , O(") CHARACTER
+EXT3 NEXT 6 , O(") CHARACTER
+NAME_CHECK_OTYPE NEXT 30 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+OBJECT_TYPE NEXT 30 , O(") CHARACTER
+
+Table "ODBCAPTURE"."OTYPE_CONF":
+ 35 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 348500 bytes(250 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 35
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:44 2024
+Run ended on Mon Apr 15 01:44:45 2024
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/OTYPE_CONF.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:35 for a duration of .39 seconds (started at 2024-04-15T01:44:35)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:57 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:57)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .12 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .09 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:58 for a duration of .11 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:58)
+
+
+
+
+=== DBI Started: ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw
+View created.
+Warning: View created with compilation errors.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .09 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:48 for a duration of 2.78 seconds (started at 2024-04-15T01:44:45)
+### SQL*Loader Log File: ODBCAPTURE/ROLE_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:47 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/ROLE_CONF.ctl
+Data File: ODBCAPTURE/ROLE_CONF.csv
+ Bad File: ODBCAPTURE/ROLE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."ROLE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+ROLENAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+Table "ODBCAPTURE"."ROLE_CONF":
+ 105 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 292000 bytes(250 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 105
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:47 2024
+Run ended on Mon Apr 15 01:44:47 2024
+Elapsed time was: 00:00:00.33
+CPU time was: 00:00:00.03
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .46 seconds (started at 2024-04-15T01:44:35)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROLE_CONF.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .12 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .13 seconds (started at 2024-04-15T01:45:00)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROOT_SCRIPTS.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .05 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:51 for a duration of 2.9 seconds (started at 2024-04-15T01:44:48)
+### SQL*Loader Log File: ODBCAPTURE/SCHEMA_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:50 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/SCHEMA_CONF.ctl
+Data File: ODBCAPTURE/SCHEMA_CONF.csv
+ Bad File: ODBCAPTURE/SCHEMA_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."SCHEMA_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+TS_SIZE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+TABLESPACE_NAME NEXT 30 , O(") CHARACTER
+
+Table "ODBCAPTURE"."SCHEMA_CONF":
+ 9 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 303000 bytes(250 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 9
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:50 2024
+Run ended on Mon Apr 15 01:44:50 2024
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tab
+Table created.
+Table altered.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .4 seconds (started at 2024-04-15T01:44:36)
+
+
+
+
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .07 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/SCHEMA_OBJECTS_VW.vw
+View created.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .23 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:44:54 for a duration of 2.9 seconds (started at 2024-04-15T01:44:51)
+### SQL*Loader Log File: ODBCAPTURE/TYPE_CONF.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:44:53 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: ODBCAPTURE/TYPE_CONF.ctl
+Data File: ODBCAPTURE/TYPE_CONF.csv
+ Bad File: ODBCAPTURE/TYPE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."TYPE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+INSTALL_TYPE_PARENT NEXT 10 , O(") CHARACTER
+
+Table "ODBCAPTURE"."TYPE_CONF":
+ 3 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 262500 bytes(250 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 3
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:44:53 2024
+Run ended on Mon Apr 15 01:44:53 2024
+Elapsed time was: 00:00:00.38
+CPU time was: 00:00:00.05
+
+
+
+
+
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:44:36 for a duration of .41 seconds (started at 2024-04-15T01:44:36)
+
+
+
+
+=== DBI Started: ODBCAPTURE/TYPE_CONF.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .09 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/UOR_INSTALL_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .1 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZIP_FILES.tab
+Table created.
+Table altered.
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .15 seconds (started at 2024-04-15T01:44:36)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:45:01 for a duration of .15 seconds (started at 2024-04-15T01:45:01)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZIP_UTIL_PKG.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:44:33 for a duration of .06 seconds (started at 2024-04-15T01:44:33)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .07 seconds (started at 2024-04-15T01:44:37)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:55)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .11 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tab
+Table created.
+=== DBI Completed at 2024-04-15T01:44:37 for a duration of .06 seconds (started at 2024-04-15T01:44:37)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:44:56 for a duration of .07 seconds (started at 2024-04-15T01:44:56)
+
+
+
+
+=== DBI Started: ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw
+View created.
+View created.
+=== DBI Completed at 2024-04-15T01:44:59 for a duration of .21 seconds (started at 2024-04-15T01:44:59)
+
+
+
+
+
+
+=== DBI Started: SYS/ODBCAPTURE.usr
+User created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of 3.93 seconds (started at 2024-04-15T01:44:28)
+
+
+
+
+
+
+=== DBI Started: SYSTEM/GRAB_SCRIPTS_DIR.dir
+Directory created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .17 seconds (started at 2024-04-15T01:44:32)
+
+
+
+
+=== DBI Started: SYSTEM/ODBCAPTURE_usr.grnt
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:44:32 for a duration of .33 seconds (started at 2024-04-15T01:44:32)
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/grbsrc/odbcapture_installation_logs.log b/builds/OraEE213_AP212_ORDS222/grbsrc/odbcapture_installation_logs.log
new file mode 100644
index 0000000..26950f7
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/grbsrc/odbcapture_installation_logs.log
@@ -0,0 +1,52 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:05 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: odbcapture_installation_logs.ctl
+Data File: odbcapture_installation_logs.csv
+ Bad File: odbcapture_installation_logs.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 0
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE_INSTALLATION_LOGS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+LOAD_DTM SYSDATE
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+FILE_NAME NEXT 512 , O(") CHARACTER
+CONTENTS DERIVED * EOF CHARACTER
+ Dynamic LOBFILE. Filename in field FILE_NAME
+
+
+Table "ODBCAPTURE_INSTALLATION_LOGS":
+ 9 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 131500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 0
+Total logical records read: 9
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:05 2024
+Run ended on Mon Apr 15 01:45:05 2024
+
+Elapsed time was: 00:00:00.72
+CPU time was: 00:00:00.06
diff --git a/builds/OraEE213_AP212_ORDS222/junit_core_report_show_current.xml b/builds/OraEE213_AP212_ORDS222/junit_core_report_show_current.xml
new file mode 100644
index 0000000..60171a4
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/junit_core_report_show_current.xml
@@ -0,0 +1,626 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/junit_xml_persist_all.xml b/builds/OraEE213_AP212_ORDS222/junit_xml_persist_all.xml
new file mode 100644
index 0000000..5eef905
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/junit_xml_persist_all.xml
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/version.txt b/builds/OraEE213_AP212_ORDS222/version.txt
new file mode 100644
index 0000000..9afc5c8
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/version.txt
@@ -0,0 +1 @@
+1.003
diff --git a/builds/OraEE213_AP212_ORDS222/wt_core_report_dbms_out.log b/builds/OraEE213_AP212_ORDS222/wt_core_report_dbms_out.log
new file mode 100644
index 0000000..a5d4f7e
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wt_core_report_dbms_out.log
@@ -0,0 +1,136 @@
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:27 AM
+ Test Results for WTP.CORE_DATA
+ Database Object Under Test is PACKAGE BODY WTP.CORE_DATA
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 64
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 3 Total Testcases: 9
+ Total Run Time (sec): 0.6 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:28 AM
+ Test Results for WTP.HOOK
+ Database Object Under Test is PACKAGE BODY WTP.HOOK
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 23
+ Average Elapsed msec: 2 Failed Assertions: 0
+ Maximum Elapsed msec: 10 Total Testcases: 5
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:28 AM
+ Test Results for WTP.WTPLSQL
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 33
+ Average Elapsed msec: 16 Failed Assertions: 0
+ Maximum Elapsed msec: 138 Total Testcases: 16
+ Total Run Time (sec): 0.5 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:28 AM
+ Test Results for WTP.WT_ASSERT
+ Database Object Under Test is PACKAGE BODY WTP.WT_ASSERT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 414
+ Average Elapsed msec: 22 Failed Assertions: 0
+ Maximum Elapsed msec: 2892 Total Testcases: 152
+ Total Run Time (sec): 9.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:38 AM
+ Test Results for WTP.WT_DBOUT
+ Database Object Under Test is PACKAGE BODY WTP.WT_DBOUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 15
+ Average Elapsed msec: 4 Failed Assertions: 0
+ Maximum Elapsed msec: 26 Total Testcases: 12
+ Total Run Time (sec): 0.7 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:38 AM
+ Test Results for WTP.WT_JOB
+ Database Object Under Test is PACKAGE BODY WTP.WT_JOB
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 31
+ Average Elapsed msec: 212 Failed Assertions: 0
+ Maximum Elapsed msec: 1205 Total Testcases: 8
+ Total Run Time (sec): 6.8 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:45 AM
+ Test Results for WTP.WT_PROFILE
+ Database Object Under Test is PACKAGE BODY WTP.WT_PROFILE
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 302
+ Average Elapsed msec: 9 Failed Assertions: 1
+ Maximum Elapsed msec: 625 Total Testcases: 39
+ Total Run Time (sec): 2.9 Failed Testcases: 1
+ Testcase Yield: 97%
+
+ WTP.WT_PROFILE Test Runner Details
+ --------------------------------------------------------------
+---*** Finalize Happy Path 2 ***----------------------------------------------
+#FAIL#.028ms l_recTEST.profiler_runid. ISNOTNULL - Expected NOT NULL and got ""
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:48 AM
+ Test Results for WTP.WT_RESULT
+ Database Object Under Test is PACKAGE BODY WTP.WT_RESULT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 21
+ Average Elapsed msec: 3 Failed Assertions: 0
+ Maximum Elapsed msec: 35 Total Testcases: 3
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:48 AM
+ Test Results for WTP.WT_TESTCASE
+ Database Object Under Test is PACKAGE BODY WTP.WT_TESTCASE
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 15
+ Average Elapsed msec: 3 Failed Assertions: 0
+ Maximum Elapsed msec: 37 Total Testcases: 12
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:48 AM
+ Test Results for WTP.WT_TEST_RUN
+ Database Object Under Test is PACKAGE BODY WTP.WT_TEST_RUN
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 75
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 19 Total Testcases: 18
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Start Date/Time: 15-Apr-2024 01:43:49 AM
+ Test Results for WTP.WT_TEST_RUNNER
+ Database Object Under Test is PACKAGE BODY WTP.WT_TEST_RUNNER
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 27
+ Average Elapsed msec: 2 Failed Assertions: 0
+ Maximum Elapsed msec: 26 Total Testcases: 16
+ Total Run Time (sec): 0.4 Failed Testcases: 0
+ Testcase Yield: 100%
+
diff --git a/builds/OraEE213_AP212_ORDS222/wt_persist_report_dbms_out.log b/builds/OraEE213_AP212_ORDS222/wt_persist_report_dbms_out.log
new file mode 100644
index 0000000..0aa5aa1
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wt_persist_report_dbms_out.log
@@ -0,0 +1,211 @@
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.CORE_DATA
+ Run ID 3: 15-Apr-2024 01:44:04 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 64
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 9
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.CORE_DATA
+ ----------------------------------------------------------------
+ Ignored Lines: 184 Total Profiled Lines: 263
+ Excluded Lines: 1 Total Executed Lines: 73
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 2 Unknown Lines: 5
+ Maximum LineExec usec: 164 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.HOOK
+ Run ID 4: 15-Apr-2024 01:44:05 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 23
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 5
+ Total Run Time (sec): 0.1 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.HOOK
+ ----------------------------------------------------------------
+ Ignored Lines: 68 Total Profiled Lines: 86
+ Excluded Lines: 1 Total Executed Lines: 14
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 23 Unknown Lines: 3
+ Maximum LineExec usec: 120 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WTPLSQL
+ Run ID 5: 15-Apr-2024 01:44:06 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 33
+ Average Elapsed msec: 16 Failed Assertions: 0
+ Maximum Elapsed msec: 149 Total Testcases: 16
+ Total Run Time (sec): 0.6 Failed Testcases: 0
+ Testcase Yield: 100%
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_ASSERT
+ Run ID 6: 15-Apr-2024 01:44:06 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 414
+ Average Elapsed msec: 12 Failed Assertions: 0
+ Maximum Elapsed msec: 2446 Total Testcases: 152
+ Total Run Time (sec): 4.9 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_ASSERT
+ ----------------------------------------------------------------
+ Ignored Lines: 1150 Total Profiled Lines: 1520
+ Excluded Lines: 2 Total Executed Lines: 314
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 156 Unknown Lines: 54
+ Maximum LineExec usec: 34014 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_DBOUT
+ Run ID 7: 15-Apr-2024 01:44:14 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 15
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 1 Total Testcases: 12
+ Total Run Time (sec): 0.1 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_DBOUT
+ ----------------------------------------------------------------
+ Ignored Lines: 55 Total Profiled Lines: 82
+ Excluded Lines: 2 Total Executed Lines: 22
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 29 Unknown Lines: 3
+ Maximum LineExec usec: 494 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_JOB
+ Run ID 8: 15-Apr-2024 01:44:14 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 31
+ Average Elapsed msec: 190 Failed Assertions: 0
+ Maximum Elapsed msec: 1066 Total Testcases: 8
+ Total Run Time (sec): 6.0 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_JOB
+ ----------------------------------------------------------------
+ Ignored Lines: 118 Total Profiled Lines: 143
+ Excluded Lines: 0 Total Executed Lines: 20
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 297 Unknown Lines: 5
+ Maximum LineExec usec: 3728 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_PROFILE
+ Run ID 9: 15-Apr-2024 01:44:21 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 302
+ Average Elapsed msec: 5 Failed Assertions: 0
+ Maximum Elapsed msec: 514 Total Testcases: 39
+ Total Run Time (sec): 1.5 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_PROFILE
+ ----------------------------------------------------------------
+ Ignored Lines: 639 Total Profiled Lines: 792
+ Excluded Lines: 3 Total Executed Lines: 131
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 626 Unknown Lines: 19
+ Maximum LineExec usec: 26887 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_RESULT
+ Run ID 10: 15-Apr-2024 01:44:24 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 21
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 4 Total Testcases: 3
+ Total Run Time (sec): 0.1 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_RESULT
+ ----------------------------------------------------------------
+ Ignored Lines: 93 Total Profiled Lines: 140
+ Excluded Lines: 0 Total Executed Lines: 45
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 12 Unknown Lines: 2
+ Maximum LineExec usec: 1124 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_TESTCASE
+ Run ID 11: 15-Apr-2024 01:44:25 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 15
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 12
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_TESTCASE
+ ----------------------------------------------------------------
+ Ignored Lines: 53 Total Profiled Lines: 76
+ Excluded Lines: 2 Total Executed Lines: 20
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 43 Unknown Lines: 1
+ Maximum LineExec usec: 861 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_TEST_RUN
+ Run ID 13: 15-Apr-2024 01:44:25 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 75
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 6 Total Testcases: 18
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_TEST_RUN
+ ----------------------------------------------------------------
+ Ignored Lines: 278 Total Profiled Lines: 365
+ Excluded Lines: 5 Total Executed Lines: 73
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 15 Unknown Lines: 9
+ Maximum LineExec usec: 347 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003
+ Test Results for WTP.WT_TEST_RUNNER
+ Run ID 14: 15-Apr-2024 01:44:26 AM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 27
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 16
+ Total Run Time (sec): 0.1 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WTP.WT_TEST_RUNNER
+ ----------------------------------------------------------------
+ Ignored Lines: 92 Total Profiled Lines: 130
+ Excluded Lines: 2 Total Executed Lines: 32
+ Minimum LineExec usec: 0 Not Executed Lines: 0
+ Average LineExec usec: 27 Unknown Lines: 4
+ Maximum LineExec usec: 566 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/DLOAD_CONF.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/DLOAD_CONF.log
new file mode 100644
index 0000000..caa443c
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/DLOAD_CONF.log
@@ -0,0 +1,57 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:08 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/DLOAD_CONF.ctl
+Data File: ODBCAPTURE/DLOAD_CONF.csv
+ Bad File: ODBCAPTURE/DLOAD_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."DLOAD_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+TABLE_NAME NEXT 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+BEFORE_SELECT_SQL NEXT 4000 , O(") CHARACTER
+WHERE_CLAUSE NEXT 4000 , O(") CHARACTER
+ORDER_BY_COLUMNS NEXT 4000 , O(") CHARACTER
+AFTER_ORDER_BY_SQL NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+value used for ROWS parameter changed from 250 to 60
+
+Table "ODBCAPTURE"."DLOAD_CONF":
+ 7 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 1038360 bytes(60 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 7
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:08 2024
+Run ended on Mon Apr 15 01:45:08 2024
+
+Elapsed time was: 00:00:00.41
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/OBJECT_CONF.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/OBJECT_CONF.log
new file mode 100644
index 0000000..4bc27d8
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/OBJECT_CONF.log
@@ -0,0 +1,54 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:09 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/OBJECT_CONF.ctl
+Data File: ODBCAPTURE/OBJECT_CONF.csv
+ Bad File: ODBCAPTURE/OBJECT_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."OBJECT_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_OTYPE NEXT 20 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+ONAME_FILTER NEXT 4000 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+value used for ROWS parameter changed from 250 to 201
+
+Table "ODBCAPTURE"."OBJECT_CONF":
+ 8 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 1043592 bytes(201 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 8
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:09 2024
+Run ended on Mon Apr 15 01:45:09 2024
+
+Elapsed time was: 00:00:00.33
+CPU time was: 00:00:00.03
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/ROLE_CONF.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/ROLE_CONF.log
new file mode 100644
index 0000000..489ce87
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/ROLE_CONF.log
@@ -0,0 +1,51 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:10 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/ROLE_CONF.ctl
+Data File: ODBCAPTURE/ROLE_CONF.csv
+ Bad File: ODBCAPTURE/ROLE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."ROLE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+ROLENAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."ROLE_CONF":
+ 0 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 292000 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 0
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:10 2024
+Run ended on Mon Apr 15 01:45:11 2024
+
+Elapsed time was: 00:00:00.32
+CPU time was: 00:00:00.05
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/SCHEMA_CONF.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/SCHEMA_CONF.log
new file mode 100644
index 0000000..bb3de27
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/SCHEMA_CONF.log
@@ -0,0 +1,53 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:12 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/SCHEMA_CONF.ctl
+Data File: ODBCAPTURE/SCHEMA_CONF.csv
+ Bad File: ODBCAPTURE/SCHEMA_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."SCHEMA_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+USERNAME FIRST 128 , O(") CHARACTER
+INSTALL_TYPE NEXT 10 , O(") CHARACTER
+TS_SIZE NEXT 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+TABLESPACE_NAME NEXT 30 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."SCHEMA_CONF":
+ 1 Row successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 303000 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 1
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:12 2024
+Run ended on Mon Apr 15 01:45:12 2024
+
+Elapsed time was: 00:00:00.33
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/TYPE_CONF.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/TYPE_CONF.log
new file mode 100644
index 0000000..92ef2c0
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/ODBCAPTURE/TYPE_CONF.log
@@ -0,0 +1,51 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:13 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: ODBCAPTURE/TYPE_CONF.ctl
+Data File: ODBCAPTURE/TYPE_CONF.csv
+ Bad File: ODBCAPTURE/TYPE_CONF.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE"."TYPE_CONF", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+NOTES NEXT 1024 , O(") CHARACTER
+INSTALL_TYPE_PARENT NEXT 10 , O(") CHARACTER
+
+
+Table "ODBCAPTURE"."TYPE_CONF":
+ 4 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 262500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 4
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:13 2024
+Run ended on Mon Apr 15 01:45:13 2024
+
+Elapsed time was: 00:00:00.34
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/db_build_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpgrb/db_build_junit_report.xml
new file mode 100644
index 0000000..9fbf132
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/db_build_junit_report.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/install_sys.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/install_sys.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/install_system.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/install_system.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/install_wtpgrb.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/install_wtpgrb.log
new file mode 100644
index 0000000..85c67d2
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/install_wtpgrb.log
@@ -0,0 +1,146 @@
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:45:08 for a duration of .11 seconds (started at 2024-04-15T01:45:08)
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK2";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:09 for a duration of 1.27 seconds (started at 2024-04-15T01:45:08)
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK3";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:10 for a duration of 1.29 seconds (started at 2024-04-15T01:45:09)
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."ROLE_CONF" DISABLE constraint "ROLE_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:12 for a duration of 1.27 seconds (started at 2024-04-15T01:45:10)
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."SCHEMA_CONF" DISABLE constraint "SCHEMA_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:13 for a duration of 1.22 seconds (started at 2024-04-15T01:45:12)
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."TYPE_CONF" DISABLE constraint "TYPE_CONF_FK1";
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:14 for a duration of 1.23 seconds (started at 2024-04-15T01:45:13)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpgrb Install Type
+-- ODBCAPTURE Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpgrb Install Type
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" ENABLE constraint "DLOAD_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" ENABLE constraint "OBJECT_CONF_FK3";
+alter table "ODBCAPTURE"."ROLE_CONF" ENABLE constraint "ROLE_CONF_FK1";
+alter table "ODBCAPTURE"."SCHEMA_CONF" ENABLE constraint "SCHEMA_CONF_FK1";
+alter table "ODBCAPTURE"."TYPE_CONF" ENABLE constraint "TYPE_CONF_FK1";
+-- ODBCAPTURE Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpgrb Install Type
+-- ODBCAPTURE Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpgrb Install Type
+-- ODBCAPTURE Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:45:17 for a duration of 2.67 seconds (started at 2024-04-15T01:45:14)
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/log_files_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpgrb/log_files_junit_report.xml
new file mode 100644
index 0000000..7b5d20c
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/log_files_junit_report.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+=== DBI Started: ./installation_prepare.sql
+Create_Temp_Publicly_Updateable_Table_SQL
+Table created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:45:08 for a duration of .11 seconds (started at 2024-04-15T01:45:08)
+
+
+
+
+=== DBI Started: ODBCAPTURE/DLOAD_CONF.cdl
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK1";
+alter table "ODBCAPTURE"."DLOAD_CONF" DISABLE constraint "DLOAD_CONF_FK2";
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:45:09 for a duration of 1.27 seconds (started at 2024-04-15T01:45:08)
+### SQL*Loader Log File: ODBCAPTURE/DLOAD_CONF.log
+ORA-01422: exact fetch returns more than requested number of rows
+
+
+
+
+=== DBI Started: ODBCAPTURE/OBJECT_CONF.cdl
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK1";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK2";
+alter table "ODBCAPTURE"."OBJECT_CONF" DISABLE constraint "OBJECT_CONF_FK3";
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:45:10 for a duration of 1.29 seconds (started at 2024-04-15T01:45:09)
+### SQL*Loader Log File: ODBCAPTURE/OBJECT_CONF.log
+ORA-01422: exact fetch returns more than requested number of rows
+
+
+
+
+=== DBI Started: ODBCAPTURE/ROLE_CONF.cdl
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."ROLE_CONF" DISABLE constraint "ROLE_CONF_FK1";
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:45:12 for a duration of 1.27 seconds (started at 2024-04-15T01:45:10)
+### SQL*Loader Log File: ODBCAPTURE/ROLE_CONF.log
+ORA-01422: exact fetch returns more than requested number of rows
+
+
+
+
+=== DBI Started: ODBCAPTURE/SCHEMA_CONF.cdl
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."SCHEMA_CONF" DISABLE constraint "SCHEMA_CONF_FK1";
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:45:13 for a duration of 1.22 seconds (started at 2024-04-15T01:45:12)
+### SQL*Loader Log File: ODBCAPTURE/SCHEMA_CONF.log
+ORA-01422: exact fetch returns more than requested number of rows
+
+
+
+
+=== DBI Started: ODBCAPTURE/TYPE_CONF.cdl
+Disable Triggers and Foreign Keys
+alter table "ODBCAPTURE"."TYPE_CONF" DISABLE constraint "TYPE_CONF_FK1";
+PL/SQL procedure successfully completed.
+sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:45:14 for a duration of 1.23 seconds (started at 2024-04-15T01:45:13)
+### SQL*Loader Log File: ODBCAPTURE/TYPE_CONF.log
+ORA-01422: exact fetch returns more than requested number of rows
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpgrb/odbcapture_installation_logs.log b/builds/OraEE213_AP212_ORDS222/wtpgrb/odbcapture_installation_logs.log
new file mode 100644
index 0000000..51bce11
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpgrb/odbcapture_installation_logs.log
@@ -0,0 +1,52 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:45:16 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: odbcapture_installation_logs.ctl
+Data File: odbcapture_installation_logs.csv
+ Bad File: odbcapture_installation_logs.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 0
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE_INSTALLATION_LOGS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+LOAD_DTM SYSDATE
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+FILE_NAME NEXT 512 , O(") CHARACTER
+CONTENTS DERIVED * EOF CHARACTER
+ Dynamic LOBFILE. Filename in field FILE_NAME
+
+
+Table "ODBCAPTURE_INSTALLATION_LOGS":
+ 8 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 131500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 0
+Total logical records read: 8
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:45:16 2024
+Run ended on Mon Apr 15 01:45:16 2024
+
+Elapsed time was: 00:00:00.57
+CPU time was: 00:00:00.06
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/db_build_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpsav/db_build_junit_report.xml
new file mode 100644
index 0000000..b4669f6
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsav/db_build_junit_report.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/install_sys.log b/builds/OraEE213_AP212_ORDS222/wtpsav/install_sys.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/install_system.log b/builds/OraEE213_AP212_ORDS222/wtpsav/install_system.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/install_wtpsav.log b/builds/OraEE213_AP212_ORDS222/wtpsav/install_wtpsav.log
new file mode 100644
index 0000000..440b19b
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsav/install_wtpsav.log
@@ -0,0 +1,1159 @@
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .09 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNNUMBER.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .06 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_DBOUTS_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .05 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_TESTCASES_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:07)
+=== DBI Started: WTP/WT_TEST_RUNNERS_SEQ.seq
+
+Sequence created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .05 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUNS_SEQ.seq
+
+Sequence created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/JUNIT_XML_PERSIST_ALL.proc
+
+Warning: Procedure created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_DBOUT.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_JOB.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_PERSIST_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_PROFILE.pspec
+
+Warning: Package created with compilation errors.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .08 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_RESULT.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .07 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TESTCASE.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUN.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .09 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/WT_TEST_RUNNER.pspec
+
+Package created.
+
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:09 for a duration of .43 seconds (started at 2024-04-15T01:43:08)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .69 seconds (started at 2024-04-15T01:43:09)
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .34 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_DBOUTS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .39 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_DBOUT_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .56 seconds (started at 2024-04-15T01:43:10)
+=== DBI Started: WTP/WT_PROFILES.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .34 seconds (started at 2024-04-15T01:43:11)
+=== DBI Started: WTP/WT_RESULTS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .38 seconds (started at 2024-04-15T01:43:11)
+=== DBI Started: WTP/WT_TESTCASES.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .33 seconds (started at 2024-04-15T01:43:12)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .7 seconds (started at 2024-04-15T01:43:12)
+=== DBI Started: WTP/WT_TEST_RUNNERS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .34 seconds (started at 2024-04-15T01:43:13)
+=== DBI Started: WTP/WT_TEST_RUNS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .69 seconds (started at 2024-04-15T01:43:13)
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_DBOUTS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_RESULTS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabind
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .06 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_TEST_RUNS.tabind
+
+Index created.
+
+
+Index created.
+
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .14 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_DBOUT_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .7 seconds (started at 2024-04-15T01:43:14)
+=== DBI Started: WTP/WT_PROFILES_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .55 seconds (started at 2024-04-15T01:43:15)
+=== DBI Started: WTP/WT_RESULTS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:16 for a duration of .61 seconds (started at 2024-04-15T01:43:15)
+=== DBI Started: WTP/WT_SCHEDULER_JOBS_VW.vw
+
+View created.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .42 seconds (started at 2024-04-15T01:43:16)
+=== DBI Started: WTP/WT_TESTCASE_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .5 seconds (started at 2024-04-15T01:43:17)
+=== DBI Started: WTP/WT_TEST_RUNS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .63 seconds (started at 2024-04-15T01:43:17)
+=== DBI Started: WTP/WT_DBOUT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .08 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_JOB.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .17 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_PERSIST_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .21 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_PROFILE.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .26 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_RESULT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:18)
+=== DBI Started: WTP/WT_TESTCASE.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUN.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUNNER.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .06 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_DBOUT_RUNS.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_PROFILES.tabfk
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_RESULTS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .11 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: WTP/WT_TEST_RUNS.tabfk
+
+Table altered.
+
+
+Table altered.
+
+=== DBI Completed at 2024-04-15T01:43:20 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpsav Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpsav Install Type
+alter table "WTP"."PLSQL_PROFILER_DATA" ENABLE constraint "PLSQL_PROFILER_DATA_FK1";
+alter table "WTP"."PLSQL_PROFILER_UNITS" ENABLE constraint "PLSQL_PROFILER_UNITS_FK1";
+alter table "WTP"."WT_DBOUT_RUNS" ENABLE constraint "WT_DBOUT_RUNS_FK1";
+alter table "WTP"."WT_PROFILES" ENABLE constraint "WT_PROFILES_FK1";
+alter table "WTP"."WT_RESULTS" ENABLE constraint "WT_RESULTS_FK1";
+alter table "WTP"."WT_RESULTS" ENABLE constraint "WT_RESULTS_FK2";
+alter table "WTP"."WT_TESTCASE_RUNS" ENABLE constraint "WT_TESTCASE_RUNS_FK1";
+alter table "WTP"."WT_TESTCASE_RUNS" ENABLE constraint "WT_TESTCASE_RUNS_FK2";
+alter table "WTP"."WT_TEST_RUNS" ENABLE constraint "WT_TEST_RUNS_FK1";
+alter table "WTP"."WT_TEST_RUNS" ENABLE constraint "WT_TEST_RUNS_FK2";
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpsav Install Type
+alter trigger "WTP"."WT_SELF_TEST$TEST" ENABLE;
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpsav Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:43:23 for a duration of 3.41 seconds (started at 2024-04-15T01:43:20)
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/log_files_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpsav/log_files_junit_report.xml
new file mode 100644
index 0000000..a382c0b
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsav/log_files_junit_report.xml
@@ -0,0 +1,653 @@
+
+
+
+
+
+
+
+
+
+
+
+=== DBI Started: ./installation_prepare.sql
+Create_Temp_Publicly_Updateable_Table_SQL
+Table created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .09 seconds (started at 2024-04-15T01:43:07)
+
+
+
+
+=== DBI Started: WTP/JUNIT_XML_PERSIST_ALL.proc
+Warning: Procedure created with compilation errors.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:43:09 for a duration of .43 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_DATA.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_RUNNUMBER.seq
+Sequence created.
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .06 seconds (started at 2024-04-15T01:43:07)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .69 seconds (started at 2024-04-15T01:43:09)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_RUNS.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .34 seconds (started at 2024-04-15T01:43:10)
+
+
+
+
+=== DBI Started: WTP/PLSQL_PROFILER_UNITS.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .06 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .08 seconds (started at 2024-04-15T01:43:18)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUT.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUTS.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:10 for a duration of .39 seconds (started at 2024-04-15T01:43:10)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUTS.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUTS_SEQ.seq
+Sequence created.
+=== DBI Completed at 2024-04-15T01:43:07 for a duration of .05 seconds (started at 2024-04-15T01:43:07)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUT_RUNS.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .56 seconds (started at 2024-04-15T01:43:10)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUT_RUNS.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_DBOUT_RUNS_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .7 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/WT_JOB.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .17 seconds (started at 2024-04-15T01:43:18)
+
+
+
+
+=== DBI Started: WTP/WT_JOB.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_PERSIST_REPORT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .21 seconds (started at 2024-04-15T01:43:18)
+
+
+
+
+=== DBI Started: WTP/WT_PERSIST_REPORT.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_PROFILE.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .26 seconds (started at 2024-04-15T01:43:18)
+
+
+
+
+=== DBI Started: WTP/WT_PROFILE.pspec
+Warning: Package created with compilation errors.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .08 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_PROFILES.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:11 for a duration of .34 seconds (started at 2024-04-15T01:43:11)
+
+
+
+
+=== DBI Started: WTP/WT_PROFILES.tabfk
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .07 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_PROFILES_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:15 for a duration of .55 seconds (started at 2024-04-15T01:43:15)
+
+
+
+
+=== DBI Started: WTP/WT_RESULT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:18)
+
+
+
+
+=== DBI Started: WTP/WT_RESULT.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .07 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_RESULTS.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .38 seconds (started at 2024-04-15T01:43:11)
+
+
+
+
+=== DBI Started: WTP/WT_RESULTS.tabfk
+Table altered.
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_RESULTS.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .07 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/WT_RESULTS_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:16 for a duration of .61 seconds (started at 2024-04-15T01:43:15)
+
+
+
+
+=== DBI Started: WTP/WT_SCHEDULER_JOBS_VW.vw
+View created.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .42 seconds (started at 2024-04-15T01:43:16)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .06 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASES.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:12 for a duration of .33 seconds (started at 2024-04-15T01:43:12)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASES_SEQ.seq
+Sequence created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:07)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .7 seconds (started at 2024-04-15T01:43:12)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabfk
+Table altered.
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .11 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE_RUNS.tabind
+Index created.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .06 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/WT_TESTCASE_RUNS_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:17 for a duration of .5 seconds (started at 2024-04-15T01:43:17)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUN.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .09 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUN.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .09 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNNER.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:43:19 for a duration of .08 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNNER.pspec
+Package created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .04 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNNERS.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:13 for a duration of .34 seconds (started at 2024-04-15T01:43:13)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNNERS_SEQ.seq
+Sequence created.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .05 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNS.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .69 seconds (started at 2024-04-15T01:43:13)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNS.tabfk
+Table altered.
+Table altered.
+=== DBI Completed at 2024-04-15T01:43:20 for a duration of .12 seconds (started at 2024-04-15T01:43:19)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNS.tabind
+Index created.
+Index created.
+=== DBI Completed at 2024-04-15T01:43:14 for a duration of .14 seconds (started at 2024-04-15T01:43:14)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNS_SEQ.seq
+Sequence created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:08 for a duration of .1 seconds (started at 2024-04-15T01:43:08)
+
+
+
+
+=== DBI Started: WTP/WT_TEST_RUNS_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:43:18 for a duration of .63 seconds (started at 2024-04-15T01:43:17)
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsav/odbcapture_installation_logs.log b/builds/OraEE213_AP212_ORDS222/wtpsav/odbcapture_installation_logs.log
new file mode 100644
index 0000000..c04190d
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsav/odbcapture_installation_logs.log
@@ -0,0 +1,52 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:22 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: odbcapture_installation_logs.ctl
+Data File: odbcapture_installation_logs.csv
+ Bad File: odbcapture_installation_logs.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 0
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE_INSTALLATION_LOGS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+LOAD_DTM SYSDATE
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+FILE_NAME NEXT 512 , O(") CHARACTER
+CONTENTS DERIVED * EOF CHARACTER
+ Dynamic LOBFILE. Filename in field FILE_NAME
+
+
+Table "ODBCAPTURE_INSTALLATION_LOGS":
+ 3 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 131500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 0
+Total logical records read: 3
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:43:22 2024
+Run ended on Mon Apr 15 01:43:22 2024
+
+Elapsed time was: 00:00:00.50
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/WTP/HOOKS.log b/builds/OraEE213_AP212_ORDS222/wtpsrc/WTP/HOOKS.log
new file mode 100644
index 0000000..a9829cf
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/WTP/HOOKS.log
@@ -0,0 +1,53 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:42:44 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: WTP/HOOKS.ctl
+Data File: WTP/HOOKS.csv
+ Bad File: WTP/HOOKS.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "WTP"."HOOKS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+HOOK_NAME FIRST 20 , O(") CHARACTER
+SEQ NEXT * , O(") CHARACTER
+RUN_STRING NEXT 4000 , O(") CHARACTER
+DESCRIPTION NEXT 1000 , O(") CHARACTER
+
+value used for ROWS parameter changed from 250 to 198
+
+Table "WTP"."HOOKS":
+ 5 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 1046232 bytes(198 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 5
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:42:44 2024
+Run ended on Mon Apr 15 01:42:46 2024
+
+Elapsed time was: 00:00:02.04
+CPU time was: 00:00:00.04
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/db_build_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpsrc/db_build_junit_report.xml
new file mode 100644
index 0000000..a7629af
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/db_build_junit_report.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/install_sys.log b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_sys.log
new file mode 100644
index 0000000..0b4cd55
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_sys.log
@@ -0,0 +1,26 @@
+=== DBI Started: SYS/WTP.usr
+
+User created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:23 for a duration of .46 seconds (started at 2024-04-15T01:42:23)
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/install_system.log b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_system.log
new file mode 100644
index 0000000..954c857
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_system.log
@@ -0,0 +1,35 @@
+=== DBI Started: SYSTEM/WTP_usr.grnt
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .42 seconds (started at 2024-04-15T01:42:23)
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/install_wtpsrc.log b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_wtpsrc.log
new file mode 100644
index 0000000..3d5442b
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/install_wtpsrc.log
@@ -0,0 +1,292 @@
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WT_AD_HOC_REPORT.proc
+
+Warning: Procedure created with compilation errors.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WT_EXECUTE_TEST_RUNNER.proc
+
+Warning: Procedure created with compilation errors.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .13 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/CORE_DATA.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .19 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/HOOK.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .11 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .08 seconds (started at 2024-04-15T01:42:24)
+=== DBI Started: WTP/WTPLSQL.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+
+Synonym created.
+
+
+Synonym created.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .18 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_ASSERT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+
+Synonym created.
+
+
+Synonym created.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .21 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_CORE_REPORT.pspec
+
+Package created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .09 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/HOOKS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of 16.04 seconds (started at 2024-04-15T01:42:25)
+=== DBI Started: WTP/WT_VERSIONS.tab
+
+Table created.
+
+
+Table altered.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of .31 seconds (started at 2024-04-15T01:42:41)
+=== DBI Started: WTP/HOOKS.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=WTP/HOOKS.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of 4.38 seconds (started at 2024-04-15T01:42:41)
+=== DBI Started: WTP/WT_QUAL_TEST_RUNNERS_VW.vw
+
+View created.
+
+
+Grant succeeded.
+
+
+View created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .36 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/CORE_DATA.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .1 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/HOOK.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+=== DBI Started: WTP/WTPLSQL.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .12 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: WTP/WT_ASSERT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .22 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: WTP/WT_CORE_REPORT.pbody
+
+Package body created.
+
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .08 seconds (started at 2024-04-15T01:42:47)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtpsrc Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtpsrc Install Type
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtpsrc Install Type
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtpsrc Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+create table odbcapture_installation_logs
+ (load_dtm date
+ ,install_type varchar2(10)
+ ,file_name varchar2(512)
+ ,contents clob);
+comment on column odbcapture_installation_logs.load_dtm is 'Date/Time the installation log file was loaded.';
+comment on column odbcapture_installation_logs.install_type is 'Type of installation (from TYPE_CONF).';
+comment on column odbcapture_installation_logs.file_name is 'Name of installation log file.';
+comment on column odbcapture_installation_logs.contents is 'Contents/Text of the installation log file.';
+comment on table odbcapture_installation_logs is 'ODBCAPTURE installation log files.';
+grant select on odbcapture_installation_logs to public;
+create public synonym odbcapture_installation_logs for odbcapture_installation_logs;
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:42:55 for a duration of 8.1 seconds (started at 2024-04-15T01:42:47)
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/log_files_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtpsrc/log_files_junit_report.xml
new file mode 100644
index 0000000..be32553
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/log_files_junit_report.xml
@@ -0,0 +1,264 @@
+
+
+
+
+
+=== DBI Started: SYS/WTP.usr
+User created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:23 for a duration of .46 seconds (started at 2024-04-15T01:42:23)
+
+
+
+
+
+
+=== DBI Started: SYSTEM/WTP_usr.grnt
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .42 seconds (started at 2024-04-15T01:42:23)
+
+
+
+
+
+
+
+
+=== DBI Started: ./installation_prepare.sql
+Create_Temp_Publicly_Updateable_Table_SQL
+Table created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/CORE_DATA.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .1 seconds (started at 2024-04-15T01:42:46)
+
+
+
+
+=== DBI Started: WTP/CORE_DATA.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .19 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/HOOK.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+
+
+
+
+=== DBI Started: WTP/HOOK.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .11 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/HOOKS.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=WTP/HOOKS.ctl
+PL/SQL procedure successfully completed.
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of 4.38 seconds (started at 2024-04-15T01:42:41)
+### SQL*Loader Log File: WTP/HOOKS.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:42:44 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: WTP/HOOKS.ctl
+Data File: WTP/HOOKS.csv
+ Bad File: WTP/HOOKS.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "WTP"."HOOKS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+HOOK_NAME FIRST 20 , O(") CHARACTER
+SEQ NEXT * , O(") CHARACTER
+RUN_STRING NEXT 4000 , O(") CHARACTER
+DESCRIPTION NEXT 1000 , O(") CHARACTER
+value used for ROWS parameter changed from 250 to 198
+Table "WTP"."HOOKS":
+ 5 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 1046232 bytes(198 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 5
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:42:44 2024
+Run ended on Mon Apr 15 01:42:46 2024
+Elapsed time was: 00:00:02.04
+CPU time was: 00:00:00.04
+
+
+
+
+
+=== DBI Started: WTP/HOOKS.tab
+Table created.
+Table altered.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of 16.04 seconds (started at 2024-04-15T01:42:25)
+
+
+
+
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .09 seconds (started at 2024-04-15T01:42:46)
+
+
+
+
+=== DBI Started: WTP/JUNIT_CORE_REPORT.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .08 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/WTPLSQL.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .12 seconds (started at 2024-04-15T01:42:47)
+
+
+
+
+=== DBI Started: WTP/WTPLSQL.pspec
+Package created.
+Grant succeeded.
+Synonym created.
+Synonym created.
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .18 seconds (started at 2024-04-15T01:42:25)
+
+
+
+
+=== DBI Started: WTP/WT_AD_HOC_REPORT.proc
+Warning: Procedure created with compilation errors.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .17 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/WT_ASSERT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .22 seconds (started at 2024-04-15T01:42:47)
+
+
+
+
+=== DBI Started: WTP/WT_ASSERT.pspec
+Package created.
+Grant succeeded.
+Synonym created.
+Synonym created.
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .21 seconds (started at 2024-04-15T01:42:25)
+
+
+
+
+=== DBI Started: WTP/WT_CORE_REPORT.pbody
+Package body created.
+=== DBI Completed at 2024-04-15T01:42:47 for a duration of .08 seconds (started at 2024-04-15T01:42:47)
+
+
+
+
+=== DBI Started: WTP/WT_CORE_REPORT.pspec
+Package created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:25 for a duration of .09 seconds (started at 2024-04-15T01:42:25)
+
+
+
+
+=== DBI Started: WTP/WT_EXECUTE_TEST_RUNNER.proc
+Warning: Procedure created with compilation errors.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:24 for a duration of .13 seconds (started at 2024-04-15T01:42:24)
+
+
+
+
+=== DBI Started: WTP/WT_QUAL_TEST_RUNNERS_VW.vw
+View created.
+Grant succeeded.
+View created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:46 for a duration of .36 seconds (started at 2024-04-15T01:42:46)
+
+
+
+
+=== DBI Started: WTP/WT_VERSIONS.tab
+Table created.
+Table altered.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:41 for a duration of .31 seconds (started at 2024-04-15T01:42:41)
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtpsrc/odbcapture_installation_logs.log b/builds/OraEE213_AP212_ORDS222/wtpsrc/odbcapture_installation_logs.log
new file mode 100644
index 0000000..690e52a
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtpsrc/odbcapture_installation_logs.log
@@ -0,0 +1,52 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:42:53 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: odbcapture_installation_logs.ctl
+Data File: odbcapture_installation_logs.csv
+ Bad File: odbcapture_installation_logs.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 0
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE_INSTALLATION_LOGS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+LOAD_DTM SYSDATE
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+FILE_NAME NEXT 512 , O(") CHARACTER
+CONTENTS DERIVED * EOF CHARACTER
+ Dynamic LOBFILE. Filename in field FILE_NAME
+
+
+Table "ODBCAPTURE_INSTALLATION_LOGS":
+ 4 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 131500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 0
+Total logical records read: 4
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:42:53 2024
+Run ended on Mon Apr 15 01:42:55 2024
+
+Elapsed time was: 00:00:01.98
+CPU time was: 00:00:00.05
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/WTP/WT_SELF_TEST.log b/builds/OraEE213_AP212_ORDS222/wtptst/WTP/WT_SELF_TEST.log
new file mode 100644
index 0000000..814a6d3
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtptst/WTP/WT_SELF_TEST.log
@@ -0,0 +1,58 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:00 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: WTP/WT_SELF_TEST.ctl
+Data File: WTP/WT_SELF_TEST.csv
+ Bad File: WTP/WT_SELF_TEST.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "WTP"."WT_SELF_TEST", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+ID FIRST * , O(") CHARACTER
+TEMP_CLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_NCLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_XML NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_BLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1572864
+
+value used for ROWS parameter changed from 250 to 1
+
+Table "WTP"."WT_SELF_TEST":
+ 2 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 4718874 bytes(1 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 1
+Total logical records read: 2
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:43:00 2024
+Run ended on Mon Apr 15 01:43:03 2024
+
+Elapsed time was: 00:00:02.82
+CPU time was: 00:00:00.06
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/db_build_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtptst/db_build_junit_report.xml
new file mode 100644
index 0000000..13b9e41
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtptst/db_build_junit_report.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/install_sys.log b/builds/OraEE213_AP212_ORDS222/wtptst/install_sys.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/install_system.log b/builds/OraEE213_AP212_ORDS222/wtptst/install_system.log
new file mode 100644
index 0000000..e69de29
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/install_wtptst.log b/builds/OraEE213_AP212_ORDS222/wtptst/install_wtptst.log
new file mode 100644
index 0000000..f75eb3c
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtptst/install_wtptst.log
@@ -0,0 +1,119 @@
+=== DBI Started: ./installation_prepare.sql
+
+Create_Temp_Publicly_Updateable_Table_SQL
+
+Table created.
+
+
+Grant succeeded.
+
+=== DBI Completed at 2024-04-15T01:42:57 for a duration of .1 seconds (started at 2024-04-15T01:42:57)
+=== DBI Started: WTP/WT_SELF_TEST.tab
+
+Table created.
+
+
+Table altered.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+
+Comment created.
+
+=== DBI Completed at 2024-04-15T01:42:59 for a duration of 1.48 seconds (started at 2024-04-15T01:42:57)
+=== DBI Started: WTP/WT_SELF_TEST.cdl
+
+Disable Triggers and Foreign Keys
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=WTP/WT_SELF_TEST.ctl
+
+
+PL/SQL procedure successfully completed.
+
+
+PL/SQL procedure successfully completed.
+
+
+Commit complete.
+
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of 4.69 seconds (started at 2024-04-15T01:42:59)
+=== DBI Started: WTP/WT_SELF_TEST.tabtrg
+
+Trigger created.
+
+
+Trigger altered.
+
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of .13 seconds (started at 2024-04-15T01:43:03)
+=== DBI Started: ./installation_finalize.sql
+
+Drop_Temp_Publicly_Updateable_Table_SQL
+
+Table dropped.
+
+
+fix_invalid_public_synonyms
+
+Re-create Invalid Public Synonyms
+
+PL/SQL procedure successfully completed.
+
+
+compile_all
+Compile All for wtptst Install Type
+-- WTP Compile All is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_foreign_keys_ENABLE
+Alter Foreign Keys for wtptst Install Type
+-- WTP Alter Foreign Keys is done.
+
+PL/SQL procedure successfully completed.
+
+
+alter_triggers_ENABLE
+Alter Triggers for wtptst Install Type
+alter trigger "WTP"."WT_SELF_TEST$TEST" ENABLE;
+-- WTP Alter Triggers is done.
+
+PL/SQL procedure successfully completed.
+
+
+update_id_sequences
+Update ID Sequences for wtptst Install Type
+-- WTP Identity Sequence Updates is done.
+
+PL/SQL procedure successfully completed.
+
+
+Load Installation Files
+
+Confirm/Create odbcapture_installation_logs Table
+
+PL/SQL procedure successfully completed.
+
+
+sqlldr_control=./odbcapture_installation_logs.ctl
+
+
+PL/SQL procedure successfully completed.
+
+=== DBI Completed at 2024-04-15T01:43:06 for a duration of 2.77 seconds (started at 2024-04-15T01:43:03)
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/log_files_junit_report.xml b/builds/OraEE213_AP212_ORDS222/wtptst/log_files_junit_report.xml
new file mode 100644
index 0000000..93724e3
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtptst/log_files_junit_report.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+=== DBI Started: ./installation_prepare.sql
+Create_Temp_Publicly_Updateable_Table_SQL
+Table created.
+Grant succeeded.
+=== DBI Completed at 2024-04-15T01:42:57 for a duration of .1 seconds (started at 2024-04-15T01:42:57)
+
+
+
+
+=== DBI Started: WTP/WT_SELF_TEST.cdl
+Disable Triggers and Foreign Keys
+PL/SQL procedure successfully completed.
+sqlldr_control=WTP/WT_SELF_TEST.ctl
+PL/SQL procedure successfully completed.
+PL/SQL procedure successfully completed.
+Commit complete.
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of 4.69 seconds (started at 2024-04-15T01:42:59)
+### SQL*Loader Log File: WTP/WT_SELF_TEST.log
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:00 2024
+Version 21.3.0.0.0
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+Control File: WTP/WT_SELF_TEST.ctl
+Data File: WTP/WT_SELF_TEST.csv
+ Bad File: WTP/WT_SELF_TEST.bad
+ Discard File: none specified
+
+ (Allow all discards)
+Number to load: ALL
+Number to skip: 1
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "WTP"."WT_SELF_TEST", loaded from every logical record.
+Insert option in effect for this table: APPEND
+TRAILING NULLCOLS option in effect
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+ID FIRST * , O(") CHARACTER
+TEMP_CLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_NCLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_XML NEXT ***** , O(") CHARACTER
+ Maximum field length is 1048576
+TEMP_BLOB NEXT ***** , O(") CHARACTER
+ Maximum field length is 1572864
+value used for ROWS parameter changed from 250 to 1
+Table "WTP"."WT_SELF_TEST":
+ 2 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+Space allocated for bind array: 4718874 bytes(1 rows)
+Read buffer bytes: 1048576
+Total logical records skipped: 1
+Total logical records read: 2
+Total logical records rejected: 0
+Total logical records discarded: 0
+Run began on Mon Apr 15 01:43:00 2024
+Run ended on Mon Apr 15 01:43:03 2024
+Elapsed time was: 00:00:02.82
+CPU time was: 00:00:00.06
+
+
+
+
+
+=== DBI Started: WTP/WT_SELF_TEST.tab
+Table created.
+Table altered.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+Comment created.
+=== DBI Completed at 2024-04-15T01:42:59 for a duration of 1.48 seconds (started at 2024-04-15T01:42:57)
+
+
+
+
+=== DBI Started: WTP/WT_SELF_TEST.tabtrg
+Trigger created.
+Trigger altered.
+=== DBI Completed at 2024-04-15T01:43:03 for a duration of .13 seconds (started at 2024-04-15T01:43:03)
+
+
+
+
diff --git a/builds/OraEE213_AP212_ORDS222/wtptst/odbcapture_installation_logs.log b/builds/OraEE213_AP212_ORDS222/wtptst/odbcapture_installation_logs.log
new file mode 100644
index 0000000..ae85622
--- /dev/null
+++ b/builds/OraEE213_AP212_ORDS222/wtptst/odbcapture_installation_logs.log
@@ -0,0 +1,52 @@
+
+SQL*Loader: Release 21.0.0.0.0 - Production on Mon Apr 15 01:43:05 2024
+Version 21.3.0.0.0
+
+Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
+
+Control File: odbcapture_installation_logs.ctl
+Data File: odbcapture_installation_logs.csv
+ Bad File: odbcapture_installation_logs.bad
+ Discard File: none specified
+
+ (Allow all discards)
+
+Number to load: ALL
+Number to skip: 0
+Errors allowed: 50
+Bind array: 250 rows, maximum of 1048576 bytes
+Continuation: none specified
+Path used: Conventional
+Silent options: FEEDBACK
+Table "ODBCAPTURE_INSTALLATION_LOGS", loaded from every logical record.
+Insert option in effect for this table: APPEND
+
+ Column Name Position Len Term Encl Datatype
+------------------------------ ---------- ----- ---- ---- ---------------------
+LOAD_DTM SYSDATE
+INSTALL_TYPE FIRST 10 , O(") CHARACTER
+FILE_NAME NEXT 512 , O(") CHARACTER
+CONTENTS DERIVED * EOF CHARACTER
+ Dynamic LOBFILE. Filename in field FILE_NAME
+
+
+Table "ODBCAPTURE_INSTALLATION_LOGS":
+ 4 Rows successfully loaded.
+ 0 Rows not loaded due to data errors.
+ 0 Rows not loaded because all WHEN clauses were failed.
+ 0 Rows not loaded because all fields were null.
+
+
+Space allocated for bind array: 131500 bytes(250 rows)
+Read buffer bytes: 1048576
+
+Total logical records skipped: 0
+Total logical records read: 4
+Total logical records rejected: 0
+Total logical records discarded: 0
+
+Run began on Mon Apr 15 01:43:05 2024
+Run ended on Mon Apr 15 01:43:05 2024
+
+Elapsed time was: 00:00:00.38
+CPU time was: 00:00:00.04
diff --git a/builds/README.md b/builds/README.md
new file mode 100644
index 0000000..189dc1c
--- /dev/null
+++ b/builds/README.md
@@ -0,0 +1,62 @@
+## Build Scripts
+
+### Folder Descriptions
+
+File Name | Description
+-----------------------|------------
+OraEE122_AP191_ORDS222 | Oracle 12.1 Enterprise Edition, APEX 19.1, ORDS 22.2
+OraXE184_AP191_ORDS222 | Oracle 18.4 Express Edition, APEX 19.1, ORDS 22.2
+OraEE193_AP212_ORDS222 | Oracle 19.3 Enterprise Edition, APEX 21.2, ORDS 22.2
+OraEE213_AP212_ORDS222 | Oracle 21.3 Enterprise Edition, APEX 21.2, ORDS 22.2
+OraXE213_AP212_ORDS222 | Oracle 21.3 Express Edition, APEX 21.2, ORDS 22.2
+
+### Build Results Reporting Notes
+
+```
+ This is a heading
+ This is a paragraph.
+```
+
+ This is a heading
+ This is a paragraph.
+
+Create a build status HTML file and use "lframe" to publish it in the main README.md?
+
+https://www.w3schools.com/html/html_iframe.asp
+
+### Build Sequence
+
+builds/*/build.sh (To Be Run in Jenkins?)
+
+1. builds/*/build_initialize.sql
+ 1. builds/util/new_session.sql
+ 1. builds/util/create_pdb.sql
+1. builds/*/build.sql
+ 1. builds/util/new_session.sql
+ 1. wtpsrc/install.sql
+1. builds/*/build.sql
+ 1. builds/util/new_session.sql
+ 1. wtptst/install.sql
+1. builds/pdb_test.sql
+ 1. builds/util/new_session.sql
+ 1. builds/util/run_all_wtplsql_tests.sql
+ 1. builds/util/timing_report.sql
+ 1. builds/util/JUnit_Test_DB_Build.sql
+1. builds/gui_build.sh
+ 1. builds/util/new_session.sql - PDB SYSTEM
+ 1. builds/util/install_ords.sql - 2.22
+ 1. builds/util/install_apex.sql - 2.12
+ 1. apex/ODBCAPTURE_workspace.sql
+ 1. apex/f200.sql
+ 1. builds/util/timing_report.sql
+ 1. builds/util/JUnit_Test_DB_Build.sql
+1. gui_test.sh
+ 1. *(Build/Deploy ORDS.war File)*
+ 1. Load/Run wtplsql Unit Testing
+1. builds/*/build.sql
+ 1. builds/util/new_session.sql
+ 1. grbsrc/install.sql
+1. builds/*/build.sql
+ 1. builds/util/new_session.sql
+ 1. wtpgrb/install.sql
+1. builds/util/archive_pdb.sql
diff --git a/builds/util/archive_pdb.sql b/builds/util/archive_pdb.sql
new file mode 100644
index 0000000..135ef64
--- /dev/null
+++ b/builds/util/archive_pdb.sql
@@ -0,0 +1,49 @@
+
+-- Unplug Pluggable Database
+spool pdb_unplug.lst
+
+-- Variable Definitions
+define DFILE_PREFIX = "/opt/OraEE213/oradata"
+define CDB_SID = "EE213CDB"
+define PDB_SID = "DEVPDB"
+define DB_DOMAIN = ""
+define SYS_PASS = "Orac13is#1"
+
+-- Derived Variables
+define CDB_CONN = "//localhost:1521/&CDB_SID.&DB_DOMAIN."
+define PDB_DFILES = "&DFILE_PREFIX./&CDB_SID./&PDB_SID."
+define SYS_CRED = "SYS/&SYS_PASS."
+define CDB_SYS = "&SYS_CRED.@&CDB_CONN. as sysdba"
+
+@new_connection.sql &CDB_SYS.
+
+alter pluggable database "&PDB_SID." close immediate;
+alter pluggable database "&PDB_SID." unplug into '&PDB_DFILES./&PDB_SID..XML';
+drop pluggable database "&PDB_SID." keep datafiles;
+spool off
+
+--prompt ============================================================
+--prompt Zipping Pluggable Database
+-- Quote the echo so the "&" in CD_DFILE_LOC is not executed
+--
+--host bash -c '(echo "Status of Mounted Files Systems"; df -k; echo "") &host_log.'
+--
+--host bash -c '(echo "KBytes of Disk Usage in ${PWD}"; du -sk .; echo "") &host_log.'
+--host bash -c '(echo "Files in ${PWD}"; ls -al; echo "") &host_log.'
+--
+--host bash -c '(echo "KBytes of Disk Usage in &CD_DFILE_LOC."; &CD_DFILE_LOC. du -sk .; echo "") &host_log.'
+--host bash -c '(echo "Files in &CD_DFILE_LOC."; &CD_DFILE_LOC. ls -al; echo "") &host_log.'
+--
+--define extra_pdbzip_files = "Jenkinsfile.reduced autobuild/*.csv autobuild/*.lst autobuild/*.xml install/*/*.csv install/*/*/*.log"
+--host bash -c '(echo \$ cd ..; echo \$ zip -q &SHARED_PATH./&PDB_SID._PDB.zip &extra_pdbzip_files.) &host_log.'
+--host bash -c '(cd ..; zip -q &SHARED_PATH./&PDB_SID._PDB.zip &extra_pdbzip_files.) &host_log.'
+--host bash -c '(ls -al &SHARED_PATH./&PDB_SID._PDB.zip; echo "") &host_log.'
+--
+--host bash -c '(echo \$ &CD_DFILE_LOC. echo \$ zip -q &SHARED_PATH./&PDB_SID._PDB.zip) &host_log.'
+--host bash -c '(&CD_DFILE_LOC. zip -q &SHARED_PATH./&PDB_SID._PDB.zip ./*) &host_log.'
+--host bash -c '(ls -al &SHARED_PATH./&PDB_SID._PDB.zip; echo "") &host_log.'
+--
+--host bash -c '(echo \$ &run_sudo rm -rf &DFILE_LOC.; &run_sudo rm -rf &DFILE_LOC.; echo "") &host_log.'
+
+prompt .
+exit 0
diff --git a/builds/util/archive_pdb2.sql b/builds/util/archive_pdb2.sql
new file mode 100644
index 0000000..045eeea
--- /dev/null
+++ b/builds/util/archive_pdb2.sql
@@ -0,0 +1,50 @@
+
+--
+-- Unplug Pluggable Database
+--
+-- Variables:
+-- SYS_LOGIN: Connect String for SYS in the Container Database
+-- CDB_SID: Name of the Container Database
+-- PDB_SID: Name of the Pluggable Database
+--
+
+spool archive_pdb.lst
+
+-- Variable Definitions
+define PDB_DFILES = "/opt/OraEE213/oradata/&CDB_SID./&PDB_SID."
+set define off
+define host_log = ">> archive_pdb.lst 2>&1"
+define extra_pdbzip_files = "*.csv *.lst *.xml */*.csv */*.log"
+set define on
+
+@"../util/new_session.sql" "&SYS_LOGIN." "" ""
+
+alter pluggable database "&PDB_SID." close immediate;
+alter pluggable database "&PDB_SID." unplug into '&PDB_SID..XML';
+drop pluggable database "&PDB_SID." keep datafiles;
+spool off
+
+prompt ============================================================
+prompt Zipping Pluggable Database
+-- Quote the echo so the "&" in PDB_DFILES is not executed
+
+host bash -c '(echo "Status of Mounted Files Systems"; df -k; echo "") &host_log.'
+
+host bash -c '(echo "KBytes of Disk Usage in ${PWD}"; du -sk .; echo "") &host_log.'
+host bash -c '(echo "Files in ${PWD}"; ls -al; echo "") &host_log.'
+
+host bash -c '(echo "KBytes of Disk Usage in &PDB_DFILES."; cd &PDB_DFILES.; du -sk .; echo "") &host_log.'
+host bash -c '(echo "Files in &PDB_DFILES."; cd &PDB_DFILES.; ls -al; echo "") &host_log.'
+
+host bash -c '(echo \$ zip -q &PDB_SID._PDB.zip &extra_pdbzip_files.) &host_log.'
+host bash -c '(zip -q &PDB_SID._PDB.zip &extra_pdbzip_files.) &host_log.'
+host bash -c '(ls -al &PDB_SID._PDB.zip; echo "") &host_log.'
+
+host bash -c '(echo \$ zip -q &PDB_SID._PDB.zip) &host_log.'
+host bash -c '(zip -q &PDB_SID._PDB.zip &PDB_DFILES./*) &host_log.'
+host bash -c '(ls -al &PDB_SID._PDB.zip; echo "") &host_log.'
+
+host bash -c '(echo \$ rm -rf &PDB_DFILES.; rm -rf &PDB_DFILES.; echo "") &host_log.'
+
+prompt .
+exit 0
diff --git a/builds/util/build_functions.sh b/builds/util/build_functions.sh
new file mode 100644
index 0000000..1d64bf6
--- /dev/null
+++ b/builds/util/build_functions.sh
@@ -0,0 +1,122 @@
+
+# Source this file using '.'
+
+########################################
+function capture_version {
+ echo ""
+ echo "Capture Version"
+ # 'Branch main at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 - https://github.com/DMSTEX/DMSTEX.git'
+ VERSION_NOTE="Branch $(git rev-parse --abbrev-ref HEAD 2>&1))" &&
+ VERSION_NOTE="${VERSION_NOTE} at $(git rev-parse HEAD 2>&1)" &&
+ VERSION_NOTE="${VERSION_NOTE} - $(git config --get remote.origin.url 2>&1)"
+ if [ $? = 0 ]
+ then
+ echo "${VERSION_NOTE}" > "version.txt"
+ else
+ echo "${VERSION}" > "version.txt"
+ fi
+ }
+
+########################################
+function build_init {
+ echo ""
+ echo "build_initialize.sql"
+ sqlplus /nolog "@build_initialize.sql" "${PDB_NAME}" "${CDB_SYS}"
+ retcd="${?}"
+ if [ "${retcd}" != "0" ]
+ then
+ echo "SQL*Plus returned ${retcd}. Aborting"
+ exit "${retcd}"
+ fi
+ }
+
+########################################
+function clear_log_files {
+ echo ""
+ echo "Clear old ${INSTALL_TYPE} logs"
+ rm -f "${INSTALL_TYPE}"/*.xml
+ rm -f "${INSTALL_TYPE}"/*.log
+ rm -f "${INSTALL_TYPE}"/*.bad
+ rm -f "${INSTALL_TYPE}"/*.dsc
+ rm -f "${INSTALL_TYPE}"/*/*.log
+ rm -f "${INSTALL_TYPE}"/*/*.bad
+ rm -f "${INSTALL_TYPE}"/*/*.dsc
+ }
+
+########################################
+function run_build {
+ INSTALL_TYPE="${1}"
+ echo ""
+ echo "Move to ../../${INSTALL_TYPE}"
+ cd "../../${INSTALL_TYPE}"
+ echo ""
+ echo "${BUTIL_PATH}/build.sql ${INSTALL_TYPE}"
+ sqlplus /nolog "@${BUTIL_PATH}/run_build.sql" "${BUTIL_PATH}" "${PDB_SYS}" "${PDB_SYSTEM}" "${USR_PASS}" "${INSTALL_TYPE}" "$(< version.txt)"
+ retcd="${?}"
+ if [ "${retcd}" != "0" ]
+ then
+ echo "SQL*Plus returned ${retcd}. Aborting"
+ exit "${retcd}"
+ fi
+ echo ""
+ echo "Move back to ${HOME_DIR}"
+ cd "${HOME_DIR}"
+ }
+
+########################################
+function setup_for_test {
+ echo ""
+ echo "Running ../util/setup_for_test.sql from ${PWD}"
+ sqlplus "${PDB_SYSTEM}" "@../util/setup_for_test.sql"
+ # Unit Testing Expects NO DB Links
+ #echo "Running ../util/setup_db_links.sql from ${PWD}"
+ #sqlplus "${PDB_WTP}" "@../util/setup_db_links.sql"
+ }
+
+########################################
+function run_core_test {
+ echo ""
+ echo "Running ../util/run_core_test.sql from ${PWD}"
+ sqlplus "${PDB_WTP}" "@../util/run_core_test.sql"
+ }
+
+########################################
+function run_junit_test {
+ echo ""
+ echo "Running ../util/run_junit_test.sql from ${PWD}"
+ sqlplus "${PDB_WTP}" "@../util/run_junit_test.sql"
+ }
+
+########################################
+function run_save_test {
+ echo ""
+ echo "Running ../util/run_save_test.sql from ${PWD}"
+ sqlplus "${PDB_WTP}" "@../util/run_save_test.sql"
+ }
+
+########################################
+function move_log_files {
+ echo ""
+ echo "Move Log Files to Build Folder"
+ echo "Move to ../../${INSTALL_TYPE}"
+ cd "../../${INSTALL_TYPE}"
+ mkdir -p "${BUILD_PATH}/${INSTALL_TYPE}" 2> /dev/null
+ ls *.xml *.log *.bad *.dsc 2>/dev/null |
+ while read FILE
+ do
+ mv -v "${FILE}" "${BUILD_PATH}/${INSTALL_TYPE}"
+ done
+ ls -F | grep '.*/$' |
+ while read DIR
+ do
+ mkdir -p "${BUILD_PATH}/${INSTALL_TYPE}/${DIR}" 2> /dev/null
+ ls "${DIR}"*.log "${DIR}"*.bad "${DIR}"*.dsc 2> /dev/null |
+ while read FILE
+ do
+ mv -v "${FILE}" "${BUILD_PATH}/${INSTALL_TYPE}/${DIR}"
+ done
+ done
+ echo ""
+ echo "Move back to ${HOME_DIR}"
+ cd "${HOME_DIR}"
+ }
diff --git a/builds/util/create_pdb.sql b/builds/util/create_pdb.sql
new file mode 100644
index 0000000..64fc464
--- /dev/null
+++ b/builds/util/create_pdb.sql
@@ -0,0 +1,71 @@
+
+--
+-- Pluggable Database Build Script for Local Environment
+--
+-- Command Line Parameters:
+-- -) 1: CPDB_PDB_SID - Database SID for the new pluggable database.
+--
+
+define CPDB_PDB_SID="&1."
+
+----------------------------------------
+--prompt Show Parameters
+--show parameters
+
+----------------------------------------
+prompt
+prompt Show PDBs
+show pdbs
+
+----------------------------------------
+prompt
+prompt Create PDB
+declare
+ database_name varchar2(128);
+ users_datafile varchar2(256);
+ procedure run_stxt (in_stxt in varchar2) is
+ begin
+ dbms_output.put_line(in_stxt || ';');
+ execute immediate in_stxt;
+ end run_stxt;
+begin
+ select name
+ into database_name
+ from v$database;
+ select replace(min(file_name), database_name, database_name || '/&CPDB_PDB_SID.')
+ into users_datafile
+ from dba_data_files
+ where tablespace_name = 'USERS';
+ for buff in (select name from v$pdbs where name = '&CPDB_PDB_SID.')
+ loop
+ begin
+ run_stxt('ALTER PLUGGABLE DATABASE "' || buff.name || '" CLOSE IMMEDIATE INSTANCES=ALL');
+ exception when others then
+ dbms_output.put_line(SQLERRM);
+ end;
+ run_stxt('DROP PLUGGABLE DATABASE "' || buff.name || '" INCLUDING DATAFILES');
+ end loop;
+ run_stxt('create pluggable database "&CPDB_PDB_SID."' || CHR(10) ||
+ ' admin user "PDB_ADMIN" identified by "PDB_ADMIN_Password"' || CHR(10) ||
+ ' default tablespace users datafile ''' || users_datafile || ''' size 5M autoextend on' || CHR(10) ||
+ ' FILE_NAME_CONVERT = (''pdbseed'', ''&CPDB_PDB_SID.'')' || CHR(10) ||
+ ' STORAGE UNLIMITED TEMPFILE REUSE');
+end;
+/
+
+-------------------------
+prompt
+prompt Open PDB
+alter pluggable database "&CPDB_PDB_SID." open;
+
+----------------------------------------
+prompt
+prompt Show Services
+select name from v$services;
+
+----------------------------------------
+prompt
+prompt Update DEFAULT Profile
+alter session set container = "&CPDB_PDB_SID.";
+alter profile "DEFAULT" limit password_life_time unlimited;
+alter session set container = "CDB$ROOT";
diff --git a/builds/util/new_session.sql b/builds/util/new_session.sql
new file mode 100644
index 0000000..663b213
--- /dev/null
+++ b/builds/util/new_session.sql
@@ -0,0 +1,27 @@
+
+--
+-- New Oracle Database Session
+--
+-- Parameters
+-- 1 - Connection String. Ex. username/password@//host:port/pdb.domain
+--
+
+----------------------------------------
+prompt
+prompt New Session
+connect &1.
+
+----------------------------------------
+prompt
+prompt Reset Output Connections
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+
+----------------------------------------
+prompt
+prompt Show Database Connection
+select 'db: ' || name ||
+ ', con: ' || sys_context('USERENV', 'CON_NAME') ||
+ ', tstmp: ' || systimestamp
+ from v$database;
diff --git a/builds/util/pdb_test.sql b/builds/util/pdb_test.sql
new file mode 100644
index 0000000..73d9af9
--- /dev/null
+++ b/builds/util/pdb_test.sql
@@ -0,0 +1,69 @@
+
+----------------------------------------
+-- Generate Dynamic Test Data
+
+set termout on
+prompt Generate Dynamic Test Data...
+set termout off
+@new_connection_reset.sql &PDB_SYS.
+
+@"&INSTALL_PATH./tdat_gen/install.sql" "&INSTALL_PATH./tdat_gen" "&PDB_SYSTEM."
+
+----------------------------------------
+set termout on
+prompt Run all wtPLSQL Unit Tests...
+set termout off
+@new_connection.sql WTP/WTP@&PDB_CONN.
+
+@run_all_wtplsql_tests.sql
+
+@timing_report.sql 'Testing of Unit'
+
+----------------------------------------
+-- Show the Services for this PDB
+select name from v$services;
+
+----------------------------------------
+-- Setup for Reports
+connect &PDB_SYSTEM.
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+select 'db: ' || name ||
+ ', con: ' || sys_context('USERENV', 'CON_NAME') ||
+ ', tstmp: ' || systimestamp
+ from v$database;
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set feedback off
+
+spool off
+
+----------------------------------------
+set termout on
+prompt Reporting Unit Test Results...
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set feedback off
+set termout off
+
+spool JUnit_Report_All.xml
+
+begin
+ wtp.junit_report_all;
+end;
+/
+
+spool off
+set termout on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
+set feedback on
diff --git a/builds/util/run_build.sql b/builds/util/run_build.sql
new file mode 100644
index 0000000..9604dd1
--- /dev/null
+++ b/builds/util/run_build.sql
@@ -0,0 +1,54 @@
+
+--
+-- Data Build Script
+--
+-- Command Line Parameters:
+-- 1 - BUTIL_PATH: Path to Build Utility Scripts
+-- 2 - PDB_SYS: Connect String for SYS in the Pluggable Database
+-- 3 - PDB_SYSTEM: Connect String for SYSTEM in the Pluggable Database
+-- 4 - PDB_PASSKEY: Part of the User/Schema Password Authentication
+-- 5 - INSTALL_TYPE: Installation Type
+-- 6 - APP_VERSION: Version for this application installation
+--
+
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+define BUTIL_PATH="&1."
+define PDB_SYS="&2."
+define PDB_SYSTEM="&3."
+define PDB_PASSKEY="&4."
+define INSTALL_TYPE="&5."
+define APP_VERSION="&6."
+
+set linesize 2499
+set trimspool on
+set termout on
+set verify off
+set echo off
+set timing on
+@"&BUTIL_PATH./new_session.sql" "&PDB_SYS." "" ""
+set timing off
+@"install.sql" "&PDB_SYSTEM." "" ""
+
+begin
+ if '&INSTALL_TYPE.' like 'wtp%'
+ then
+ insert into WTP.wt_versions (component, version, action)
+ values ('&INSTALL_TYPE.', '&APP_VERSION.', 'INSTALL');
+ commit;
+ end if;
+end;
+/
+
+set linesize 123
+set trimspool on
+set termout on
+set verify off
+set echo off
+set timing on
+@"&BUTIL_PATH./new_session.sql" "&PDB_SYSTEM." "" ""
+set timing off
+@"set_user_authentication.sql" "&PDB_PASSKEY." "" ""
+
+exit
diff --git a/builds/util/run_core_test.sql b/builds/util/run_core_test.sql
new file mode 100644
index 0000000..3347fae
--- /dev/null
+++ b/builds/util/run_core_test.sql
@@ -0,0 +1,45 @@
+
+--
+-- Run Core Unit Test
+--
+-- Should be run as WTP Schema/User after installation
+--
+
+----------------------------------------
+prompt
+prompt Setup for Unit Tests.
+set termout on
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+set linesize 2499
+set trimspool on
+set echo off
+
+----------------------------------------
+-- Should be default Installation Settings
+--prompt
+--prompt Initialize Hooks.
+--execute wt_test_run.delete_hooks;
+--execute junit_core_report.delete_hooks;
+--execute wt_core_report.insert_hooks;
+
+----------------------------------------
+prompt
+prompt Run Unit Test and Report.
+set verify off
+set feedback off
+set termout off
+spool wt_core_report_dbms_out.log
+execute wtplsql.test_all;
+spool off
+set termout on
+set feedback on
+set verify on
+
+----------------------------------------
+prompt
+prompt Done with Unit Tests.
+set linesize 80
+
+EXIT
diff --git a/builds/util/run_junit_test.sql b/builds/util/run_junit_test.sql
new file mode 100644
index 0000000..497376c
--- /dev/null
+++ b/builds/util/run_junit_test.sql
@@ -0,0 +1,44 @@
+
+--
+-- Run Unit Tests with JUnit Report
+--
+-- Should be run as WTP Schema/User after run_core_test.sql
+--
+
+----------------------------------------
+prompt
+prompt Setup for Unit Tests.
+set termout on
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+set linesize 2499
+set trimspool on
+set echo off
+
+----------------------------------------
+prompt
+prompt Initialize Hooks.
+execute wt_core_report.delete_hooks;
+execute wt_test_run.delete_hooks;
+execute junit_core_report.insert_hooks;
+
+----------------------------------------
+prompt
+prompt Run and Report Unit Tests.
+set verify off
+set feedback off
+set termout off
+spool junit_core_report_show_current.xml
+execute wtplsql.test_all;
+spool off
+set termout on
+set feedback on
+set verify on
+
+----------------------------------------
+prompt
+prompt Done with Reports
+set linesize 80
+
+EXIT
diff --git a/builds/util/run_save_test.sql b/builds/util/run_save_test.sql
new file mode 100644
index 0000000..9db424e
--- /dev/null
+++ b/builds/util/run_save_test.sql
@@ -0,0 +1,56 @@
+
+--
+-- Run Unit Test with Peristence
+--
+
+----------------------------------------
+prompt
+prompt Reporting Unit Test Results...
+set termout on
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+execute DBMS_OUTPUT.ENABLE(NULL);
+set linesize 2499
+set trimspool on
+set echo off
+
+----------------------------------------
+prompt
+prompt Initialize Hooks.
+execute wt_core_report.delete_hooks;
+execute junit_core_report.delete_hooks;
+execute wt_test_run.insert_hooks;
+
+----------------------------------------
+prompt
+prompt Run Unit Tests and Report.
+set verify off
+set feedback off
+set termout off
+spool wt_persist_report_dbms_out.log
+execute wtplsql.test_all;
+execute wt_persist_report.dbms_out(in_detail_level => 10);
+spool off
+set termout on
+set feedback on
+set verify on
+
+----------------------------------------
+prompt
+prompt JUnit Report Unit Tests.
+set verify off
+set feedback off
+set termout off
+spool junit_xml_persist_all.xml
+execute junit_xml_persist_all;
+spool off
+set termout on
+set feedback on
+set verify on
+
+----------------------------------------
+prompt
+prompt Done with Reports
+set linesize 80
+
+EXIT
diff --git a/builds/util/setup_db_links.sql b/builds/util/setup_db_links.sql
new file mode 100644
index 0000000..7e50377
--- /dev/null
+++ b/builds/util/setup_db_links.sql
@@ -0,0 +1,47 @@
+
+--
+-- Setup Datbase Linkgs for Unit Testing
+--
+-- Run as WTP Schema/User
+--
+
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Recreate Database Links
+declare
+ procedure run_sql (in_sql in varchar2) is
+ -- ORA-02024: database link not found
+ no_db_link exception;
+ pragma exception_init(no_db_link, -02024);
+ begin
+ dbms_output.put_line(in_sql);
+ execute immediate in_sql;
+ exception
+ when no_db_link then
+ null; -- Ignore this errror;
+ when others then
+ dbms_output.put_line(SQLERRM || CHR(10));
+ end run_sql;
+begin
+ -- Test every Schema Owner in the Database
+ for buff in (select proc.owner TEST_OWNER
+ from dba_procedures proc
+ where proc.procedure_name = 'WTPLSQL_RUN'
+ and proc.object_type = 'PACKAGE'
+ group by proc.owner
+ order by proc.owner )
+ loop
+ run_sql('alter session set current_schema = "' || buff.TEST_OWNER || '"');
+ run_sql('drop database link "' || buff.TEST_OWNER || '"');
+ run_sql('create database link "' || buff.TEST_OWNER ||
+ '" connect to "' || buff.TEST_OWNER ||
+ '" identified by "' || buff.TEST_OWNER ||
+ '" using ''//localhost:1521/' || SYS_CONTEXT('USERENV','SERVICE_NAME') || '''');
+ end loop;
+ run_sql('alter session set current_schema = "' || USER || '"');
+end;
+/
+
+exit
diff --git a/builds/util/setup_for_test.sql b/builds/util/setup_for_test.sql
new file mode 100644
index 0000000..3b1a6b7
--- /dev/null
+++ b/builds/util/setup_for_test.sql
@@ -0,0 +1,99 @@
+
+--
+-- Setup for Unit Testing
+--
+-- Run as SYS or SYSTEM
+--
+
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Show the Services for this PDB
+select name from v$services;
+prompt Using the following service at localhost:1521
+execute dbms_output.put_line(SYS_CONTEXT('USERENV','SERVICE_NAME'));
+
+----------------------------------------
+prompt
+prompt Update PLSQL_CCFLAGS parameter
+declare
+ parm_value v$parameter.value%TYPE;
+ function update_parm_value
+ (parm_val_in in varchar2
+ ,attribute_in in varchar2
+ ,value_in in varchar2)
+ return varchar2
+ is
+ parm_len number;
+ attr_pos number;
+ comma_pos number;
+ begin
+ parm_len := length(parm_val_in);
+ if parm_len = 0
+ then
+ -- "parm_val_in" is empty
+ return attribute_in || ':' || value_in;
+ end if;
+ attr_pos := instr(parm_val_in, attribute_in, 1);
+ if attr_pos = 0
+ then
+ -- "parm_val_in" does not include our attribute
+ return attribute_in || ':' || value_in || ', ' || parm_val_in;
+ end if;
+ comma_pos := instr(parm_val_in, ',', attr_pos);
+ if comma_pos = 0
+ then
+ -- "parm_val_in" includes our attribute, but no following "comma"
+ return substr(parm_val_in, 1, attr_pos - 1) ||
+ attribute_in || ':' || value_in;
+ end if;
+ -- "parm_val_in" includes our attribute with a following "comma"
+ return substr(parm_val_in, 1, attr_pos - 1) ||
+ attribute_in || ':' || value_in ||
+ substr(parm_val_in, comma_pos, parm_len);
+ end update_parm_value;
+begin
+ select p.value
+ into parm_value
+ from dual d
+ left join v$parameter p
+ on d.dummy = 'X'
+ where name in 'plsql_ccflags';
+ dbms_output.put_line('OLD parm_value: ' || parm_value);
+ parm_value := update_parm_value(parm_value, 'WTPLSQL_SELFTEST', 'TRUE');
+ --parm_value := update_parm_value(parm_value, 'WTPLSQL_ENABLE' , 'TRUE');
+ dbms_output.put_line('NEW parm_value: ' || parm_value);
+ execute immediate 'alter system set PLSQL_CCFLAGS = ''' ||
+ parm_value || ''' scope=BOTH';
+end;
+/
+
+----------------------------------------
+prompt
+prompt Recompile All Packages
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql);
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line(SQLERRM);
+ dbms_output.put_line('----------------------------------------');
+ end run_sql;
+begin
+ for buff in (select obj.object_type, obj.owner, obj.object_name
+ from dba_objects obj
+ join dba_users usr
+ on usr.username = obj.owner
+ and ( obj.oracle_maintained is null
+ OR obj.oracle_maintained != 'Y')
+ where obj.object_type in ('FUNCTION','PACKAGE','PROCEDURE','LIBRARY','TYPE','TRIGGER','VIEW'))
+ loop
+ run_sql('alter ' || buff.object_type || ' "' ||
+ buff.owner || '"."' ||
+ buff.object_name || '" compile' );
+ end loop;
+end;
+/
+
+exit
diff --git a/builds/util/update_nonid_sequences.sql b/builds/util/update_nonid_sequences.sql
new file mode 100644
index 0000000..0b08798
--- /dev/null
+++ b/builds/util/update_nonid_sequences.sql
@@ -0,0 +1,54 @@
+
+--
+-- Update Non-Identity SEQUENCES
+--
+-- Command Line Parmeters
+-- 1 - Table Owner
+-- 2 - Table Name
+-- 3 - Table Column Name
+-- 4 - Sequence Name
+-- 5 - Sequence Owner (optional)
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_tab_owner varchar2(256) := '&1.';
+ l_tab_name varchar2(256) := '&2.';
+ l_tab_column varchar2(256) := '&3.';
+ l_seq_name varchar2(256) := '&4.';
+ l_seq_owner varchar2(256) := nvl('&5.', '&1.');
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+begin
+ -- Find the Current Sequence Value
+ sql_txt := 'select "' || l_seq_owner || '"."' || l_seq_name || '".currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select last_number into l_last_seq
+ from dba_sequences
+ where sequence_owner = l_seq_owner
+ and sequence_name = l_seq_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max("' || l_tab_column || '") from "' || l_tab_owner || '"."' || l_tab_name || '"';
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(l_seq_owner || '.' || l_seq_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || l_tab_owner || '.' || l_tab_name || '.max(' || l_tab_column || '): ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while "' || l_seq_owner || '"."' || l_seq_name || '".nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+end;
+/
diff --git a/conv/README.md b/conv/README.md
new file mode 100644
index 0000000..677bef6
--- /dev/null
+++ b/conv/README.md
@@ -0,0 +1,14 @@
+# wtPLSQL Conversion Scripts README
+
+File Name | Description
+-----------------------|------------
+wtplsql_conversion.sql | PL/SQL block that adds Runner Entry Point to packages
+
+
+
+### Install Procedure
+
+
+
+### UnInstall Procedure
+
diff --git a/conv/utplsql_to_wtplsql.sql b/conv/utplsql_to_wtplsql.sql
new file mode 100644
index 0000000..ae073b0
--- /dev/null
+++ b/conv/utplsql_to_wtplsql.sql
@@ -0,0 +1,202 @@
+declare
+ invalid_sql_statment EXCEPTION;
+ PRAGMA EXCEPTION_INIT(invalid_sql_statment, -900);
+ src_clob CLOB;
+ tmp_clob CLOB;
+ end_ptr number;
+ end_str varchar2(32767);
+ -- Big Put Line, because DBMS_OUTPUT.PUT_LINE can't
+ procedure big_put_line
+ is
+ max_len number := 32767; -- Max Line Length
+ ptr number := 1; -- Current Position in IN_TXT
+ oset number; -- Offset from PTR to a LF
+ safety number := 1; -- Number of iterations
+ begin
+ while length(substr(src_clob, ptr)) > max_len
+ loop
+ -- Try to find a Line Feed at the sweet spot
+ oset := instr(substr(src_clob, ptr, max_len),CHR(10),-1);
+ --dbms_output.put_line('safety: ' || safety ||
+ -- ', ptr: ' || ptr ||
+ -- ', oset: ' || oset );
+ if oset <= 0
+ then
+ raise_application_error(-20000, 'Unknown OSET returned from INSTR: ' || OSET);
+ end if;
+ -- Output the next segment and move ptr
+ dbms_output.put_line(substr(src_clob, ptr, oset-1));
+ ptr := ptr + oset;
+ safety := safety + 1;
+ if safety >= 100000
+ then
+ raise_application_error(-20000, 'Safety exceeded ');
+ end if;
+ end loop;
+ dbms_output.put_line(substr(src_clob, ptr));
+ dbms_output.put_line('/' || CHR(10) || '----------');
+ end big_put_line;
+ function find_end_ptr (in_type in varchar2)
+ return number
+ is
+ orig_end_ptr number;
+ new_end_ptr number;
+ old1_end_ptr number;
+ old2_end_ptr number;
+ begin_ptr number;
+ begin
+ orig_end_ptr := 17; -- "CREATE PROCEDURE " is 17 characters
+ new_end_ptr := orig_end_ptr;
+ old1_end_ptr := orig_end_ptr + 1;
+ -- Adjust for smaller source
+ while new_end_ptr > 0
+ loop
+ old2_end_ptr := old1_end_ptr;
+ old1_end_ptr := new_end_ptr + 1;
+ new_end_ptr := regexp_instr(tmp_clob -- Source Char
+ ,'[[:space:]]' || -- Find a space character (includes LF),
+ 'end' || -- followed by the string "end",
+ '[^;]*' || -- followed by zero or more non-semi-colon characters,
+ '[;]' -- followed by a semi-colon.
+ ,old1_end_ptr -- Position
+ ,1 -- Occurrence
+ ,0 -- Return Option
+ ,'i' -- Match Parameter
+ ,0 -- Sub Expr
+ );
+ end loop;
+ if old2_end_ptr > orig_end_ptr + 1
+ and in_type = 'PACKAGE BODY'
+ then
+ -- A package body with a possible "initialization part"
+ begin_ptr := regexp_instr(tmp_clob -- Source Char
+ ,'[[:space:]]' || -- Find a space character (includes LF),
+ 'begin' || -- followed by the string "begin",
+ '[[:space:]]' -- followed by a space character (includes LF),
+ ,old2_end_ptr -- Position
+ ,1 -- Occurrence
+ ,0 -- Return Option
+ ,'i' -- Match Parameter
+ ,0 -- Sub Expr
+ );
+ else
+ begin_ptr := 0;
+ end if;
+ if begin_ptr > 0
+ then
+ -- Found an initialization part, start before it
+ return begin_ptr;
+ else
+ -- No initialization part, start before the last END
+ return old1_end_ptr;
+ end if;
+ end find_end_ptr;
+ function get_procedures
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return varchar2
+ is
+ ret_str varchar2(32767);
+ add_teardown boolean;
+ begin
+ for proc_buff in (
+ select procedure_name
+ from dba_procedures
+ where owner = in_owner
+ and object_name = in_name
+ and object_type = 'PACKAGE'
+ and procedure_name is not null
+ and procedure_name like 'ZTST\_%' escape '\'
+ order by procedure_name )
+ loop
+ case proc_buff.procedure_name
+ when 'ZTST_SETUP'
+ then
+ ret_str := ' wt_assert.g_testcase := ''' || proc_buff.object_name ||
+ '_ZTST_TEARDOWN'';' || CHR(10) ||
+ ' ZTST_TEARDOWN;' || CHR(10) ||
+ CHR(10) ||
+ ret_str ;
+ when 'ZTST_TEARDOWN'
+ then
+ add_teardown := TRUE;
+ else
+ ret_str := ret_str ||
+ ' ' || 'wt_assert.g_testcase := ' ||
+ substr(proc_buff.procedure_name,1,50) ||
+ ';' || CHR(10) ||
+ ' ' || proc_buff.procedure_name ||
+ ';' || CHR(10) ||
+ CHR(10) ;
+ end case;
+ end loop;
+ if add_teardown
+ then
+ ret_str := ret_str ||
+ ' wt_assert.g_testcase := ''' || proc_buff.object_name ||
+ '_ZTST_TEARDOWN'';' || CHR(10) ||
+ ' ZTST_TEARDOWN;' || CHR(10) ||
+ CHR(10) ;
+ end if;
+ return ret_str;
+ end get_procedures;
+begin
+ for obj_rec in (
+ select object_type, owner, object_name
+ from dba_objects obj
+ where object_name like 'ZTST\_%' escape '\'
+ and object_name not like '%\_DATA' escape '\'
+ and object_type in ('PACKAGE', 'PACKAGE BODY')
+ and owner = :SCHEMA_NAME
+ and owner not in ('SYS','UTP')
+ and not exists (select 'x'
+ from wt_qual_test_runners_vw src
+ where src.owner = obj.owner
+ and src.package_name = obj.object_name )
+ order by object_type desc, owner, object_name )
+ -- Package Bodies before Package Specifications
+ loop
+ src_clob := dbms_metadata.get_ddl(object_type => case obj_rec.object_type
+ when 'PACKAGE' then 'PACKAGE_SPEC'
+ when 'PACKAGE BODY' then 'PACKAGE_BODY'
+ else obj_rec.object_type
+ end
+ ,name => obj_rec.object_name
+ ,schema => obj_rec.owner);
+ tmp_clob := regexp_replace(src_clob, '\r$', '');
+ end_ptr := find_end_ptr(obj_rec.object_type);
+ end_str := substr(tmp_clob, end_ptr);
+ case obj_rec.object_type
+ when 'PACKAGE'
+ then
+ src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) ||
+ ' procedure ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' ||
+ CHR(10) ||
+ CHR(10) ||
+ end_str;
+ when 'PACKAGE BODY'
+ then
+ src_clob := substr(tmp_clob, 1, end_ptr-1) || CHR(10) ||
+ 'procedure ' || wtplsql.C_RUNNER_ENTRY_POINT ||
+ ' is begin' || CHR(10) ||
+ get_procedures(obj_rec.owner, obj_rec.object_name) ||
+ 'end ' || wtplsql.C_RUNNER_ENTRY_POINT || ';' ||
+ CHR(10) ||
+ CHR(10) ||
+ end_str;
+ else
+ raise_application_error(-20000, 'Unknown Object Type: ' ||
+ obj_rec.object_type) ;
+ end case;
+ dbms_output.put_line('Compiling ' || obj_rec.object_type ||
+ ' ' || obj_rec.owner ||
+ '.' || obj_rec.object_name );
+ begin
+ execute immediate src_clob;
+ exception when invalid_sql_statment
+ then
+ big_put_line;
+ end;
+ end loop;
+end;
+/
diff --git a/src/demo/Package-Test.sql b/demo/Package-Test.sql
similarity index 90%
rename from src/demo/Package-Test.sql
rename to demo/Package-Test.sql
index 4cc35eb..07cd3bc 100644
--- a/src/demo/Package-Test.sql
+++ b/demo/Package-Test.sql
@@ -4,6 +4,7 @@ as
procedure wtplsql_run;
end test_dbms_output;
/
+show errors
create or replace package body test_dbms_output
as
@@ -14,6 +15,7 @@ as
end wtplsql_run;
end test_dbms_output;
/
+show errors
create or replace package body test_dbms_output
as
@@ -35,10 +37,19 @@ as
end wtplsql_run;
end test_dbms_output;
/
+show errors
+
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_test_run.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+end;
+/
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
end;
/
@@ -63,16 +74,13 @@ as
end wtplsql_run;
end test_dbms_output;
/
+show errors
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
end;
/
-
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
+show errors
create or replace package body test_dbms_output
as
@@ -123,21 +131,19 @@ as
test_put_get_line;
teardown;
exception when others then
- l_error_message := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,4000);
+ l_error_message := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace
+ ,1,4000);
teardown;
raise_application_error(-20000, l_error_message);
end wtplsql_run;
--
end test_dbms_output;
/
+show errors
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
end;
/
-
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
+show errors
diff --git a/demo/README.md b/demo/README.md
new file mode 100644
index 0000000..0167e09
--- /dev/null
+++ b/demo/README.md
@@ -0,0 +1,34 @@
+# wtPLSQL Demp Scripts
+
+File Name | Description
+-------------------------|------------
+common_setup.sql | Common Installation Settings
+install.sql | Installation Script
+installO.sql | Sample Installation Log
+Package-Test.sql | Package Test Example
+Table-Test.sql | Table Test Example
+Test-Runner.sql | Test Runner Example
+Trigger-Test.sql | Trigger Test Example
+Type-Test.sql | Type Test Example
+uninstall.sql | Uninstall Script
+ut_betwnstr.sql | utPLSQL 2.3 ut_betwnstr Example
+ut_calc_secs_between.sql | utPLSQL 2.3 ut_calc_secs_between Example
+ut_str.sql | utPLSQL 2.3 ut_str Example
+ut_truncit.sql | utPLSQL 2.3 ut_truncit Example
+
+
+For more information, see https://ddieterich.github.io/wtPLSQL/demo/
+
+
+### Install Procedure
+
+1) sqlplus SYS/password as SYSDBA @install
+2) exit
+3) Compare install.LST to installO.LST
+
+
+### UnInstall Procedure
+
+1) sqlplus SYS/password as SYSDBA @uninstall
+2) exit
+3) Compare uninstall.LST to uninstallO.LST
diff --git a/src/demo/Table-Test.sql b/demo/Table-Test.sql
similarity index 59%
rename from src/demo/Table-Test.sql
rename to demo/Table-Test.sql
index ea01eee..822b484 100644
--- a/src/demo/Table-Test.sql
+++ b/demo/Table-Test.sql
@@ -14,6 +14,7 @@ as
procedure wtplsql_run;
end table_test_pkg;
/
+show errors
create or replace package body table_test_pkg
as
@@ -33,17 +34,39 @@ as
against_this_in => 'TEST1');
rollback;
end t_happy_path_1;
+ procedure t_sad_path_1
+ is
+ begin
+ wt_assert.g_testcase := 'Sad Path 1';
+ wt_assert.raises (
+ msg_in => 'Raise Error',
+ check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')',
+ against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated');
+ end t_sad_path_1;
procedure wtplsql_run is
begin
t_happy_path_1;
+ t_sad_path_1;
end wtplsql_run;
end table_test_pkg;
/
+show errors
+
+set serveroutput on size unlimited format truncated
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.wt_test_run.delete_hooks;
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+ update wtp.hooks
+ set run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 30); end;'
+ where hook_name = 'after_test_run'
+ and run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 10); end;';
+ wtp.hook.init;
+end;
+/
begin
wtplsql.test_run('TABLE_TEST_PKG');
- wt_text_report.dbms_out(USER,'TABLE_TEST_PKG',30);
end;
/
diff --git a/src/demo/Test-Runner.sql b/demo/Test-Runner.sql
similarity index 66%
rename from src/demo/Test-Runner.sql
rename to demo/Test-Runner.sql
index 3d4568e..4074964 100644
--- a/src/demo/Test-Runner.sql
+++ b/demo/Test-Runner.sql
@@ -4,6 +4,7 @@ as
procedure wtplsql_run;
end simple_test_runner;
/
+show errors
create or replace package body simple_test_runner
as
@@ -14,24 +15,27 @@ as
end wtplsql_run;
end simple_test_runner;
/
+show errors
+
+set serveroutput on size unlimited format truncated
begin
- wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
end;
/
-set serveroutput on size unlimited format word_wrapped
-
begin
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+ wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
-set serveroutput on size unlimited format word_wrapped
-
begin
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
@@ -55,34 +59,37 @@ as
end wtplsql_run;
end simple_test_runner;
/
+show errors
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
create or replace package body simple_test_runner
as
- --% WTPLSQL SET DBOUT "SIMPLE_TEST_RUNNER:PACKAGE BODY" %--
procedure wtplsql_run is begin
+ wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
wt_assert.eq(msg_in => 'Ad-Hoc Test'
,check_this_in => 1
,against_this_in => '1');
end wtplsql_run;
end simple_test_runner;
/
+show errors
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
create or replace package body simple_test_runner
as
- --% WTPLSQL SET DBOUT "SIMPLE_TEST_RUNNER:PACKAGE BODY" %--
function add2 (in_val1 number, in_val2 number) return number is
l_result number;
begin
@@ -90,6 +97,7 @@ as
return l_result;
end add2;
procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
+ wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
wt_assert.g_testcase := 'My Test Case';
wt_assert.eq(msg_in => 'Ad-Hoc Test'
,check_this_in => add2(2, 3)
@@ -97,9 +105,12 @@ as
end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
end simple_test_runner;
/
+show errors
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
diff --git a/src/demo/Trigger-Test.sql b/demo/Trigger-Test.sql
similarity index 79%
rename from src/demo/Trigger-Test.sql
rename to demo/Trigger-Test.sql
index 57d0799..378bccc 100644
--- a/src/demo/Trigger-Test.sql
+++ b/demo/Trigger-Test.sql
@@ -24,12 +24,14 @@ begin
:new.created_dtm := sysdate;
end;
/
+show errors
create or replace package trigger_test_pkg authid definer
as
procedure wtplsql_run;
end trigger_test_pkg;
/
+show errors
create or replace package body trigger_test_pkg
as
@@ -53,19 +55,29 @@ as
check_this_in => l_rec.created_dtm);
rollback;
end t_happy_path_1;
- --% WTPLSQL SET DBOUT "TRIGGER_TEST_BIR:TRIGGER" %--
procedure wtplsql_run
is
begin
+ wtplsql.g_DBOUT := 'TRIGGER_TEST_BIR:TRIGGER';
t_happy_path_1;
end wtplsql_run;
end trigger_test_pkg;
/
+show errors
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('TRIGGER_TEST_PKG');
- wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'TRIGGER_TEST_PKG'
+ ,in_detail_level => 30);
end;
/
diff --git a/src/demo/Type-Test.sql b/demo/Type-Test.sql
similarity index 80%
rename from src/demo/Type-Test.sql
rename to demo/Type-Test.sql
index c5ad540..ba91884 100644
--- a/src/demo/Type-Test.sql
+++ b/demo/Type-Test.sql
@@ -11,6 +11,7 @@ create or replace type simple_test_obj_type authid definer
,in_observation number)
);
/
+show errors
create or replace type body simple_test_obj_type is
CONSTRUCTOR FUNCTION simple_test_obj_type
@@ -34,16 +35,17 @@ create or replace type body simple_test_obj_type is
end add_observation;
end;
/
+show errors
create or replace package test_simple_object authid definer
as
procedure wtplsql_run;
end test_simple_object;
/
+show errors
create or replace package body test_simple_object
as
- --% WTPLSQL SET DBOUT "SIMPLE_TEST_OBJ_TYPE:TYPE BODY" %--
procedure t_constructor
is
simple_test_obj simple_test_obj_type;
@@ -59,15 +61,26 @@ as
procedure wtplsql_run
as
begin
+ wtplsql.g_DBOUT := 'SIMPLE_TEST_OBJ_TYPE:TYPE BODY';
t_constructor;
end wtplsql_run;
end test_simple_object;
/
+show errors
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('TEST_SIMPLE_OBJECT');
- wt_text_report.dbms_out(USER,'TEST_SIMPLE_OBJECT',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'TEST_SIMPLE_OBJECT'
+ ,in_detail_level => 30);
end;
/
diff --git a/demo/gilded_rose.sql b/demo/gilded_rose.sql
new file mode 100644
index 0000000..46f8e02
--- /dev/null
+++ b/demo/gilded_rose.sql
@@ -0,0 +1,106 @@
+
+--
+-- Here are the requirements for the GildedRose Code Kata:
+-- 1) All items have a SellIn value which denotes the number of days we have to sell the item.
+-- 2) All items have a Quality value which denotes how valuable the item is.
+-- 3) At the end of each day our system lowers both values for every item.
+-- 4) Once the sell by date has passed, Quality degrades twice as fast.
+-- 5) The Quality of an item is never negative.
+-- 6) "Aged Brie" actually increases in Quality the older it gets.
+-- 7) The Quality of an item is never more than 50.
+-- 8) "Sulfuras", being a legendary item, never has to be sold or decreases in Quality.
+-- 9) "Backstage passes", like aged brie, increases in Quality as it's SellIn value approaches.
+-- Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less
+-- but Quality drops to 0 after the concert.
+-- 10) "Conjured" items degrade in Quality twice as fast as normal items.
+--
+-- There are several kinds of requirements here.
+-- -) 1 & 2 are Attributes. Everything has/is
+-- -) 3, 4, 6, 8, 9, & 10 are processes. Always do, with exceptions.
+-- -) 5 & 7 are corner cases, boundary conditions.
+--
+
+create table gilded_roses
+ (name varchar2(100) constraint gilded_roses_nn1 not null
+ ,sell_in number(6) constraint gilded_roses_nn2 not null
+ ,quality number(6) constraint gilded_roses_nn3 not null
+ ,reduce number(3) constraint gilded_roses_nn4 not null
+ ,reduce10 number(3)
+ ,reduce5 number(3)
+ ,constraint gilded_roses_ck1 check (quality between 0 and 50));
+
+comment on column gilded_roses.name is 'Name of Item';
+comment on column gilded_roses.sell_in is 'Number of Days to Sell';
+comment on column gilded_roses.quality is 'Value of Quality';
+comment on column gilded_roses.reduce is 'Quality Reduction Per Day';
+comment on column gilded_roses.reduce10 is 'Quality Reduction Per Day with 10 days or less';
+comment on column gilded_roses.reduce5 is 'Quality Reduction Per Day with 5 days or less';
+
+insert into gilded_roses values ('Aged Brie' , 0, 30, -1);
+insert into gilded_roses values ('Sulfuras' , -1, 30, 0);
+insert into gilded_roses values ('Backstage Pass', 30, 30, -1, -2, -3);
+insert into gilded_roses values ('Conjured' , 30, 30, 2);
+insert into gilded_roses values ('Normal' , 30, 30, 1);
+
+create or replace package gilded_rose
+ authid definer
+as
+
+ procedure end_of_day;
+
+ $IF $$WTPLSQL_ENABLE
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end gilded_rose;
+/
+show errors
+
+
+create or replace package body gilded_rose
+as
+
+
+procedure end_of_day
+is
+ TYPE gr_nt_type is table of gilded_roses%ROWTYPE;
+ gr_nt gr_nt_type;
+begin
+ select * bulk collect into gr_nt
+ from gilded_roses
+ where sell_in >= 0;
+ for i in 1 .. gr_nt.COUNT
+ loop
+ if gr_nt(i).reduce5 is not null
+ AND sell_in <= 5
+ then
+ elsif gr_nt(i).reduce5 is not null
+ AND sell_in <= 5
+ then
+ else
+ gr_nt(i).sell_in := gr_nt(i).sell_in - 1;
+ if gr_nt(i).sell_in < 0
+ then
+ gr_nt(i).quality := 0;
+ else
+ gr_nt(i).quality := gr_nt(i).quality - gr_nt(i).reduce;
+ end if;
+ end if;
+ if gr_nt(i).quality > 50 then gr_nt(i).quality := 50; end if;
+ if gr_nt(i).quality < 0 then gr_nt(i).quality := 0; end if;
+ end loop;
+end end_of_day;
+
+$IF $$WTPLSQL_ENABLE
+$THEN
+procedure WTPLSQL_RUN
+is
+begin
+ utassert.g_testcase_name = '';
+end WTPLSQL_RUN;
+$END
+
+end gilded_rose;
+/
+show errors
diff --git a/demo/install_sys.sql b/demo/install_sys.sql
new file mode 100644
index 0000000..8a1cf39
--- /dev/null
+++ b/demo/install_sys.sql
@@ -0,0 +1,48 @@
+
+--
+-- Demo Installation
+--
+
+-- Capture output
+spool install_sys
+set serveroutput on size unlimited format truncated
+
+WHENEVER SQLERROR exit SQL.SQLCODE
+
+begin
+ if USER not in ('SYS','SYSTEM')
+ then
+ raise_application_error (-20000,
+ 'Not logged in as SYS or SYSTEM');
+ end if;
+end;
+/
+
+WHENEVER SQLERROR continue
+
+prompt
+prompt Create Demo owner
+
+create user WTP_DEMO identified by WTP_DEMO
+ default tablespace users
+ quota 1M on users
+ temporary tablespace temp;
+
+grant create session to WTP_DEMO;
+grant create type to WTP_DEMO;
+grant create sequence to WTP_DEMO;
+grant create table to WTP_DEMO;
+grant create trigger to WTP_DEMO;
+grant create view to WTP_DEMO;
+grant create procedure to WTP_DEMO;
+
+begin
+ $IF $$WTPLSQL_ENABLE
+ $THEN
+ dbms_output.put_line('WTPLSQL_ENABLE is TRUE');
+ $END
+ dbms_output.put_line('Check WTPLSQL_ENABLE is Done.');
+end;
+/
+
+WHENEVER SQLERROR exit SQL.SQLCODE
diff --git a/demo/uninstall.sql b/demo/uninstall.sql
new file mode 100644
index 0000000..9bac0b3
--- /dev/null
+++ b/demo/uninstall.sql
@@ -0,0 +1,7 @@
+
+spool uninstall
+set serveroutput on size unlimited format truncated
+
+drop user WT_DEMO cascade;
+
+spool off
diff --git a/src/demo/ut_betwnstr.sql b/demo/ut_betwnstr.sql
similarity index 80%
rename from src/demo/ut_betwnstr.sql
rename to demo/ut_betwnstr.sql
index a838ddf..f394c4d 100644
--- a/src/demo/ut_betwnstr.sql
+++ b/demo/ut_betwnstr.sql
@@ -16,6 +16,7 @@ BEGIN
);
END;
/
+show errors
CREATE OR REPLACE PACKAGE ut_betwnstr
IS
@@ -26,6 +27,7 @@ IS
PROCEDURE wtplsql_run;
END ut_betwnstr;
/
+show errors
CREATE OR REPLACE PACKAGE BODY ut_betwnstr
IS
@@ -91,9 +93,9 @@ IS
END ut_BETWNSTR;
- --% WTPLSQL SET DBOUT "BETWNSTR:FUNCTION" %--
PROCEDURE wtPLSQL_run IS
BEGIN
+ wtplsql.g_DBOUT := 'BETWNSTR:FUNCTION';
ut_setup;
ut_betwnstr;
ut_teardown;
@@ -101,11 +103,21 @@ IS
END ut_betwnstr;
/
+show errors
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('UT_BETWNSTR');
- wt_text_report.dbms_out(USER,'UT_BETWNSTR',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_BETWNSTR'
+ ,in_detail_level => 30);
end;
/
diff --git a/src/demo/ut_calc_secs_between.sql b/demo/ut_calc_secs_between.sql
similarity index 76%
rename from src/demo/ut_calc_secs_between.sql
rename to demo/ut_calc_secs_between.sql
index e98a414..7aa74f8 100644
--- a/src/demo/ut_calc_secs_between.sql
+++ b/demo/ut_calc_secs_between.sql
@@ -12,6 +12,7 @@ BEGIN
secs := (date2 - date1) * 24 * 60 * 60;
END;
/
+show errors
CREATE OR REPLACE PACKAGE ut_calc_secs_between
IS
@@ -23,6 +24,7 @@ IS
PROCEDURE wtplsql_run;
END ut_calc_secs_between;
/
+show errors
CREATE OR REPLACE PACKAGE BODY ut_calc_secs_between
IS
@@ -73,9 +75,9 @@ IS
END ut_CALC_SECS_BETWEEN;
- --% WTPLSQL SET DBOUT "CALC_SECS_BETWEEN:PROCEDURE" %--
PROCEDURE wtPLSQL_run IS
BEGIN
+ wtplsql.g_DBOUT := 'CALC_SECS_BETWEEN:PROCEDURE';
ut_setup;
ut_CALC_SECS_BETWEEN;
ut_teardown;
@@ -83,12 +85,21 @@ IS
END ut_calc_secs_between;
/
+show errors
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('UT_CALC_SECS_BETWEEN');
- wt_text_report.dbms_out(in_runner_name => 'UT_CALC_SECS_BETWEEN'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_CALC_SECS_BETWEEN'
+ ,in_detail_level => 30);
end;
/
diff --git a/src/demo/ut_str.sql b/demo/ut_str.sql
similarity index 85%
rename from src/demo/ut_str.sql
rename to demo/ut_str.sql
index 317564b..343c6ab 100644
--- a/src/demo/ut_str.sql
+++ b/demo/ut_str.sql
@@ -25,6 +25,7 @@ IS
PROCEDURE wtplsql_run;
END str;
/
+show errors
/* Formatted on 2001/11/19 15:15 (Formatter Plus v4.5.2) */
CREATE OR REPLACE PACKAGE BODY str
@@ -113,9 +114,9 @@ IS
);
END;
- --% WTPLSQL SET DBOUT "STR:PACKAGE BODY" %--
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'STR:PACKAGE BODY';
ut_setup;
ut_betwn;
ut_teardown;
@@ -123,12 +124,21 @@ IS
END str;
/
+show errors
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
+
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('STR');
- wt_text_report.dbms_out(in_runner_name => 'STR'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'STR'
+ ,in_detail_level => 30);
end;
/
diff --git a/src/demo/ut_truncit.sql b/demo/ut_truncit.sql
similarity index 76%
rename from src/demo/ut_truncit.sql
rename to demo/ut_truncit.sql
index 7addb6e..c85ad2a 100644
--- a/src/demo/ut_truncit.sql
+++ b/demo/ut_truncit.sql
@@ -9,6 +9,7 @@ BEGIN
EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
END;
/
+show errors
/*file tabcount.sf */
CREATE OR REPLACE FUNCTION tabcount (
@@ -28,6 +29,7 @@ EXCEPTION
RETURN NULL;
END;
/
+show errors
CREATE OR REPLACE PACKAGE ut_truncit
IS
@@ -39,6 +41,7 @@ IS
PROCEDURE wtplsql_run;
END ut_truncit;
/
+show errors
/*file ut_truncit.pkb */
CREATE OR REPLACE PACKAGE BODY ut_truncit
@@ -73,22 +76,30 @@ IS
);
END ut_TRUNCIT;
- --% WTPLSQL SET DBOUT "TRUNCIT:PROCEDURE" %--
-
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'TRUNCIT:PROCEDURE';
ut_setup;
ut_TRUNCIT;
ut_teardown;
END wtplsql_run;
END ut_truncit;
/
+show errors
+
+set serveroutput on size unlimited format truncated
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
begin
wtplsql.test_run('UT_TRUNCIT');
- wt_text_report.dbms_out(in_runner_name => 'UT_TRUNCIT'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_TRUNCIT'
+ ,in_detail_level => 30);
end;
/
diff --git a/diffs/README.md b/diffs/README.md
new file mode 100644
index 0000000..d070326
--- /dev/null
+++ b/diffs/README.md
@@ -0,0 +1,11 @@
+# wtPLSQL Releases
+
+[wtPLSQL website (on GitHub.io)](https://ddieterich.github.io/wtPLSQL/)
+
+
+### Files and Directories
+
+File Name | Description
+----------|------------
+V1.1.0 | Directory of V1.1.0 Release Notes, Upgrades, and Downgrades
+V1.2 | Directory of V1.2 Release Notes, Upgrades, and Downgrades
diff --git a/diffs/V1.1.0/RELEASE_NOTES.md b/diffs/V1.1.0/RELEASE_NOTES.md
new file mode 100644
index 0000000..1a4b210
--- /dev/null
+++ b/diffs/V1.1.0/RELEASE_NOTES.md
@@ -0,0 +1,88 @@
+
+wtPLSQL 1.1.0 Release Notes:
+
+### New Features
+* Added THROWS assertion.
+* Fully implemented the utPLSQL V1 UT_ASSERT API for implemented assertions.
+* Exceptions from "query" assertions are now handled.
+* Streamlined WT_TEXT_REPORT output.
+* Added WT_TEST_RUN_STATS and WT_TESTCASE_STATS summary tables.
+* Added comments to DBMS_PROFILER tables.
+* Changed ANNO annotation to IGNR in WT_DBOUT_PROFILES table.
+* Added units to time columns in WT_DBOUT_PROFILES table.
+* Improved robustness of WT_PROFILER package.
+* Corrected problems with wtPLSQL non-owner testing.
+
+### Detailed Changes
+* Permission Changes
+ * revoke connect, resource from &schema_owner.;
+ * revoke select, insert, delete on plsql_profiler_runs from public;
+ * revoke select, insert, delete on plsql_profiler_units from public;
+ * revoke select, insert, delete on plsql_profiler_data from public;
+ * revoke insert on wt_results from public;
+ * revoke insert on wt_dbout_profiles from public;
+ * revoke update on wt_dbout_profiles from public;
+ * alter user &schema_owner. quota unlimited on USERS;
+ * grant create session to &schema_owner.;
+ * grant create type to &schema_owner.;
+ * grant create sequence to &schema_owner.;
+ * grant create table to &schema_owner.;
+ * grant create trigger to &schema_owner.;
+ * grant create view to &schema_owner.;
+ * grant create procedure to &schema_owner.;
+ * grant select on dba_source to &schema_owner.;
+ * grant select on dba_objects to &schema_owner.;
+ * grant select on wt_test_runs_seq to public;
+ * grant execute on wtplsql to public;
+ * grant execute on wt_assert to public;
+ * grant execute on wt_text_report to public;
+* Public Synonym Changes
+ * drop public synonym wt_not_executable;
+ * drop public synonym plsql_profiler_runs;
+ * drop public synonym plsql_profiler_units;
+ * drop public synonym plsql_profiler_data;
+ * drop public synonym wt_profiler;
+ * drop public synonym wt_result;
+ * create or replace public synonym utassert for &schema_owner..wt_assert;
+ * create or replace public synonym wt_version for &schema_owner..wt_version;
+ * create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq;
+ * create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats;
+ * create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats;
+ * create or replace public synonym wt_self_test for &schema_owner..wt_self_test;
+ * grant select on plsql_profiler_runnumber to public;
+* Add Profile Table Comments
+ * @proftab_comments.sql
+* Table Changes
+ * drop table wt_test_data;
+ * wt_version.tab
+ * wt_testcase_stats.tab
+ * wt_test_run_stats.tab
+ * wt_self_test.tab
+ * wt_test_runs.tab
+ * @wt_results.tab
+ * alter table wt_results rename column elapsed_msecs to interval_msecs;
+ * comment on column wt_results.interval_msecs
+ * alter table wt_dbout_profiles rename column total_time to total_usecs;
+ * alter table wt_dbout_profiles rename column min_time to min_usecs;
+ * alter table wt_dbout_profiles rename column max_time to max_usecs;
+ * comment on column wt_dbout_profiles.status
+ * comment on column wt_dbout_profiles.total_usecs
+ * comment on column wt_dbout_profiles.min_usecs
+ * comment on column wt_dbout_profiles.max_usecs
+ * alter table wt_dbout_profiles drop constraint wt_dbout_profiles_ck1;
+ * update wt_dbout_profiles set status = 'IGNR' where status = 'ANNO';
+ * alter table wt_dbout_profiles add constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN'));
+ * update_all_stats.sql
+* Packages
+ * wtplsql.pks
+ * wtplsql.pkb
+ * wt_result.pks
+ * wt_result.pkb
+ * wt_assert.pks
+ * wt_assert.pkb
+ * wt_profiler.pks
+ * wt_profiler.pkb
+ * wt_test_run_stat.pks
+ * wt_test_run_stat.pkb
+ * wt_text_report.pks
+ * wt_text_report.pkb
diff --git a/src/core/downgrades/Current_to_V1.0.0/README.txt b/diffs/V1.1.0/downgrade_to_V1.0.0/README.md
similarity index 61%
rename from src/core/downgrades/Current_to_V1.0.0/README.txt
rename to diffs/V1.1.0/downgrade_to_V1.0.0/README.md
index 39c4d69..5424424 100644
--- a/src/core/downgrades/Current_to_V1.0.0/README.txt
+++ b/diffs/V1.1.0/downgrade_to_V1.0.0/README.md
@@ -1,2 +1,3 @@
+# V1.1.0 to V1.0.0 Downgrade ReadMe
V1.0 of wtPLSQL was too flawed. No downgrade available.
diff --git a/diffs/V1.1.0/upgrade_from_V1.0.0/README.md b/diffs/V1.1.0/upgrade_from_V1.0.0/README.md
new file mode 100644
index 0000000..675d9cb
--- /dev/null
+++ b/diffs/V1.1.0/upgrade_from_V1.0.0/README.md
@@ -0,0 +1,14 @@
+# V1.0.0 to V1.1.0 Upgrade ReadMe
+
+File Name | Description
+---------------------|------------
+update_all_stats.sql | Populate the new STATS tables
+upgrade.sql | Main upgrade script
+upgradeO.LST | Example of successful results from Demo Installation
+
+
+### Install Procedure
+
+1) sqlplus SYS/password as SYSDBA @upgrade
+2) exit
+3) Compare upgrade.LST to upgradeO.LST
diff --git a/src/core/upgrades/V1.0.0_to_Current/update_all_stats.sql b/diffs/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql
similarity index 92%
rename from src/core/upgrades/V1.0.0_to_Current/update_all_stats.sql
rename to diffs/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql
index 6846aa9..57ead82 100644
--- a/src/core/upgrades/V1.0.0_to_Current/update_all_stats.sql
+++ b/diffs/V1.1.0/upgrade_from_V1.0.0/update_all_stats.sql
@@ -5,7 +5,7 @@
-- Compute and Add statistics to V1.1.0 "stats" tables
--
-set serveroutput on size unlimited format wrapped
+set serveroutput on size unlimited format truncated
set linesize 1000
set trimspool on
@@ -88,8 +88,9 @@ begin
where test_run_id = buff.id;
insert into wt_test_run_stats values test_run_stats_rec;
exception when others then
- dbms_output.put_line(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace);
+ dbms_output.put_line(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack);
rollback;
end;
--
@@ -147,8 +148,9 @@ begin
and testcase = buff.testcase;
insert into wt_testcase_stats values testcase_stats_rec;
exception when others then
- dbms_output.put_line(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace);
+ dbms_output.put_line(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack);
rollback;
end;
--
diff --git a/src/core/upgrades/V1.0.0_to_Current/upgrade.sql b/diffs/V1.1.0/upgrade_from_V1.0.0/upgrade.sql
similarity index 99%
rename from src/core/upgrades/V1.0.0_to_Current/upgrade.sql
rename to diffs/V1.1.0/upgrade_from_V1.0.0/upgrade.sql
index a6dcf1a..22ea202 100644
--- a/src/core/upgrades/V1.0.0_to_Current/upgrade.sql
+++ b/diffs/V1.1.0/upgrade_from_V1.0.0/upgrade.sql
@@ -11,7 +11,7 @@ set serveroutput on size unlimited format truncated
set showmode off
-- Shared Setup Script
-@../../common_setup.sql
+@../../../common_setup.sql
WHENEVER SQLERROR exit SQL.SQLCODE
diff --git a/src/core/upgrades/V1.0.0_to_Current/upgradeO.LST b/diffs/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST
similarity index 100%
rename from src/core/upgrades/V1.0.0_to_Current/upgradeO.LST
rename to diffs/V1.1.0/upgrade_from_V1.0.0/upgradeO.LST
diff --git a/diffs/V1.2/RELEASE_NOTES.md b/diffs/V1.2/RELEASE_NOTES.md
new file mode 100644
index 0000000..fa13c01
--- /dev/null
+++ b/diffs/V1.2/RELEASE_NOTES.md
@@ -0,0 +1,39 @@
+
+wtPLSQL 1.2 Release Notes:
+
+Proposed V1.2 Release
+* Hooks allow add-ons to attach to basic framework
+ * Move all reporting into hooks
+ * Move all persistence into hooks
+ * Move all code coverage into hooks.
+ * Brutally fast JUnit XML reporting
+* GUI (Graphical Used Interface) using APEX (Application Express)
+ * Trend Analysis
+ * Launch Test Runners
+ * Test Case and Assertion Drill-Down
+ * Code Coverage Drill Down
+* Travis-CI integration ??
+ * New HTML file based reporting
+
+### Overview
+* Assertion results are recorded in memory arrays by Core.
+* Assertion results are stored in tables by Persist.
+* Code coverage is included in Persist.
+* There are 2 versions of JUnit XML reports, one each for Core and Persist.
+* There are 2 versions of WT_TEXT_OUTPUT package, one each for Core and Persist.
+* The GUI only works with Persist. Demo works with Core and Persist.
+* Major Website Updates (docs directory)
+
+### New Features
+* Add-ons have been implemented. The V1.2 source is now split into multiple directories.
+* The HOOKS table can be used to implement add-ons.
+* A comprehensive GUI has been implemented using Application Express.
+* A utPLSQL conversion tool is available.
+* The WT_VERIONS table has more detail for add-ons.
+* New WT_QUAL_TEST_RUNNERS_VW to list packages that qualify as Test Runners.
+* New WT_JOB package and WT_SCHEDULER_JOBS view for executing Test Runners in parallel.
+* New TEST_RUNNERS table in Persist for increased normalization.
+* Test yield from WT_TEXT_OUTPUT and GUI reports based on test cases instead of assertions.
+
+### Detailed Changes
+* Too numerous to list
diff --git a/diffs/V1.2/downgrade_to_V1.1.0/README.md b/diffs/V1.2/downgrade_to_V1.1.0/README.md
new file mode 100644
index 0000000..0aeac11
--- /dev/null
+++ b/diffs/V1.2/downgrade_to_V1.1.0/README.md
@@ -0,0 +1,11 @@
+# V1.2.0 to V1.1.0 Downgrade ReadMe
+
+File Name | Description
+---------------------|------------
+
+
+### Install Procedure
+
+1) sqlplus SYS/password as SYSDBA @upgrade
+2) exit
+3) Compare upgrade.LST to upgradeO.LST
diff --git a/diffs/V1.2/upgrade_from_V1.1.0/README.md b/diffs/V1.2/upgrade_from_V1.1.0/README.md
new file mode 100644
index 0000000..7d94d0d
--- /dev/null
+++ b/diffs/V1.2/upgrade_from_V1.1.0/README.md
@@ -0,0 +1,11 @@
+# V1.1.0 to V1.2.0 Upgrade ReadMe
+
+File Name | Description
+---------------------|------------
+
+
+### Install Procedure
+
+1) sqlplus SYS/password as SYSDBA @upgrade
+2) exit
+3) Compare upgrade.LST to upgradeO.LST
diff --git a/docs/About-wtPLSQL.htm b/docs/About-wtPLSQL.htm
index 072bffa..79554d4 100644
--- a/docs/About-wtPLSQL.htm
+++ b/docs/About-wtPLSQL.htm
@@ -9,14 +9,18 @@ History
utPLSQL V3 Website
Background
Because of his reputation with Oracle's PL/SQL, Steven Feuerstein's utPLSQL has been widely adopted. However, maintenance of the utPLSQL source code became a problem with the latest utPLSQL V2 releases. Inspection of the utPLSQL V2 source code revealed some very complex code pathways. Much of this resulted from the layering of the V1 API on top of the V2 implementation. There is no documentation on how the V1 layering was intended to work. There is no documentation on the overall design of the V2 implementation. There is no documentation on how to use the V2 API. (Kudos to @PaulWalkerUK for an amazing job of maintaining the V2 code set.) As a result, most all unit tests written with utPLSQL V2 use the V1 APIs.
- The utPLSQL V3 project was started with a "clean sheet" approach. The project took a distinctly object oriented direction. This is apropos, given that Steven Feuerstein subtitles utPLSQL as "JUnit for PLSQL". The V3 project has also adopted other aspects of JUnit testing like annotations. It is a clever and useful approach and will be familiar to Java developers. @jgebal was part of the utPLSQL V3 development from the beginning and continues to provide excellent contributions and information for that project.
- Before the "clean sheet" approach was adopted, the V3 team reviewed what has been published as the utPLSQL_Lite project. The utPSQL_Lite project was an effort to create a simplified utPLSQL core with the use of options/add-ons to achieve additional functionality.
+ The utPLSQL V3 project was started with a "clean sheet" approach. The project took a distinctly object oriented direction. This is apropos, given that Steven Feuerstein subtitles utPLSQL as "JUnit for PLSQL". The V3 project has also adopted other aspects of JUnit testing like annotations. It is a clever and useful approach and will be familiar to Java developers. @jgebal was part of the utPLSQL V3 development from the beginning and continues to provide excellent contributions and information for that project.
+ Before the "clean sheet" approach was adopted, the V3 team reviewed what has been published as the utPLSQL_Lite project. The utPSQL_Lite project was an effort to create a simplified utPLSQL core with the use of options/add-ons to achieve additional functionality.
The wtPLSQL project is a continuation of the utPLSQL_Lite project.
+ What is wtPLSQL (Whitebox Testing PL/SQL)?
+ wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize.
+ wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included.
+ wtPLSQL implements the basic/core functionality of utPLSQL V2 while preserving the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core component will be achieved through add-ons.
Goals
This project focuses on providing a simple, yet robust, framework for dynamic, white box testing of Oracle Database Objects.
Simple Framework
Kent wants people to control their own environment, so he liked to have each team build the framework themselves
- The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The framework supplies resources for collecting and reporting information from those test runners. Through its simplified architecture and open source approach, extensions of the functionality are relatively easy.
+ The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The framework supplies resources for collecting and reporting information from those test runners. Through its simplified architecture, configurable hooks, and open source approach, extensions of the functionality are relatively easy.
Robust Framework
Robustness is the ability of a computer system to cope with errors during execution
The wtPLSQL framework includes provisions for the following errors during execution:
@@ -32,7 +36,11 @@ Dynamic Testing
The wtPLSQL framework supports testing of source code during its execution. That is, the source code is executed during testing. It is not a static code analyzer or a guide for review meetings.
White Box Testing
Tests internal structures or workings of a program
- The essence of white box testing is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the code coverage of the test. A complete white box test will achieve 100% code coverage. This does not guarantee all aspects of the code have been tested, but it does ensure that all code pathways have been tested.
+ The essence of white box testing is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the code coverage of the test. A complete white box test will achieve 100% code coverage (if the needed line feeds are in the PL/SQL source). This does not guarantee all aspects of the code have been tested but it does ensure that all code pathways have been tested (if the needed line feeds are in the PL/SQL source).
+ An important part of establishing code coverage is identifying what code is being tested. The Persist add-on uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, code coverage information can be gathered and reported.
+ Support for various Testing Levels
+ Broadly speaking, there are at least three levels of testing: unit testing, integration testing, and system testing.
+ wtPLSQL is useful for all levels of testing. White box testing is especially useful for testing at the unit level. The flexibility of a Test Runner package is useful for testing at the integration and system levels.
An important part of establishing code coverage is identifying what code is being tested. The wtPLSQL framework uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, the framework can gather and report information regarding code coverage.
Oracle Database Objects
Some of the (database) objects that schemas can contain are Packages, Procedures, Functions, Triggers, and Views.
@@ -76,6 +84,6 @@ Test Fixtures and Test Suites
Test fixtures and test suites are a part of the xUnit testing framework. At the core, wtPLSQL does not include test fixtures or test suites. If needed, these can be easily defined and implemented in a test runner package.
Test Driven Development
With TDD (Test Driven Development), you write a test before you write just enough production code to fulfill that test
- The wtPLSQL framework is not intended for Test Driven Development. 100% code coverage is not desirable under the TDD approach. Test isolation and test transience are welcomed mechanisms to assist in getting tests to pass quickly in TDD. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience.
+ The wtPLSQL framework is not intended for Test Driven Development. The wtPLSQL framework embraces 100% code coverage and does not require test isolation or test transience.
Website Home Page
diff --git a/docs/About-wtPLSQL.md b/docs/About-wtPLSQL.md
index 30d7344..36e641f 100644
--- a/docs/About-wtPLSQL.md
+++ b/docs/About-wtPLSQL.md
@@ -23,13 +23,21 @@ Before the "clean sheet" approach was adopted, the V3 team reviewed what has bee
The wtPLSQL project is a continuation of the utPLSQL_Lite project.
+## What is wtPLSQL (Whitebox Testing PL/SQL)?
+
+wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize.
+
+wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included.
+
+wtPLSQL implements the basic/core functionality of utPLSQL V2 while preserving the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core component will be achieved through add-ons.
+
## Goals
This project focuses on providing a **simple**, yet **robust**, framework for **dynamic**, **white box** testing of **Oracle Database Objects**.
### Simple Framework
[Kent wants people to control their own environment, so he liked to have each team build the framework themselves](https://martinfowler.com/bliki/Xunit.html)
-The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The framework supplies resources for collecting and reporting information from those test runners. Through its simplified architecture and open source approach, extensions of the functionality are relatively easy.
+The wtPLSQL project is an attempt to allow PL/SQL developers to be PL/SQL developers. The test runners are entirely user-written in PL/SQL. The framework supplies resources for collecting and reporting information from those test runners. Through its simplified architecture, configurable hooks, and open source approach, extensions of the functionality are relatively easy.
### Robust Framework
[Robustness is the ability of a computer system to cope with errors during execution](https://en.wikipedia.org/wiki/Robustness_(computer_science))
@@ -49,7 +57,15 @@ The wtPLSQL framework supports testing of source code during its execution. Tha
### White Box Testing
[Tests internal structures or workings of a program](https://en.wikipedia.org/wiki/Software_testing#White-box_testing)
-The [essence of white box testing](https://en.wikipedia.org/wiki/White-box_testing#Overview) is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the [code coverage](https://en.wikipedia.org/wiki/Code_coverage) of the test. A complete white box test will achieve 100% code coverage. This does not guarantee all aspects of the code have been tested, but it does ensure that all code pathways have been tested.
+The [essence of white box testing](https://en.wikipedia.org/wiki/White-box_testing#Overview) is the careful testing of the application at the source code level to prevent any hidden errors later on. A key measure of completeness for this kind of testing is the [code coverage](https://en.wikipedia.org/wiki/Code_coverage) of the test. A complete white box test will achieve 100% code coverage (*if the needed line feeds are in the PL/SQL source*). This does not guarantee all aspects of the code have been tested but it does ensure that all code pathways have been tested (*if the needed line feeds are in the PL/SQL source*).
+
+An important part of establishing code coverage is identifying what code is being tested. The Persist add-on uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, code coverage information can be gathered and reported.
+
+### Support for various Testing Levels
+
+[Broadly speaking, there are at least three levels of testing: unit testing, integration testing, and system testing.](https://en.wikipedia.org/wiki/Software_testing#Testing_levels)
+
+wtPLSQL is useful for all levels of testing. White box testing is especially useful for testing at the unit level. The flexibility of a Test Runner package is useful for testing at the integration and system levels.
An important part of establishing code coverage is identifying what code is being tested. The wtPLSQL framework uses a DBOUT (DataBase Object Under Test) to identify the code being tested. Upon identifying the DBOUT, the framework can gather and report information regarding code coverage.
diff --git a/docs/Best-Practices.htm b/docs/Best-Practices.htm
index 3099d5c..347c73a 100644
--- a/docs/Best-Practices.htm
+++ b/docs/Best-Practices.htm
@@ -1,18 +1,15 @@
Website Home Page
Best Practices
- Place the "WTPLSQL_RUN" procedure at the end of the package body. This allows the procedure call any procedure/function in the package.
- Place the "--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure definition in the package body.
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "MY_PACKAGE" %--
- is
-
- Separate "setup" and "teardown" steps into their own Test Cases.**
- Use words consistently in Test Case names.
+ Place the "WTPLSQL_RUN" procedure at the end of the package body. This allows the WTPLSQL_RUN procedure to call any procedure/function in the package.
+ Set the package variable "wtplsql.g_DBOUT" at the top of the WTPLSQL_RUN procedure definition in the package body. This is a common location for all Test Runner packages.
+ Separate "setup" and "teardown" subroutines into their own Test Cases.
+ Name Test Cases Consistently
-- Use the word "Setup" in Test Case names perform setup operations.
-- Use the word "Teardown" in Test Case names that perform tear-down operations.
-- Use the words "Happy Path" in Test Case names that perform "happy path" tests.
-- Use the words "Sad Path" in Test Case names that perform "sad path" tests.
+
- Use the word "Setup" in Test Case names that perform setup operations.
+- Use the word "Teardown" in Test Case names that perform tear-down operations.
+- Use the words "Happy Path" in Test Case names that perform "happy path" tests.
+- Use the words "Sad Path" in Test Case names that perform "sad path" tests.
- expected failure testing.
- fault insertion testing.
@@ -24,27 +21,30 @@ Best Practices
- Longest and shortest values
- All combinations of default and non-default values
-Create test procedures for each procedure/function in a DBOUT PACKAGE BODY.
+Create individual test procedures for each procedure/function in a DBOUT package.
- Call all test procedures from the WTPLSQL_RUN procedure.
- Embed the test procedure just after the procedure/function it tests.
-- Use a consistent prefix on all test procedure names, like "t_".
+- Use a consistent prefix on all test procedure names, like "t_".
-Use conditional compilation select directive "WTPLSQL_ENABLE" in the Oracle database initialization parameter "PLSQL_CCFLAGS" to enable and disable embedded test code in all PACKAGE BODYs.
+Use conditional compilation select directive "WTPLSQL_ENABLE" in the Oracle database initialization parameter "PLSQL_CCFLAGS" to enable and disable embedded test code in all PACKAGE BODYs.
-- "WTPLSQL_ENABLE:TRUE" will enable test code.
-- "WTPLSQL_ENABLE:FALSE" will disable test code.
+- "WTPLSQL_ENABLE:TRUE" will enable test code.
+- "WTPLSQL_ENABLE:FALSE" will disable test code.
-Use consistent begin and end test code markers for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations.
-$IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%-------
-$THEN
- ...
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
+Use consistent begin and end test markers for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations.
+Here is an example "begin test marker".
+ $IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%-------
+ $THEN
+
+Here is an example "end test marker".
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
-Keep embedded test code indented between the test code markers
-Add WTPLSQL markers every 10 lines or less in an embedded procedure. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these.
+Indent embedded test code between the test code markers
+Add test markers every 10 lines or less. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these.
+Here is an example test marker.
-------------------------------------- WTPLSQL Testing --
-Check and/or set NLS settings before testing. Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT.
+Check and/or set NLS settings before testing. Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT.
Website Home Page
diff --git a/docs/Best-Practices.md b/docs/Best-Practices.md
index 7979017..be6026b 100644
--- a/docs/Best-Practices.md
+++ b/docs/Best-Practices.md
@@ -3,19 +3,14 @@
# Best Practices
---
-Place the **"WTPLSQL_RUN" procedure at the end of the package body.** This allows the procedure call any procedure/function in the package.
+Place the **"WTPLSQL_RUN" procedure at the end** of the package body. This allows the WTPLSQL_RUN procedure to call any procedure/function in the package.
-Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure** definition in the package body.
+Set the package variable **"wtplsql.g_DBOUT" at the top** of the WTPLSQL_RUN procedure definition in the package body. This is a common location for all Test Runner packages.
-```
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "MY_PACKAGE" %--
- is
-```
-
-**Separate "setup" and "teardown" steps** into their own Test Cases.**
+**Separate "setup" and "teardown"** subroutines into their own Test Cases.
-**Use words consistently in Test Case names.**
-* Use the word "Setup" in Test Case names perform setup operations.
+**Name Test Cases Consistently**
+* Use the word "Setup" in Test Case names that perform setup operations.
* Use the word "Teardown" in Test Case names that perform tear-down operations.
* Use the words "Happy Path" in Test Case names that perform "happy path" tests.
* Use the words "Sad Path" in Test Case names that perform "sad path" tests.
@@ -27,7 +22,7 @@ Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure
* Longest and shortest values
* All combinations of default and non-default values
-**Create test procedures for each procedure/function** in a DBOUT PACKAGE BODY.
+Create **individual test procedures for each procedure/function** in a DBOUT package.
* Call all test procedures from the WTPLSQL_RUN procedure.
* Embed the test procedure just after the procedure/function it tests.
* Use a consistent prefix on all test procedure names, like "t_".
@@ -36,24 +31,32 @@ Place the **"--% WTPLSQL SET DBOUT" annotation next to the WTPLSQL_RUN procedure
* "WTPLSQL_ENABLE:TRUE" will enable test code.
* "WTPLSQL_ENABLE:FALSE" will disable test code.
-**Use consistent begin and end test code markers** for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations.
+**Use consistent begin and end test markers** for embedded tests. These examples will setup conditional compiling and annotate lines of code to be excluded from code coverage calculations.
+
+Here is an example "begin test marker".
```
-$IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%-------
-$THEN
- ...
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
+ $IF $$WTPLSQL_ENABLE -------%WTPLSQL_begin_ignore_lines%-------
+ $THEN
```
-**Keep embedded test code indented** between the test code markers
+Here is an example "end test marker".
+
+```
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+```
+
+**Indent embedded test code** between the test code markers
+
+**Add test markers** every 10 lines or less. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these.
-**Add WTPLSQL markers every 10 lines or less** in an embedded procedure. This helps identify a long embedded test procedure while scrolling through source code. When in doubt, add more of these.
+Here is an example test marker.
```
-------------------------------------- WTPLSQL Testing --
```
-**Check and/or set NLS settings before testing.** Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT.
+**Check and/or set NLS settings** before testing. Many data types are implicitly converted to VARCHAR2 before comparison. The "wtplsql" package includes functions to check and set NLS settings. Note: Modifying these settings always includes a COMMIT.
---
[Website Home Page](README.md)
diff --git a/docs/Conversion-Component.htm b/docs/Conversion-Component.htm
new file mode 100644
index 0000000..ddbab6e
--- /dev/null
+++ b/docs/Conversion-Component.htm
@@ -0,0 +1,6 @@
+Website Home Page
+wtPLSQL Conversion Component
+
+See the README.md file in the src/conversion directory for installation instructions.
+
+Website Home Page
diff --git a/docs/Conversion-Component.md b/docs/Conversion-Component.md
new file mode 100644
index 0000000..fdf8907
--- /dev/null
+++ b/docs/Conversion-Component.md
@@ -0,0 +1,10 @@
+[Website Home Page](README.md)
+
+# wtPLSQL Conversion Component
+
+---
+
+See the README.md file in the src/conversion directory for installation instructions.
+
+---
+[Website Home Page](README.md)
diff --git a/docs/Core-Component.htm b/docs/Core-Component.htm
new file mode 100644
index 0000000..e9da793
--- /dev/null
+++ b/docs/Core-Component.htm
@@ -0,0 +1,77 @@
+Website Home Page
+wtPLSQL Core Component
+
+Overview
+The Core component is built to be very small and very fast. It has 5 packages, 3 tables, 1 view, and 1 procedure. During execution of a Test Runner, it stores all assertion results in memory. It can be run without any add-ons. It is the backbone of the wtPLSQL whitebox testing server.
+Assertion Storage
+The core component stores all assertion results in the CORE_DATA package. Previous assertion results are erased before the execution of the next Test Runner. The average assertion record is about 256 bytes. 4,000 assertion results will require about a Megabyte of memory. Detailed results from the last assertion are also available as global variables in the CORE_DATA package.
+Assertions
+The WT_ASSERT package contains the assertion API. There are 10 basic assertions.
+
+- eq
+- isnotnull
+- isnull
+- raises
+- eqqueryvalue
+- eqquery
+- eqtable
+- eqtabcount
+- objexists
+- objnotexists
+
+The WT_ASSERT package includes an internal self-test. The following data types are tested in this self-test.
+
+- varchar2
+- nvarchar2
+- clob
+- nclob
+- number
+- pls_integer
+- boolean
+- date
+- timestamp
+- timestamp with local time zone
+- timestamp with time zone
+- interval day to second
+- interval year to month
+- xmltype
+- long
+- raw
+- long raw
+- blob
+- rowid
+
+Assertion Reporting
+The WT_TEST_REPORT package is provided for reporting assertion results from a Test Runner. The package has several settings to vary the levels of detail. All output goes to DBMS_OUTPUT. See the WT_TEST_REPORT package specification for details.
+Without any add-ons, the Core package automatically writes test results to the DBMS_OUTPUT buffer. This behavior can be changed by modifying the records in the HOOKS table. The Persist add-on removes this behavior during installation.
+Ad-hoc assertions (executed outside a Test Runner) always report results to DBMS_OUTPUT.
+Hooks
+The HOOKS table provides a mechanism for add-ons and customization. The table makes various execution points available via unnamed PL/SQL blocks. The following execution points are available in HOOKS.
+
+- Before test_all
+- Before test_run
+- Execute Test Runner
+- After Assertion
+- After test_run
+- After test_all
+- Ad Hoc Report
+
+Important Note:
+No Test Runner will be executed if there is no "execute_test_runner" hook in the HOOKS table.
+
+
+
+
+
+
+| execute_test_runner |
+begin wt_execute_test_runner; end; |
+
+
+
+See the README.md file in the src/core directory for installation instructions.
+
+Website Home Page
diff --git a/docs/Core-Component.md b/docs/Core-Component.md
new file mode 100644
index 0000000..a4ed65d
--- /dev/null
+++ b/docs/Core-Component.md
@@ -0,0 +1,73 @@
+[Website Home Page](README.md)
+
+# wtPLSQL Core Component
+
+---
+### Overview
+The Core component is built to be very small and very fast. It has 5 packages, 3 tables, 1 view, and 1 procedure. During execution of a Test Runner, it stores all assertion results in memory. It can be run without any add-ons. It is the backbone of the wtPLSQL whitebox testing server.
+
+### Assertion Storage
+The core component stores all assertion results in the CORE_DATA package. Previous assertion results are erased before the execution of the next Test Runner. The average assertion record is about 256 bytes. 4,000 assertion results will require about a Megabyte of memory. Detailed results from the last assertion are also available as global variables in the CORE_DATA package.
+
+### Assertions
+The WT_ASSERT package contains the assertion API. There are 10 basic assertions.
+ * eq
+ * isnotnull
+ * isnull
+ * raises
+ * eqqueryvalue
+ * eqquery
+ * eqtable
+ * eqtabcount
+ * objexists
+ * objnotexists
+
+The WT_ASSERT package includes an internal self-test. The following data types are tested in this self-test.
+ * varchar2
+ * nvarchar2
+ * clob
+ * nclob
+ * number
+ * pls_integer
+ * boolean
+ * date
+ * timestamp
+ * timestamp with local time zone
+ * timestamp with time zone
+ * interval day to second
+ * interval year to month
+ * xmltype
+ * long
+ * raw
+ * long raw
+ * blob
+ * rowid
+
+### Assertion Reporting
+The WT_TEST_REPORT package is provided for reporting assertion results from a Test Runner. The package has several settings to vary the levels of detail. All output goes to DBMS_OUTPUT. See the WT_TEST_REPORT package specification for details.
+
+Without any add-ons, the Core package automatically writes test results to the DBMS_OUTPUT buffer. This behavior can be changed by modifying the records in the HOOKS table. The Persist add-on removes this behavior during installation.
+
+Ad-hoc assertions (executed outside a Test Runner) always report results to DBMS_OUTPUT.
+
+### Hooks
+The HOOKS table provides a mechanism for add-ons and customization. The table makes various execution points available via unnamed PL/SQL blocks. The following execution points are available in HOOKS.
+ * Before test_all
+ * Before test_run
+ * Execute Test Runner
+ * After Assertion
+ * After test_run
+ * After test_all
+ * Ad Hoc Report
+
+### Important Note:
+No Test Runner will be executed if there is no "execute_test_runner" hook in the HOOKS table.
+
+hook_name | run_string
+--------------------|-----------
+execute_test_runner | begin wt_execute_test_runner; end;
+
+See the README.md file in the src/core directory for installation instructions.
+
+---
+[Website Home Page](README.md)
diff --git a/docs/Core-Features.htm b/docs/Core-Features.htm
index 20c044e..ec19562 100644
--- a/docs/Core-Features.htm
+++ b/docs/Core-Features.htm
@@ -10,30 +10,24 @@ Test Anything in the Oracle databa
- Table Constraints and Triggers
- Types and Type Bodies
- Built-in Code Coverage
- The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. An annotation is used to identify the DBOUT in a test runner package. If the DBOUT annotation is missing from a test runner package, no code coverage data is collected. If more than one annotation occurs in a test runner package, the first occurrence in the source code is used.
- Regular Expression:
- --% WTPLSQL SET DBOUT "[[:alnum:]._$#]+" %--
-
- Example:
- --% WTPLSQL SET DBOUT "SCHEMA.TEST_ME" %--
-
- "Ignore" annotations are used to indicate source code lines to ignore when calculating code coverage metrics.
+ Plug-in Code Coverage
+ The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. A global variable "g_DBOUT" in the "wtplsql" package is used to identify the DBOUT. If the not set by the test runner package, no code coverage data is collected. If more than one value of "g_DBOUT" is set by a test runner package, the last setting is used.
+ "Ignore" annotations are used to indicate which source code lines will be ignored when calculating code coverage metrics.
Regular Expression:
--%WTPLSQL_(begin|end)_ignore_lines%--
Example:
--%WTPLSQL_begin_ignore_lines%--
- Occasionally, DBMS_PROFILER does not capture the execution of some PL/SQL source. Examples PL/SQL source that are reported incorrectly include "end if", "select", and "return". wtPLSQL excludes some of these source lines when calculating code coverage metrics. Use the "Ignore" annotations to ignore other lines of PL/SQL when calculating code coverage metrics.
+ Occasionally, DBMS_PROFILER does not capture the execution of some PL/SQL source. Examples PL/SQL source that are reported incorrectly include "end if", "select", and "return". wtPLSQL excludes some of these source lines when calculating code coverage metrics. Use the "Ignore" annotations to ignore other lines of PL/SQL when calculating code coverage metrics.
Built-in Schema-wide Testing
- wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no requirement to pre-define the test runners in a schema.
+ wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no other requirement to predefine test runners in a schema.
Test Result Capture
Test results from assertions executed in a test runner package are automatically captured in WTPLSQL database tables. Results are stored by test runner execution. If specified in the test runner, test results are stored by test case. If a DBOUT is specified in the test runner, code coverage data is also stored. All captured data is automatically deleted except for the last 20 runs of any test runner.
Test Result Reporting
Reporting of the assertion test results is not a included with the execution of the test runner package(s). Some other mechanism, like the reporting package, must be used to display the assertion test results. This allows the following choices during test execution:
-- Run the WT_TEXT_REPORT.DBMS_OUT Report - This is the default Reporting Package to report test results using DBMS_OUTPUT. Several parameter options are available to change level of detail and report sequencing.
+- Run the WT_CORE_REPORT.DBMS_OUT Report - This is the default Reporting Package to report test results using DBMS_OUTPUT. Several parameter options are available to change level of detail and report sequencing.
- Run an Add-On Reporting Package - Bespoke reporting packages can be created or downloaded to provide for the exact requirements of test result reporting.
- Copy Test Results - Create or download bespoke storage and reporting systems that copy the test result data from the WTPLSQL database tables for more complex test result reporting.
- No Action - Test results remain in the WTPLSQL database tables until they are automatically deleted.
@@ -41,17 +35,17 @@ Test Result Reporting
Stand Alone Assertion Execution
In utPLSQL V2, executing an assertion outside of the test execution procedure produced an error message. wtPLSQL allows a single assertion can be executed outside of the WTPLSQL.test_run procedure. The results of the assertion will be output to DBMS_OUTPUT. The result is the same when executing a WTPLSQL_RUN procedure in a test runner package.
Private Procedure Testing within a Package
-One of the difficult parts of testing a package is testing the private "internals" within the package. With wtPLSQL, the test runner procedure (WTPLSQL_RUN) can be included, or embedded, in the package that is being testing. In this way, the test runner has full access to all internal procedures and variables. It also keeps the package and the test together. The test runner can be "hidden" in the production deployment by using the "PLSQL_CCFLAGS" conditional compilation select directives. If the directive is missing, FALSE is assumed:
+One of the difficult parts of testing a package is testing the private "internals" within the package. With wtPLSQL, the test runner procedure (WTPLSQL_RUN) can be included, or embedded, in the package that is being testing. In this way, the test runner has full access to all internal procedures and variables. It also keeps the package and the test together. The test runner can be "hidden" in the production deployment by using the "PLSQL_CCFLAGS" conditional compilation select directives. If the directive is missing, FALSE is assumed:
alter system set PLSQL_CCFLAGS = 'WTPLSQL_ENABLE:TRUE';
Optional Setup and Teardown
- In utPLSQL V2, setup and teardown procedures were required in each test suite. V2 also has a "per method setup" parameter to control startup and teardown timing/sequencing. In wtPSQL, setup and teardown are optional. Setup and teardown are written into a test runner package.
+ In utPLSQL V2, setup and teardown procedures were required in each test suite. V2 also has a "per method setup" parameter to control startup and teardown timing/sequencing. In wtPSQL, setup and teardown are optional. Setup and teardown are written into a test runner package.
Simpler Installation Scripts
In utPLSQL V2, a very sophisticated set of installation scripts are available. The source code for these scripts is very complex. wtPLSQL will use simpler installation scripts for core and option installation. This will require multiple installation steps on the part of the DBA. (Simplicity of coding has priority over convenience of installation)
- In utPLSQL V2, an extensive amount of source code is dedicated to the detection and adaptation of previous releases of Oracle, as far back as Oracle database version 6. In wtPLSQL, the minimum edition of the oldest available Oracle database version is supported. Currently, Oracle XE 11gR2 is the minimum edition of the oldest available Oracle database version. Any testing of features in Oracle database releases beyond Oracle 11g XE will be included in Oracle edition and database version specific "options".
+ In utPLSQL V2, an extensive amount of source code is dedicated to the detection and adaptation of previous releases of Oracle, as far back as Oracle database version 6. In wtPLSQL, the minimum edition of the oldest available Oracle database version is supported. Currently, Oracle XE 11gR2 is the minimum edition of the oldest available Oracle database version. Any testing of features in Oracle database releases beyond Oracle 11g XE will be included in Oracle edition and database version specific "options".
Operation Overview
- When the WTPLSQL.test_run procedure is called, a test runner package name is passed in as a parameter. The "WTPLSQL_RUN" procedure in the test runner package is called with an EXECUTE IMMEDIATE. An exception handler is used in the WTPLSQL package to catch any exceptions raised from a test runner Package. Results from assertions are immediately stored in a Nested Table in the WTPLSQL package. After the test runner completes execution, the results are transferred into database tables.
+ When the WTPLSQL.test_run procedure is called, a test runner package name is passed in as a parameter. The "WTPLSQL_RUN" procedure in the test runner package is called with an EXECUTE IMMEDIATE. An exception handler is used in the WTPLSQL package to catch any exceptions raised from a test runner Package. Results from assertions are immediately stored in a Nested Table in the WTPLSQL package. After the test runner completes execution, the results are transferred into database tables.
The WTPLSQL.test_all procedure will locate all test runner packages (containing the WTPLSQL_RUN procedure) and execute them using the WTPLSQL.test_run procedure.
Website Home Page
diff --git a/docs/Core-Features.md b/docs/Core-Features.md
index 681cb8f..65fe2e0 100644
--- a/docs/Core-Features.md
+++ b/docs/Core-Features.md
@@ -12,18 +12,10 @@ Because the test runner packages are user written, they can be used to test anyt
- Table Constraints and Triggers
- Types and Type Bodies
-## Built-in Code Coverage
-The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. An annotation is used to identify the DBOUT in a test runner package. If the DBOUT annotation is missing from a test runner package, no code coverage data is collected. If more than one annotation occurs in a test runner package, the first occurrence in the source code is used.
+## Plug-in Code Coverage
+The Database Object Under Test, or DBOUT, is a database object that is the target of the test runner package. A global variable "g_DBOUT" in the "wtplsql" package is used to identify the DBOUT. If the not set by the test runner package, no code coverage data is collected. If more than one value of "g_DBOUT" is set by a test runner package, the last setting is used.
-**Regular Expression:**
-```
- --% WTPLSQL SET DBOUT "[[:alnum:]._$#]+" %--
-```
-**Example:**
-```
- --% WTPLSQL SET DBOUT "SCHEMA.TEST_ME" %--
-```
-"Ignore" annotations are used to indicate source code lines to ignore when calculating code coverage metrics.
+"Ignore" annotations are used to indicate which source code lines will be ignored when calculating code coverage metrics.
**Regular Expression:**
```
@@ -36,14 +28,14 @@ The Database Object Under Test, or DBOUT, is a database object that is the targe
Occasionally, DBMS_PROFILER does not capture the execution of some PL/SQL source. Examples PL/SQL source that are reported incorrectly include "end if", "select", and "return". wtPLSQL excludes some of these source lines when calculating code coverage metrics. Use the "Ignore" annotations to ignore other lines of PL/SQL when calculating code coverage metrics.
## Built-in Schema-wide Testing
-wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no requirement to pre-define the test runners in a schema.
+wtPLSQL will locate and execute all test runner packages in a schema. This is done by finding all packages with a WTPLSQL_RUN procedure that has no parameters. There is no other requirement to predefine test runners in a schema.
## Test Result Capture
Test results from assertions executed in a test runner package are automatically captured in WTPLSQL database tables. Results are stored by test runner execution. If specified in the test runner, test results are stored by test case. If a DBOUT is specified in the test runner, code coverage data is also stored. All captured data is automatically deleted except for the last 20 runs of any test runner.
## Test Result Reporting
Reporting of the assertion test results is not a included with the execution of the test runner package(s). Some other mechanism, like the reporting package, must be used to display the assertion test results. This allows the following choices during test execution:
-- **Run the WT_TEXT_REPORT.DBMS_OUT Report** - This is the default Reporting Package to report test results using DBMS_OUTPUT. Several parameter options are available to change level of detail and report sequencing.
+- **Run the WT_CORE_REPORT.DBMS_OUT Report** - This is the default Reporting Package to report test results using DBMS_OUTPUT. Several parameter options are available to change level of detail and report sequencing.
- **Run an Add-On Reporting Package** - Bespoke reporting packages can be created or downloaded to provide for the exact requirements of test result reporting.
- **Copy Test Results** - Create or download bespoke storage and reporting systems that copy the test result data from the WTPLSQL database tables for more complex test result reporting.
- **No Action** - Test results remain in the WTPLSQL database tables until they are automatically deleted.
diff --git a/docs/Definitions.htm b/docs/Definitions.htm
index 10bbb65..63c59fd 100644
--- a/docs/Definitions.htm
+++ b/docs/Definitions.htm
@@ -10,7 +10,7 @@ wtPLSQL Definitions
Setup - Modifying the database or environment in preparation for an assertion, testcase, or group of either.
Teardown - Restoring a database or environment after an assertion, testcase, or group of either.
Testcase - A logical grouping of assertions to run happy path, decision tree, boundary condition, and/or fault insertion tests. May included one or more setup, teardown, and intermediate setups.
- Test Runner - A PL/SQL package that exercises a DBOUT and uses assertions to confirm the correct funcionality of the DBOUT. It may have zero or more testcases. It always contains a call to the WTPLSQL.TEST_RUN procedure. It may contain DBOUT annotations and "ignore source lines" annotations.
+ Test Runner - A PL/SQL package that exercises a DBOUT and uses assertions to confirm the correct funcionality of the DBOUT. It may have zero or more testcases. It always contains a call to the WTPLSQL.TEST_RUN procedure. It may contain DBOUT annotations and "ignore source lines" annotations.
Oracle Database
Note: Some Oracle database terms overlap with Object Oriented terms.
diff --git a/docs/Gui-Add-On.htm b/docs/Gui-Add-On.htm
new file mode 100644
index 0000000..de6576b
--- /dev/null
+++ b/docs/Gui-Add-On.htm
@@ -0,0 +1,8 @@
+ Website Home Page
+ wtPLSQL Graphical User Interface Add-on
+
+ PL/SQL development in the database is different from other
+ All examples shown here use the WTP_DEMO demonstration as described in Demonstrations and Examples Page. Use the "Demo Installer" at the bottom of the page to create a fresh install in a different schema.
+ See the README.md file in the src/core directory for installation instructions.
+
+ Website Home Page
diff --git a/docs/Gui-Add-On.md b/docs/Gui-Add-On.md
new file mode 100644
index 0000000..12d2042
--- /dev/null
+++ b/docs/Gui-Add-On.md
@@ -0,0 +1,14 @@
+[Website Home Page](README.md)
+
+# wtPLSQL Graphical User Interface Add-on
+
+---
+
+PL/SQL development in the database is different from other
+
+All examples shown here use the WTP_DEMO demonstration as described in [Demonstrations and Examples Page](../demo/README.md). Use the "Demo Installer" at the bottom of the page to create a fresh install in a different schema.
+
+See the README.md file in the src/core directory for installation instructions.
+
+---
+[Website Home Page](README.md)
diff --git a/docs/Junit-Add-On.htm b/docs/Junit-Add-On.htm
new file mode 100644
index 0000000..6004e60
--- /dev/null
+++ b/docs/Junit-Add-On.htm
@@ -0,0 +1,6 @@
+ Website Home Page
+ wtPLSQL JUnit Add-on
+
+ See the README.md file in the src/junit directory for installation instructions.
+
+ Website Home Page
diff --git a/docs/Junit-Add-On.md b/docs/Junit-Add-On.md
new file mode 100644
index 0000000..c184abc
--- /dev/null
+++ b/docs/Junit-Add-On.md
@@ -0,0 +1,11 @@
+[Website Home Page](README.md)
+
+# wtPLSQL JUnit Add-on
+
+---
+
+See the README.md file in the src/junit directory for installation instructions.
+
+
+---
+[Website Home Page](README.md)
diff --git a/docs/OO-Style-Unit-Testing.htm b/docs/OO-Style-Unit-Testing.htm
new file mode 100644
index 0000000..000ab3f
--- /dev/null
+++ b/docs/OO-Style-Unit-Testing.htm
@@ -0,0 +1,56 @@
+ Website Home Page
+ OO Style Unit Testing
+
+ The wtPLSQL project focuses on white box testing instead of OO style unit testing. This is done to avoid some aspects of OO style unit testing that are not database friendly:
+
+- Test Isolation
+- Test Transience
+- Test Fixtures
+- Test Suites
+
+ Test Isolation
+ A unit test should usually not go outside of its own class boundary
+ In OO (object oriented) programming, object data is transient. This is due to the nature of object instantiation. Persistence of object data beyond the instance of an object is banished to non-OO components. Since the unit test movement gained its largest following in OO, the idea of testing persisted object data is, unfortunately, a distraction. This has evolved into the idea that testing a database interface should always involve the use of a fake or mock to isolate the unit under test from the influence of these non-OO components.
+ Transactional data (ACID compliance) introduces a complexity to the persistence of object data. Attempting to fake this complexity is very difficult. Particularly difficult is the determination of how much functionality to include in the fake, especially when the storage of the data is the main purpose for the system. Focusing on white box testing, instead of unit testing, allows Test Runners that use the wtPLSQL server to test integrated functionality from other system components.
+ Test Transience
+ A unit test should set up a known good state before the tests and return to the original state after the tests
+ There are many arguments to be made regarding the idea of a known good state in a database. The only sure way to achieve a known good state is to leave the the database unchanged after a unit test. Ideally, changes made by a test process would be transient, that is the process would setup (insert) and tear down (delete) data in the database. However, many Oracle database implementations include additional functionality that can make this difficult.
+
+- Complex data setup
+- Additional processing that is unknown or poorly defined
+- Built-in auditing
+
+ With the wtPLSQL server, Test Runners are allow to perform integration testing of multiple database objects (no mocks or fakes). That is, the Test Runners are not bounded by the transience aspect of unit testing. Artifacts from multiple test runs can remain in the database after the testing is complete. Additionally, artifacts that remain after testing can help identify other problems in the database.
+ Test Fixtures
+ A test fixture ... is the set of preconditions or state needed to run a test
+ An Oracle database loaded with test data is a fixture. In OO terms, it is a persistent store that is pre-loaded with data. If the test data is pre-loaded, there is no need to setup test fixtures. wtPLSQL does not require test fixtures. They are optional.
+ Test Suites
+ A test suite is a set of tests that all share the same fixture.
+ wtPLSQL does not require test suites. If needed, test suites can be defined and implemented in Test Runner packages. The "test_all" functionality of wtPLSQL creates a form of test suite at the database schema level.
+ Testing Methodologies
+ Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes.
+ JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence.
+ The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases.
+ Here are several differences in testing methodologies between relational databases and Object Oriented.
+ Testing Persistence of Data
+
+- Object Oriented - Use fakes or mocks to avoid any data persistence.
+- Relational Database - Testing of data persistence is fundamental.
+
+ Isolation of Tests
+
+- Object Oriented - Use fakes or mocks to avoid any "integration" testing.
+- Relational Database - Isolating PL/SQL code from database CRUD (Create, Retrieve, Update, Delete) defeats the purpose of most PL/SQL testing.
+
+ Test Transience
+
+- Object Oriented - Return object to original state.
+- Relational Database - Integrity constraints on complex persisted data and/or complex data operations make simple test transience more difficult. An alternative is to add new data during each test and/or reset the database to a known test data set before testing.
+
+ Non-Sequenced Testing
+
+- Object Oriented - All unit tests should be able to run in any order.
+- Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing.
+
+
+ Website Home Page
diff --git a/docs/OO-Style-Unit-Testing.md b/docs/OO-Style-Unit-Testing.md
new file mode 100644
index 0000000..d4140f1
--- /dev/null
+++ b/docs/OO-Style-Unit-Testing.md
@@ -0,0 +1,71 @@
+[Website Home Page](README.md)
+
+# OO Style Unit Testing
+
+---
+
+The wtPLSQL project focuses on white box testing instead of OO style unit testing. This is done to avoid some aspects of OO style unit testing that are not database friendly:
+* Test Isolation
+* Test Transience
+* Test Fixtures
+* Test Suites
+
+### Test Isolation
+
+A unit test should [usually not go outside of its own class boundary](https://en.wikipedia.org/wiki/Unit_testing#Description)
+
+In OO (object oriented) programming, object data is transient. This is due to the nature of object instantiation. Persistence of object data beyond the instance of an object is banished to non-OO components. Since the unit test movement gained its largest following in OO, the idea of testing persisted object data is, unfortunately, a distraction. This has evolved into the idea that testing a database interface should always involve the use of a [fake or mock](https://en.wikipedia.org/wiki/Test-driven_development#Fakes.2C_mocks_and_integration_tests) to **isolate** the unit under test from the influence of these non-OO components.
+
+Transactional data (ACID compliance) introduces a complexity to the persistence of object data. Attempting to fake this complexity is very difficult. Particularly difficult is the determination of how much functionality to include in the fake, especially when the storage of the data is the main purpose for the system. Focusing on white box testing, instead of unit testing, allows Test Runners that use the wtPLSQL server to test integrated functionality from other system components.
+
+### Test Transience
+
+A unit test should set up a known good state before the tests and [return to the original state after the tests](https://en.wikipedia.org/wiki/XUnit#Test_fixtures)
+
+There are many arguments to be made regarding the idea of a known good state in a database. The only sure way to achieve a known good state is to leave the the database unchanged after a unit test. Ideally, changes made by a test process would be **transient**, that is the process would setup (insert) and tear down (delete) data in the database. However, many Oracle database implementations include additional functionality that can make this difficult.
+* Complex data setup
+* Additional processing that is unknown or poorly defined
+* Built-in auditing
+
+With the wtPLSQL server, Test Runners are allow to perform integration testing of multiple database objects (no mocks or fakes). That is, the Test Runners are not bounded by the **transience** aspect of unit testing. Artifacts from multiple test runs can remain in the database after the testing is complete. Additionally, artifacts that remain after testing can help identify other problems in the database.
+
+### Test Fixtures
+
+[A test fixture ... is the set of preconditions or state needed to run a test](https://en.wikipedia.org/wiki/XUnit#Test_fixtures)
+
+An Oracle database loaded with test data is a fixture. In OO terms, it is a persistent store that is pre-loaded with data. If the test data is pre-loaded, there is no need to setup test fixtures. wtPLSQL does not require test fixtures. They are optional.
+
+### Test Suites
+
+[A test suite is a set of tests that all share the same fixture.](https://en.wikipedia.org/wiki/XUnit#Test_suites)
+
+wtPLSQL does not require test suites. If needed, test suites can be defined and implemented in Test Runner packages. The "test_all" functionality of wtPLSQL creates a form of test suite at the database schema level.
+
+## Testing Methodologies
+
+Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes.
+
+JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence.
+
+The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases.
+
+Here are several differences in testing methodologies between relational databases and Object Oriented.
+
+### Testing Persistence of Data
+* Object Oriented - Use fakes or mocks to avoid any data persistence.
+* Relational Database - Testing of data persistence is fundamental.
+
+### Isolation of Tests
+* Object Oriented - Use fakes or mocks to avoid any "integration" testing.
+* Relational Database - Isolating PL/SQL code from database CRUD (Create, Retrieve, Update, Delete) defeats the purpose of most PL/SQL testing.
+
+### Test Transience
+* Object Oriented - Return object to original state.
+* Relational Database - Integrity constraints on complex persisted data and/or complex data operations make simple test transience more difficult. An alternative is to add new data during each test and/or reset the database to a known test data set before testing.
+
+### Non-Sequenced Testing
+* Object Oriented - All unit tests should be able to run in any order.
+* Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing.
+
+---
+[Website Home Page](README.md)
diff --git a/docs/Persist-Add-On.htm b/docs/Persist-Add-On.htm
new file mode 100644
index 0000000..dc3c5f4
--- /dev/null
+++ b/docs/Persist-Add-On.htm
@@ -0,0 +1,8 @@
+ Website Home Page
+ wtPLSQL Core Component
+
+ Must install core first.
+ See the README.md file in the src/core directory for installation instructions.
+ Doubles the memory usage of core (1 Mb) by duplicating all results in memory before inserting to tables.
+
+ Website Home Page
diff --git a/docs/Persist-Add-On.md b/docs/Persist-Add-On.md
new file mode 100644
index 0000000..2c58c8a
--- /dev/null
+++ b/docs/Persist-Add-On.md
@@ -0,0 +1,13 @@
+[Website Home Page](README.md)
+
+# wtPLSQL Core Component
+
+---
+Must install core first.
+
+See the README.md file in the src/core directory for installation instructions.
+
+Doubles the memory usage of core (1 Mb) by duplicating all results in memory before inserting to tables.
+
+---
+[Website Home Page](README.md)
diff --git a/docs/README.htm b/docs/README.htm
index 4ee7d2b..e800388 100644
--- a/docs/README.htm
+++ b/docs/README.htm
@@ -1,61 +1,178 @@
wtPLSQL Home Page
- To install/upgrade, download the latest Release
- Also see the compatibility page in the wtPLSQL repository wiki.
- Use GitHub "issues" for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account.
- Example wtPLSQL Test Results
- This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create.
- wtPLSQL 1.1.0 - Run ID 7: 09-Jun-2018 11:48:42 AM
+Click here for the latest release on GitHub.
+Click here for the compatibility wiki page on GitHub.
+Use GitHub "issues" for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account.
+Overview
+wtPLSQL is a test automation server that runs in an Oracle database to provide the following services for Test Runner packages written in PL/SQL.
+
+- Execution of One or More Test Runners
+- Assertion Results including Timing Between Assertions
+- Capture/Storage/Reporting of Assertion Results
+- Source Code Coverage of Test Runner
+- Web Based Graphical User Interface (APEX)
+
+Core Component Example Test Results
+Here is an example result summary from the core component. Only core is needed to produce this result.
+
- Test Results for WTP.WT_ASSERT
- Total Testcases: 150 Total Assertions: 404
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 7 Error Assertions: 0
- Maximum Interval msec: 761 Test Yield: 100.00%
- Total Run Time (sec): 2.8
+To view the complete test results from the wtPLSQL core self-test, go to the "src/core/test_allO.LST" file in GitHub.
+Persist Add-on Example Test Results
+Here is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage are stored in Oracle tables, other report formats are simple to create.
+
- Code Coverage for PACKAGE BODY WTP.WT_ASSERT
- Ignored Lines: 1103 Total Profiled Lines: 1464
- Excluded Lines: 6 Total Executed Lines: 309
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 394 Unknown Lines: 46
- Maximum LineExec usec: 65814 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- To view the complete test results from the wtPLSQL self-test, go to the test_allO.LST file in GitHub. The Demonstrations and Examples Page has more examples.
- What is wtPLSQL?
- wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize.
- Like utPLSQL, wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included. The Core Features page introduces the main functionality of wtPLSQL.
- A simple text based reporting package called "WT_TEXT_REPORT" is included with the core installation. Custom reports are easy to create because the assertion outcomes and interval time between assertions are stored in the Oracle database. A set of DBDocs and E-R diagrams are provided to assist with any reporting customization.
- Because all testing with wtPLSQL is for driven by custom PL/SQL packages, a Best Practices page has some guidance for creating test runner packages.
- The About wtPLSQL page has more information about the history and testing methodology of wtPLSQL.
- The Definitions page includes definitions from many sources to help define the terms used in various software testing methodologies.
- How does wtPLSQL compare to utPLSQL V3?
- utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality.
- wtPLSQL has a different focus than utPLSQL V3. More information is available in this link.
- How does wtPLSQL compare to utPLSQL V1 or utPLSQL V2?
- utPLSQL V2 is an extension of utPLSQL V1. Since utPSQL V2 is being replaced by utPLSQL V3, neither utPLSQL V2 or utPLSQL V1 are good choices for starting a new software testing implementation.
- The goal of wtPLSQL has been to implement the basic/core functionality of utPLSQL V2 while preserving the the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core will be added through optionally installed modules (also known as add-ons).
- More information is available in this link.
- Site Links
- User Help
+ To view the complete test results from the wtPLSQL persist self-test, go to the "src/persist/test_allO.LST" file in GitHub.
+ GUI Add-on Example Test Results
+ The GUI module uses the Oracle APEX to enhance the UI experience. Many useful reports are available with the GUI module. This is an example of ???
+ 
+
+ General Documentation
- Background
+
+
+
+
+
+
+| core |
+Required for all wtPLSQL functionality. Small, fast, and maintenance free. |
+
+
+| conversion |
+Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL |
+
+
+
+
+
+
+
+
+
+
+
+| persist |
+Adds storage in tables. Adds code coverage. |
+
+
+| gui |
+Adds Oracle APEX screens and reports. Requires persist add-on. |
+
+
+| junit |
+Adds JUnit XML reporting. |
+
+
+
+
+
+
+ To determine which components and add-ons have been installed, run this query:
+ select wtplsql.show_version from dual;
+
Contribute
Help us improve by joining us at the wtPLSQL repository.
+ The web pages in this website contain information about the wtPLSQL software. Documentation on design and usage are included here. This website is version specific. Each release includes its own version of this website. The "master" branch (latest release) is always displayed at Github.io. Un-released updates are not displayed here.
+ For project information, see the wtPLSQL wiki. Documentation on procedures and compatibility are included in the wiki. The wiki includes information for all releases of wtPLSQL. Any updates are immediately displayed.
+
+ The following applies to files and directories at this location in the documentation repository.
+ Files and Directories
+
+
+
+
+
+
+| core |
+Core Documentation Directory |
+
+
+| demo |
+Demonstration Documentation Directory |
+
+
+| gui |
+Graphical User Interface Documentation |
+
+
+| images |
+Image Files referenced by MD and HTML |
+
+
+| persist |
+Persist Documentation Directory |
+
+
+| _config.yml |
+YAML Configuration File for Markdown |
+
+
+| *.md |
+Markdown files for "github.io" |
+
+
+| *.htm |
+HTML files for local documentation |
+
+
+| md-to-htm.bat |
+MS-Dos Batch File to convert MD to HTML |
+
+
+| md-to-htm.lua |
+Lua script used by Pandoc for MD to HTML |
+
+
+
+ To view documentation use the URL "file://README.htm" or Double-click on the README.htm file.
+ NOTE: All HTML files are sourced from Markdown files. Modify the Markdown files, then build HTML from the Markdown files using "md-to-htm.bat".
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
diff --git a/docs/README.md b/docs/README.md
index 8868366..2a33143 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,86 +1,119 @@
# wtPLSQL Home Page
---
-To install/upgrade, download the [latest Release](https://github.com/DDieterich/wtPLSQL/releases)
+[Click here](https://github.com/DDieterich/wtPLSQL/releases/latest) for the latest release on GitHub.
-Also see the [compatibility page](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) in the wtPLSQL repository wiki.
+[Click here](https://github.com/DDieterich/wtPLSQL/wiki/Compatibility) for the compatibility wiki page on GitHub.
Use [GitHub "issues"](https://github.com/DDieterich/wtPLSQL/issues) for support. A (free) GitHub account will be required to create a new issue. Issues can be searched without an account.
-## Example wtPLSQL Test Results
+### Overview
-This is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage is stored in Oracle tables, other report formats are simple to create.
+wtPLSQL is a test automation server that runs in an Oracle database to provide the following services for Test Runner packages written in PL/SQL.
+* Execution of One or More Test Runners
+* Assertion Results including Timing Between Assertions
+* Capture/Storage/Reporting of Assertion Results
+* Source Code Coverage of Test Runner
+* Web Based Graphical User Interface (APEX)
-```
- wtPLSQL 1.1.0 - Run ID 7: 09-Jun-2018 11:48:42 AM
-
- Test Results for WTP.WT_ASSERT
- Total Testcases: 150 Total Assertions: 404
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 7 Error Assertions: 0
- Maximum Interval msec: 761 Test Yield: 100.00%
- Total Run Time (sec): 2.8
-
- Code Coverage for PACKAGE BODY WTP.WT_ASSERT
- Ignored Lines: 1103 Total Profiled Lines: 1464
- Excluded Lines: 6 Total Executed Lines: 309
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 394 Unknown Lines: 46
- Maximum LineExec usec: 65814 Code Coverage: 100.00%
- Trigger Source Offset: 0
-```
+### Core Component Example Test Results
-To view the complete test results from the wtPLSQL self-test, go to the [test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST) file in GitHub. The [Demonstrations and Examples Page](demo/README.md) has more examples.
+Here is an example result summary from the core component. Only core is needed to produce this result.
-## What is wtPLSQL?
+ 
-wtPLSQL helps with white-box testing of Oracle database objects. It is particularly well suited for unit testing and simple integration testing. It is written in PL/SQL. It contains a self-test which makes it easier to support and customize.
+To view the complete test results from the wtPLSQL core self-test, go to the "[src/core/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/core/test_allO.LST)" file in GitHub.
-Like utPLSQL, wtPLSQL provides a set of assertion tests that can be used to determine how well an Oracle database object is performing. These assertions record the outcome (success or failure) of each test. These assertions also record the time between calls. A test runner (PL/SQL package) must be created with these assertion tests included. The [Core Features page](Core-Features.md) introduces the main functionality of wtPLSQL.
+### Persist Add-on Example Test Results
-A simple text based reporting package called "WT_TEXT_REPORT" is included with the core installation. Custom reports are easy to create because the assertion outcomes and interval time between assertions are stored in the Oracle database. A set of DBDocs and E-R diagrams are provided to assist with any reporting customization.
+Here is the summary from the WT_ASSERT package self-test. It was created with the default DBMS_OUTPUT reporting package. Because test results and code coverage are stored in Oracle tables, other report formats are simple to create.
-Because all testing with wtPLSQL is for driven by custom PL/SQL packages, a [Best Practices page](Best-Practices.md) has some guidance for creating test runner packages.
+ 
-The [About wtPLSQL page](About-wtPLSQL.md) has more information about the history and testing methodology of wtPLSQL.
+To view the complete test results from the wtPLSQL persist self-test, go to the "[src/persist/test_allO.LST](https://github.com/DDieterich/wtPLSQL/blob/master/src/persist/test_allO.LST)" file in GitHub.
-The [Definitions page](Definitions.md) includes definitions from many sources to help define the terms used in various software testing methodologies.
+### GUI Add-on Example Test Results
-## How does wtPLSQL compare to utPLSQL V3?
+The GUI module uses the Oracle APEX to enhance the UI experience. Many useful reports are available with the GUI module. This is an example of ???
-utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality.
+ 
-wtPLSQL has a different focus than utPLSQL V3. More information is available [in this link](utPLSQL-V3-Comparison.md).
+### General Documentation
-## How does wtPLSQL compare to utPLSQL V1 or utPLSQL V2?
+* [About wtPLSQL](About-wtPLSQL.md)
+* [Examples and Documentation](demo/README.md)
+* [Definitions](Definitions.md)
+* [Best Practices](Best-Practices.md)
+* [Reference](Reference.md)
+* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md)
+* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md)
+* [OO Style Unit Testing is not for Databases](OO-Style-Unit-Testing.md)
-utPLSQL V2 is an extension of utPLSQL V1. Since utPSQL V2 is being replaced by utPLSQL V3, neither utPLSQL V2 or utPLSQL V1 are good choices for starting a new software testing implementation.
+Component | Description
+--------------------------------------|------------
+[core](core-component.md) | Required for all wtPLSQL functionality. Small, fast, and maintenance free.
+[conversion](conversion-component.md) | Convert Test Runner packages from utPLSQL V1/V2 to wtPLSQL
-The goal of wtPLSQL has been to implement the basic/core functionality of utPLSQL V2 while preserving the the programming investment in the assertion API (utAssert.eq, utAssert.isnotnull, etc.). The additional functionality of utPLSQL V2 that is not included in the wtPLSQL core will be added through optionally installed modules (also known as add-ons).
+
-More information is available [in this link](utPLSQL-V2-Comparison.md).
+Add-on | Description
+-----------------------------|------------
+[persist](persist-add-on.md) | Adds storage in tables. Adds code coverage.
+[gui](gui-add-on.md) | Adds Oracle APEX screens and reports. Requires persist add-on.
+[junit](junit-add-on.md) | Adds JUnit XML reporting.
-### Site Links
+
-User Help
-* [Demonstrations and Examples Page](demo/README.md)
-* [Reference](Reference.md)
-* [Best Practices](Best-Practices.md)
-* [DB Docs from SQL*Developer](core/DBDocs/index.html)
-* [ER Diagram PDF](core/ER_Diagrams.pdf)
-* [Call Tree Diagrams PDF](core/Call_Tree_Diagrams.pdf)
+DB Docs | E-R Diagrams | Call Tree Diags
+------------------------------------------|-----------------------------------------|----------------
+[core docs](core/DBDocs/index.html) | [core ERDs](core/ER_Diagrams.pdf) | [core trees](core/Call_Tree_Diagrams.pdf)
+[persist docs](persist/DBDocs/index.html) | [persist ERDs](persist/ER_Diagrams.pdf) | [persist trees](persist/Call_Tree_Diagrams.pdf)
+[gui docs](gui/DBDocs/index.html) | [gui ERDs](gui/ER_Diagrams.pdf) | [gui trees](gui/Call_Tree_Diagrams.pdf)
-Background
-* [Definitions](Definitions.md)
-* [About wtPLSQL](About-wtPLSQL.md)
-* [Core Features](Core-Features.md)
-* [utPLSQL V3 Comparison](utPLSQL-V3-Comparison.md)
-* [utPLSQL V1/V2 Comparison](utPLSQL-V2-Comparison.md)
+* **DB Docs** has web pages similar to JavaDocs created by Oracle's SQL*Developer.
+* **E-R Diagrams** show relationships between tables (entities).
+* **Call Tree Diagrams** show the PL/SQL programs, tables, and common (global) memory structures called by all PL/SQL programs.
+
+To determine which components and add-ons have been installed, run this query:
+
+```
+select wtplsql.show_version from dual;
+```
## Contribute
Help us improve by joining us at the [wtPLSQL repository](https://github.com/DDieterich/wtPLSQL).
+The web pages in this website contain information about the wtPLSQL software. Documentation on design and usage are included here. This website is version specific. Each release includes its own version of this website. The "master" branch (latest release) is always displayed at Github.io. Un-released updates are not displayed here.
+
+For project information, see the [wtPLSQL wiki](https://github.com/DDieterich/wtPLSQL/wiki). Documentation on procedures and compatibility are included in the wiki. The wiki includes information for all releases of wtPLSQL. Any updates are immediately displayed.
+
+
+---
+
+*The following applies to files and directories at this location in the documentation repository.*
+
+### Files and Directories
+
+File Name | Description
+--------------|------------
+core | Core Documentation Directory
+demo | Demonstration Documentation Directory
+gui | Graphical User Interface Documentation
+images | Image Files referenced by MD and HTML
+persist | Persist Documentation Directory
+_config.yml | YAML Configuration File for Markdown
+*.md | Markdown files for "github.io"
+*.htm | HTML files for local documentation
+md-to-htm.bat | MS-Dos Batch File to convert MD to HTML
+md-to-htm.lua | Lua script used by Pandoc for MD to HTML
+
+To view documentation use the URL "file://README.htm" or Double-click on the README.htm file.
+
+NOTE: All HTML files are sourced from Markdown files.
+ Modify the Markdown files, then build HTML from the
+ Markdown files using "md-to-htm.bat".
+
---
_Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._
diff --git a/docs/README.txt b/docs/README.txt
deleted file mode 100644
index ef58485..0000000
--- a/docs/README.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-
-Files and Directories
----------------------
-
-File Name Description
------------ ------------
-Core Core Documentation
-Demo Demonstration Documentation
-README.md README Markdown file for "github.io"
-_config.yml YAML Configuration File for this Website
-
-
-Local Documentation URL
------------------------
-file://README.htm
-(Double-click on the README.htm file)
diff --git a/docs/README_leap-day.htm b/docs/README_leap-day.htm
new file mode 100644
index 0000000..7156575
--- /dev/null
+++ b/docs/README_leap-day.htm
@@ -0,0 +1,75 @@
+ The Leap day theme
+ 
+ Leap day is a Jekyll theme for GitHub Pages. You can preview the theme to see what it looks like, or even use it today.
+ 
+ Usage
+ To use the Leap day theme:
+
+Add the following to your site's _config.yml:
+remote_theme: pages-themes/leap-day@v0.2.0
+plugins:
+- jekyll-remote-theme # add this line to the plugins list if you already have one
+Optionally, if you'd like to preview your site on your computer, add the following to your site's Gemfile:
+gem "github-pages", group: :jekyll_plugins
+
+ Customizing
+ Configuration variables
+ Leap day will respect the following variables, if set in your site's _config.yml:
+ title: [The title of your site]
+description: [A short description of your site's purpose]
+ Additionally, you may choose to set the following optional variables:
+ show_downloads: ["true" or "false" (unquoted) to indicate whether to provide a download URL]
+google_analytics: [Your Google Analytics tracking ID]
+ Stylesheet
+ If you'd like to add your own custom styles:
+
+- Create a file called
/assets/css/style.scss in your site
+- Add the following content to the top of the file, exactly as shown:
+
---
+---
+
+@import "{{ site.theme }}";
+
+- Add any custom CSS (or Sass, including imports) you'd like immediately after the
@import line
+
+ Note: If you'd like to change the theme's Sass variables, you must set new values before the @import line in your stylesheet.
+ Layouts
+ If you'd like to change the theme's HTML layout:
+
+- For some changes such as a custom
favicon, you can add custom files in your local _includes folder. The files provided with the theme provide a starting point and are included by the original layout template.
+- For more extensive changes, copy the original template from the theme's repository
(Pro-tip: click "raw" to make copying easier)
+- Create a file called
/_layouts/default.html in your site
+- Paste the default layout content copied in the first step
+- Customize the layout as you'd like
+
+ Customizing Google Analytics code
+ Google has released several iterations to their Google Analytics code over the years since this theme was first created. If you would like to take advantage of the latest code, paste it into _includes/head-custom-google-analytics.html in your Jekyll site.
+ Overriding GitHub-generated URLs
+ Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs:
+
+- Look at the template source to determine the name of the variable. It will be in the form of
{{ site.github.zip_url }}.
+- Specify the URL that you'd like the template to use in your site's
_config.yml. For example, if the variable was site.github.url, you'd add the following:
+github:
+ zip_url: http://example.com/download.zip
+ another_url: another value
+- When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub.
+
+ Note: You must remove the site. prefix, and each variable name (after the github.) should be indent with two space below github:.
+ For more information, see the Jekyll variables documentation.
+ Roadmap
+ See the open issues for a list of proposed features (and known issues).
+ Project philosophy
+ The Leap day theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying.
+ Contributing
+ Interested in contributing to Leap day? We'd love your help. Leap day is an open source project, built one contribution at a time by users like you. See the CONTRIBUTING file for instructions on how to contribute.
+ Previewing the theme locally
+ If you'd like to preview the theme locally (for example, in the process of proposing a change):
+
+- Clone down the theme's repository (
git clone https://github.com/pages-themes/leap-day)
+cd into the theme's directory
+- Run
script/bootstrap to install the necessary dependencies
+- Run
bundle exec jekyll serve to start the preview server
+- Visit
localhost:4000 in your browser to preview the theme
+
+ Running tests
+ The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run script/cibuild. You'll need to run script/bootstrap once before the test script will work.
diff --git a/docs/Reference.htm b/docs/Reference.htm
index b495ed6..551799d 100644
--- a/docs/Reference.htm
+++ b/docs/Reference.htm
@@ -2,7 +2,7 @@
Reference
Datatypes Supported
- Oracle Data Type Families https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/predefined.htm#LNPLS2047
+ Oracle Data Type Families https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/predefined.htm#LNPLS2047
- VARCHAR2 - Includes ROWID, LONG*, RAW, LONG RAW*, and NVARCHAR2
- DATE** - Includes TIMESTAMP and INTERVAL
@@ -12,23 +12,44 @@ Datatypes Supported
- CLOB - Includes NCLOB
- BLOB
- *LONG and LONG RAW data length is limited to VARCHAR2 length in PL/SQL (32K). **VARCHAR2 includes DATE and NUMBER using Implicit Data Conversions: https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm#i163326
+ *LONG and LONG RAW data length is limited to VARCHAR2 length in PL/SQL (32K). **VARCHAR2 includes DATE and NUMBER using Implicit Data Conversions: https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm#i163326
Many data types are converted to VARCHAR2 before comparison. This ensures most results are captured and reported exactly as they were tested.
- There is a balance to strike between simplicity and localization. Many data types must be converted to "strings" before display. Converting a data type at the time it is displayed can lead to confusing results. Since each assertion includes the capture of the values that were compared, the values that are captured are the actual values tested.
+ There is a balance to strike between simplicity and localization. Many data types must be converted to "strings" before display. Converting a data type at the time it is displayed can lead to confusing results. Since each assertion includes the capture of the values that were compared, the values that are captured are the actual values tested.
An obvious drawback of this approach is running assertions when NLS settings must be set to something other than the setting that is needed for comparison. In this case, an explicit conversion can be made in the Test Runnner using the needed format.
- Custom Error Codes
+ Core Error Codes
- ORA-20001 - WTPLSQL Package: RUNNER_NAME is NULL
- ORA-20002 - WTPLSQL Package: RUNNER_NAME (name) is not valid
-- ORA-20003 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE)
-- ORA-20004 - WT_PROFILER Package: in_test_run_id is NULL
-- ORA-20005 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error)
-- ORA-20006 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error)
-- ORA-20009 - WT_RESULT Package: "in_test_run_id" cannot be NULL
-- ORA-20010 - WT_TEST_RUN_STAT Package: Unknown Result status
-- ORA-20011 - WT_TEST_RUN_STAT Package: Unknown Profile status
+- ORA-20003 - HOOK Package: Unknown HOOK_NAME Case
+- ORA-20004 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE)
- WT_TEXT_REPORT Detail Levels
+ Persist Error Codes
+
+- ORA-20009 ORA-20011 - WT_RESULT Package: "in_test_run_id" cannot be NULL
+- ORA-20004 ORA-20012 - WT_PROFILER Package: in_test_run_id is NULL
+- ORA-20005 ORA-20013 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error)
+- ORA-20006 ORA-20014 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error)
+- ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status
+- ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status
+
+ WT_CORE_REPORT Detail Levels
+
+- Less than 10 (including null) - No Detail
+
+- Assertion results summary.
+
+- 10 to 19 - Minimal Detail
+
+- Assertion results summary.
+- Failed assertion result details.
+
+- 20 or more - Full Detail
+
+- Assertion results summary.
+- All assertion result details.
+
+
+ WT_PERSIST_REPORT Detail Levels
- Less than 10 (including null) - No Detail
@@ -40,14 +61,14 @@ WT_TEXT_REPORT Detail Levels
- Assertion results summary.
- Profiled lines summary.
- Failed assertion result details.
-- Profiled source lines that were "not executed".
+- Profiled source lines that were "not executed".
- 20 to 29 - Partial Full Detail
- Assertion results summary.
- Profiled lines summary.
- All assertion result details.
-- Profiled source lines that were "not executed".
+- Profiled source lines that were "not executed".
- 30 or more - Full Detail
diff --git a/docs/Reference.md b/docs/Reference.md
index 92c2f27..4ad08da 100644
--- a/docs/Reference.md
+++ b/docs/Reference.md
@@ -25,18 +25,31 @@ There is a balance to strike between simplicity and localization. Many data type
An obvious drawback of this approach is running assertions when NLS settings must be set to something other than the setting that is needed for comparison. In this case, an explicit conversion can be made in the Test Runnner using the needed format.
-## Custom Error Codes
+## Core Error Codes
* ORA-20001 - WTPLSQL Package: RUNNER_NAME is NULL
* ORA-20002 - WTPLSQL Package: RUNNER_NAME (name) is not valid
-* ORA-20003 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE)
-* ORA-20004 - WT_PROFILER Package: in_test_run_id is NULL
-* ORA-20005 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error)
-* ORA-20006 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error)
-* ORA-20009 - WT_RESULT Package: "in_test_run_id" cannot be NULL
-* ORA-20010 - WT_TEST_RUN_STAT Package: Unknown Result status
-* ORA-20011 - WT_TEST_RUN_STAT Package: Unknown Profile status
-
-## WT_TEXT_REPORT Detail Levels
+* ORA-20003 - HOOK Package: Unknown HOOK_NAME Case
+* ORA-20004 - WT_ASSERT Package: User Test Result is FAIL (g_raise_exception is TRUE)
+
+## Persist Error Codes
+* ORA-20009 ORA-20011 - WT_RESULT Package: "in_test_run_id" cannot be NULL
+* ORA-20004 ORA-20012 - WT_PROFILER Package: in_test_run_id is NULL
+* ORA-20005 ORA-20013 - WT_PROFILER Package: dbms_profiler.INTERNAL_VERSION_CHECK returned (error)
+* ORA-20006 ORA-20014 - WT_PROFILER Package: dbms_profiler.START_PROFILER returned (error)
+* ORA-20010 ORA-20015 - WT_TEST_RUN_STAT Package: Unknown Result status
+* ORA-20011 ORA-20016 - WT_TEST_RUN_STAT Package: Unknown Profile status
+
+## WT_CORE_REPORT Detail Levels
+* **Less than 10 (including null)** - No Detail
+ * Assertion results summary.
+* **10 to 19** - Minimal Detail
+ * Assertion results summary.
+ * Failed assertion result details.
+* **20 or more** - Full Detail
+ * Assertion results summary.
+ * All assertion result details.
+
+## WT_PERSIST_REPORT Detail Levels
* **Less than 10 (including null)** - No Detail
* Assertion results summary.
* Profiled lines summary.
diff --git a/docs/_includes/head-custom-google-analytics.html b/docs/_includes/head-custom-google-analytics.html
index 8a63a63..f148ccc 100644
--- a/docs/_includes/head-custom-google-analytics.html
+++ b/docs/_includes/head-custom-google-analytics.html
@@ -17,4 +17,4 @@
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-G8YBMHE7X2');
-
\ No newline at end of file
+
diff --git a/docs/another-page_leap-day.htm b/docs/another-page_leap-day.htm
new file mode 100644
index 0000000..9f07e7f
--- /dev/null
+++ b/docs/another-page_leap-day.htm
@@ -0,0 +1,5 @@
+
+layout: default
+Welcome to another page
+yay
+back
diff --git a/docs/core/Call_Tree_Diagrams.odg b/docs/core/Call_Tree_Diagrams.odg
deleted file mode 100644
index 8da6676..0000000
Binary files a/docs/core/Call_Tree_Diagrams.odg and /dev/null differ
diff --git a/docs/core/Call_Tree_Diagrams.pdf b/docs/core/Call_Tree_Diagrams.pdf
deleted file mode 100644
index f3ebd38..0000000
Binary files a/docs/core/Call_Tree_Diagrams.pdf and /dev/null differ
diff --git a/docs/core/DBDocs/dbdoc.css b/docs/core/DBDocs/dbdoc.css
deleted file mode 100644
index d3a861e..0000000
--- a/docs/core/DBDocs/dbdoc.css
+++ /dev/null
@@ -1,151 +0,0 @@
-img {
- border: 0;
-}
-
-* {
- font-size: 9pt;
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
- margin: 5px;
-}
-
-#top_left, #bottom_left {
- margin: 0px;
-}
-
-td, body, p, div, span {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
- font-size: 9pt;
- color: #000;
-}
-
-a:link, a:visited {
- color: #2B7C92;
- text-decoration: underline;
-}
-
-a:active, a:hover {
- color: red;
-}
-
-td {
- empty-cells: show;
- border-collapse: collapse;
-}
-
-iframe {
- border: 1px solid black;
-}
-
-br {
- clear: both !important;
-}
-
-.clearfix:after {
- content: ".";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
-}
-/* Hides from IE-mac \*/
-* html .clearfix {
- height: 1%;
-}
-/* End hide from IE-mac */
-table {
- border-spacing: 0;
- empty-cells: show;
-}
-
-table th {
- color: #2b7c92 !important;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1 !important;
- background-image: none !important;
- color: #2b7c92 !important;
- font-size: 11px;
- letter-spacing: 1;
- text-decoration: underline;
- cursor: pointer;
-}
-
-table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- empty-cells: show;
- background-color: #f2f2f5 !important
-}
-
-#bottom_left h2 {
- text-align: center;
- padding: 4px 0;
- background: #CFE0F1;
- color: #2B7C92;
- font-size: 1.2em;
-}
-
-#top_left h2 {
- text-align: center;
- padding: 4px 0;
- background: #CFE0F1;
- color: #2B7C92;
- font-size: 1.2em;
-}
-
-#top_left a, #bottom_left a {
- display: block;
- font-size: 8pt;
- padding: 2px 8px;
-}
-
-#top_left a:hover, #bottom_left a:hover, #top_left .current, #bottom_left .current {
- background: #CFE0F1;
- color: #2B7C92;
-}
-
-#header {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-body.object {
- margin: 0;
-}
-
-body.object h2 {
- color: #fff;
- font-size: 2em;
-}
-
-#loading {
- text-align: center;
-}
-
-#search {
- line-height: 25px;
- vertical-align: middle;
- background-position: center center;
- background-image: url('round_text.png');
- height: 25px;
- background-repeat: no-repeat;
- vertical-align: center;
-}
-
-#search input {
- line-height: 25px;
- vertical-align: middle;
- border: none;
- height: 22px;
- margin: 2px;
-}
\ No newline at end of file
diff --git a/docs/core/DBDocs/dbdoc.js b/docs/core/DBDocs/dbdoc.js
deleted file mode 100644
index 5f49736..0000000
--- a/docs/core/DBDocs/dbdoc.js
+++ /dev/null
@@ -1,409 +0,0 @@
-function $x(pNd){
- var lThis;
- switch(typeof (pNd)){
- case 'string':lThis = document.getElementById(pNd);break;
- case 'object':lThis = pNd;break;
- default:return false;break;
- }
- return (lThis.nodeType == 1)?lThis:false;
-}
-
-function $u_Narray(pNd){return (pNd.length == 1)?pNd[0]:pNd;}
-function $u_Carray(pNd){return ($x(pNd))?[pNd]:pNd;}
-
-function $x_Class(pNd,pClass){
- if($x(pNd)){pNd = [pNd];}
- var l=pNd.length;
- for(var i=0;i 2) ? argv[2] : null;
- var path = (argc > 3) ? argv[3] : null;
- var domain = (argc > 4) ? argv[4] : null;
- var secure = (argc > 5) ? true : false;
- document.cookie = pName + "=" + escape (pValue) +
- ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) +
- ((path === null) ? "" : ("; path=" + path)) +
- ((domain === null) ? "" : ("; domain=" + domain)) +
- ((secure === true) ? "; secure" : "");
-}
-
-
-
-function $h(pThis,pThat){
- $x('current').id = '';
- pThis.parentNode.parentNode.id = 'current';
- $d_TabClick(pThis,pThat);
- SetCookie ('dbdoc_tab',pThis.id+':'+pThat);
-}
-
-function $init(pThis,pThat){
- var lCook = GetCookie ('dbdoc_tab',pThis.id);
- if(!!lCook){
- var lArray = lCook.split(":");
- if($x(lArray[0])){$h($x(lArray[0]),lArray[1]);}
- else{$h($x(pThis),pThat);}
- }else{
- $h($x(pThis),pThat);
- }
- $x_Hide('loading');
- $x_Show('tab-panes');
-}
-
-function html_GetTarget(e){
- var targ,lEvt;
- if(!e){e = window.event;}
- if(e.target){targ = e.target;}
- else if(e.srcElement){targ = e.srcElement;}
- if(targ.nodeType == 3){targ = targ.parentNode;}// defeat Safari bug
- return targ;
-}
-
-function $d(pThis){
- $x_SetSiblingsClass($x(pThis),'','current');
- parent.ObjectDetailsFrame.location = pThis +'_details.html';
-}
-
-function $n(pThis){
- $x_SetSiblingsClass($x(pThis),'','current');
- parent.ObjectDetailsFrame.location = 'about:blank';
- parent.DBObjectsFrame.location = pThis +'/index.html';
-}
-
-var gRegex=false;
-function $d_Find(pThis,pString,pTags,pClass){
- if(!pTags){pTags = 'DIV';}
- pThis = $x(pThis);
- if(pThis){
- var d=pThis.getElementsByTagName(pTags);
- pThis.style.display="none";
- if(!gRegex){gRegex =new RegExp("test");}
- gRegex.compile(pString,"i");
- for(var i=0,len=d.length ;i 0 &&
- (elementClassName == className ||
- new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)
- ));
-}
-
-function addClassName(element, className) {
- if (!hasClassName(element, className)) {
- element.className += (element.className ? ' ' : '') + className;
- }
- return element;
-}
-
-function removeClassName(element, className) {
- if (hasClassName(element, className)) {
- // Replace className and surrounding whitespace to single space
- // Then remove leading and trailing whitespace
- element.className = element.className.replace(
- new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').replace(/^\s+/, '').replace(/\s+$/, '')
- }
- return element;
-}
-
-function toggleBranch(anEvent) {
- var branch, subBranches;
- branch = getEventTarget(anEvent);
- // If user clicks in area to left of tree (background UL area),
- // we don't want to do anything
- // FIXME: BUT what about clicking to left of sub list & target
- // being parent LI
- if ("UL" == branch.tagName ||
- "OL" == branch.tagName) {
- return;
- }
- // We expect branch to be a li, but Chrome treats click on li icon as
- // clicking on it's content (even though icon is "outside") so need to
- // do some tweaking here
- while ("LI" != branch.tagName && branch.parentNode) {
- branch = branch.parentNode;
- }
- if ("LI" == branch.tagName) {
- subBranches = branch.getElementsByTagName("ul");
- if (subBranches.length > 0) {
- var subBranch = subBranches[0];
- if (subBranch.style.display == "block") {
- subBranch.style.display = "none";
- removeClassName(branch, "expanded");
- addClassName(branch, "collapsed");
- } else {
- subBranch.style.display = "block";
- removeClassName(branch, "collapsed");
- addClassName(branch, "expanded");
- }
- }
- }
-}
-
-function addEventListener(anElement, anEventName, anEventHandler) {
- if (anElement.addEventListener) {
- anElement.addEventListener(anEventName, anEventHandler, false);
- } else if (tree.attachEvent) {
- ieEventName = "on" + anEventName; // MS IE different (of course)
- anElement.attachEvent(ieEventName, anEventHandler);
- }
-}
-
-function activateTree(tree) {
- // Collapse (hide) the tree branches
- var branches = tree.getElementsByTagName("ul");
- for (var i=0; i < branches.length; i++) {
- branches[i].style.display="none";
- }
- // Style the items (see dbdoc.css)
- var items = tree.getElementsByTagName("li");
- for (var i=0; i < items.length; i++) {
- if (items[i].getElementsByTagName("li").length > 0) {
- addClassName(items[i], "collapsed");
- } else {
- addClassName(items[i], "noChildren");
- }
- }
- addEventListener(tree, "click", toggleBranch);
-}
-
-function initializeTrees() {
- var trees = document.getElementsByName("Tree");
- for (var idx = 0; idx < trees.length; idx++) {
- activateTree(trees[idx]);
- }
-}
-
-//===============
-// Frame Loaders
-//===============
-
-//http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656
-var scriptSource = (function(scripts) {
- var scripts = document.getElementsByTagName('script'),
- script = scripts[scripts.length - 1];
-
- return (script.getAttribute.length !== undefined) ?
- //FF/Chrome/Safari
- script.src : //(only FYI, this would work also in IE8)
- //IE 6/7/8
- script.getAttribute('src', 4); //using 4 (and not -1) see MSDN http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx
-}());
-// Now that we know where we are, compose URL fo empty.html (which should
-// be in the same directory as this script)
-var emptyHtml = scriptSource.substr(0, scriptSource.length - 8) + "empty.html";
-
-function loadDBObjects(src) {
- parent.DBObjectsFrame.location.href = src;
-}
-
-function loadDetails(src) {
- parent.ObjectDetailsFrame.location.href = src;
-}
-
-function loadChildren(src) {
- parent.ObjectDetailsChildrenFrame.location.href = src;
-}
-
-function loadDependentFrames() {
- var found = false;
- // ObjectsFrame
- // ObjectTypeFrame
- // DBObjectsFrame
- if (window.name == "ObjectsFrame") {
- for (idx = 0; idx < document.links.length; idx++) {
- if (document.links[idx].target == "ObjectDetailsFrame") {
- loadDetails(document.links[idx].href);
- found = true;
- break;
- }
- }
- if (!found) {
- loadDetails(emptyHtml);
- }
- } else if (window.name == "ObjectTypeFrame") {
- for (idx = 0; idx < document.links.length; idx++) {
- if (document.links[idx].target == "DBObjectsFrame") {
- loadDBObjects(document.links[idx].href);
- found = true;
- break;
- }
- }
- if (!found) {
- loadChildren(emptyHtml);
- }
- } else if (window.name == "DBObjectsFrame") {
- for (idx = 0; idx < document.links.length; idx++) {
- if (document.links[idx].target == "ObjectDetailsFrame") {
- loadDetails(document.links[idx].href);
- found = true;
- break;
- }
- }
- if (!found) {
- loadChildren(emptyHtml);
- }
- } else if (window.name == "ObjectDetailsFrame") {
- for (idx = 0; idx < document.links.length; idx++) {
- if (document.links[idx].target == "ObjectDetailsChildrenFrame") {
- loadChildren(document.links[idx].href);
- found = true;
- break;
- }
- }
- if (!found) {
- loadChildren(emptyHtml);
- }
- }
-}
-
-// Initialization
-function addLoadEventListener(func) {
- var prevOnLoad = window.onload;
- if (typeof window.onload != 'function') {
- // That is, not defined yet
- window.onload = func;
- } else {
- window.onload = function() {
- if (prevOnLoad) {
- prevOnLoad();
- }
- func();
- }
- }
-}
-addLoadEventListener(initializeTrees);
-addLoadEventListener(loadDependentFrames);
diff --git a/docs/core/DBDocs/empty.html b/docs/core/DBDocs/empty.html
deleted file mode 100644
index 2325660..0000000
--- a/docs/core/DBDocs/empty.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/index.html b/docs/core/DBDocs/index.html
deleted file mode 100644
index 729eb44..0000000
--- a/docs/core/DBDocs/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
diff --git a/docs/core/DBDocs/nodeTypes.html b/docs/core/DBDocs/nodeTypes.html
deleted file mode 100644
index 710bc57..0000000
--- a/docs/core/DBDocs/nodeTypes.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-WTP
-Tables
-Packages
-Package Bodies
-Sequences
-
-
\ No newline at end of file
diff --git a/docs/core/DBDocs/package body/WTPLSQL.html b/docs/core/DBDocs/package body/WTPLSQL.html
deleted file mode 100644
index e70c1f3..0000000
--- a/docs/core/DBDocs/package body/WTPLSQL.html
+++ /dev/null
@@ -1,788 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WTPLSQL |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41930 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:09:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:16 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WTPLSQL |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wtplsql
-as
-
- C_KEEP_NUM_RECS number := 20;
-
- g_test_runs_rec wt_test_runs%ROWTYPE;
-
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400);
- test_all_aa test_all_aa_type;
- wtplsql_skip_test boolean := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-----------------------
--- Private Procedures
-----------------------
-
-
-------------------------------------------------------------
--- This procedure is separated for internal WTPLSQL testing
-procedure check_runner
-is
- l_package_check number;
-begin
- -- These RAISEs can be captured because the Test Runs Record is set.
- -- Check for NULL Runner Name
- if g_test_runs_rec.runner_name is null
- then
- raise_application_error (-20001, 'RUNNER_NAME is null');
- end if;
- -- Check for Valid Runner Name
- select count(*) into l_package_check
- from all_arguments
- where owner = USER
- and object_name = 'WTPLSQL_RUN'
- and package_name = g_test_runs_rec.runner_name
- and argument_name is null
- and position = 1
- and sequence = 0;
- if l_package_check != 1
- then
- raise_application_error (-20002, 'RUNNER_NAME "' ||
- g_test_runs_rec.runner_name ||
- '.WTPLSQL_RUN" is not valid');
- end if;
-end check_runner;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_check_runner
- is
- l_save_test_runs_rec wt_test_runs%ROWTYPE := g_test_runs_rec;
- l_msg_in varchar2(4000);
- l_err_in varchar2(4000);
- -------------------------------------- WTPLSQL Testing --
- procedure l_test_sqlerrm is begin
- -- Restore the G_TEST_RUNS_REC
- g_test_runs_rec := l_save_test_runs_rec;
- wt_assert.eq
- (msg_in => l_msg_in
- ,check_this_in => SQLERRM
- ,against_this_in => l_err_in);
- end l_test_sqlerrm;
- begin
- -------------------------------------- WTPLSQL Testing --
- -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
- -- procedure in this package.
- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1';
- begin
- g_test_runs_rec.runner_name := '';
- l_msg_in := 'Null RUNNER_NAME';
- l_err_in := 'ORA-20001: RUNNER_NAME is null';
- check_runner;
- l_test_sqlerrm;
- exception when others then
- l_test_sqlerrm;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2';
- begin
- g_test_runs_rec.runner_name := 'BOGUS';
- l_msg_in := 'Invalid RUNNER_NAME';
- l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid';
- check_runner;
- l_test_sqlerrm;
- exception when others then
- l_test_sqlerrm;
- end;
- end t_check_runner;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure insert_test_run
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_wt_test_runs_recNULL wt_test_runs%ROWTYPE;
-begin
- if g_test_runs_rec.id is null
- then
- return;
- end if;
- g_test_runs_rec.end_dtm := systimestamp;
- insert into wt_test_runs values g_test_runs_rec;
- g_test_runs_rec := l_wt_test_runs_recNULL;
- COMMIT;
-exception
- when OTHERS
- then
- DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace);
-end insert_test_run;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_insert_test_run
- is
- -------------------------------------- WTPLSQL Testing --
- TYPE l_dbmsout_buff_type is table of varchar2(32767);
- l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1);
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_dbmsout_line varchar2(32767);
- l_dbmsout_stat number;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1';
- l_test_runs_rec := g_test_runs_rec;
- insert_test_run;
- g_test_runs_rec := l_test_runs_rec;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || l_test_runs_rec.id,
- against_value_in => 1);
- -------------------------------------- WTPLSQL Testing --
- delete from wt_test_runs
- where id = l_test_runs_rec.id;
- COMMIT;
- wt_assert.eqqueryvalue (
- msg_in => 'Records After Delete',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || l_test_runs_rec.id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'INSERT_TEST_RUN Sad Path 1';
- -- Save/Clear the DBMS_OUPTUT Buffer
- loop
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- exit when l_dbmsout_stat != 0;
- l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
- l_dbmsout_buff.extend;
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- select count(*) into l_num_recs from wt_test_runs;
- l_test_runs_rec := g_test_runs_rec;
- g_test_runs_rec.start_dtm := null;
- insert_test_run;
- g_test_runs_rec := l_test_runs_rec;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records should stay the same',
- check_query_in => 'select count(*) from wt_test_runs',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- wt_assert.eq (
- msg_in => 'DBMS_OUTPUT Status',
- check_this_in => l_dbmsout_stat,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- if wt_assert.last_pass
- then
- wt_assert.isnotnull (
- msg_in => 'DBMS_OUTPUT Line',
- check_this_in => l_dbmsout_line);
- wt_assert.this (
- msg_in => 'Confirm DBMS_OUTPUT Line text',
- check_this_in => (l_dbmsout_line like 'ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")%'));
- -------------------------------------- WTPLSQL Testing --
- if not wt_assert.last_pass
- then
- -- No match, put the line back into DBMS_OUTPUT buffer and end this.
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
- end if;
- end if;
- -------------------------------------- WTPLSQL Testing --
- -- Restore the DBMS_OUPTUT Buffer
- for i in 1 .. l_dbmsout_buff.COUNT - 1
- loop
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- end t_insert_test_run;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
----------------------
--- Public Procedures
----------------------
-
-
-------------------------------------------------------------
-function show_version
- return varchar2
-is
- ret_str wt_version.text%TYPE;
-begin
- select max(t1.text) into ret_str
- from wt_version t1
- where t1.install_dtm = (select max(t2.install_dtm)
- from wt_version t2);
- return ret_str;
-exception when NO_DATA_FOUND
-then
- return '';
-end show_version;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_show_version
- is
- existing_version wt_version.text%TYPE;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Show Version Happy Path';
- existing_version := show_version;
- wt_assert.isnotnull (
- msg_in => 'Test Existing Version',
- check_this_in => existing_version);
- -------------------------------------- WTPLSQL Testing --
- insert into wt_version (install_dtm, action, text)
- values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING');
- wt_assert.eq (
- msg_in => 'Test New Version',
- check_this_in => show_version,
- against_this_in => 'TESTING');
- -------------------------------------- WTPLSQL Testing --
- rollback;
- wt_assert.eq (
- msg_in => 'Return to Existing Version',
- check_this_in => show_version,
- against_this_in => existing_version);
- end t_show_version;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure test_run
- (in_package_name in varchar2)
-is
- l_test_runs_rec_NULL wt_test_runs%ROWTYPE;
- l_error_stack varchar2(32000);
- procedure concat_err_message is begin
- if g_test_runs_rec.error_message is not null
- then
- g_test_runs_rec.error_message := substr(l_error_stack || CHR(10)||
- g_test_runs_rec.error_message
- ,1,4000);
- else
- g_test_runs_rec.error_message := l_error_stack;
- end if;
- end concat_err_message;
-begin
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- -- This will avoid running the TEST_RUN procedure for some self-tests
- if wtplsql_skip_test
- then
- test_all_aa(in_package_name) := 'X';
- return;
- end if;
- --DBMS_OUTPUT.PUT_LINE('DEBUG WTPLSQL selftest Enabled for Test Runner "' || in_package_name || '"');
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- -- Reset the Test Runs Record before checking anything
- g_test_runs_rec := l_test_runs_rec_NULL;
- g_test_runs_rec.id := wt_test_runs_seq.nextval;
- g_test_runs_rec.start_dtm := systimestamp;
- g_test_runs_rec.runner_owner := USER;
- g_test_runs_rec.runner_name := in_package_name;
- g_test_runs_rec.error_message := '';
- check_runner;
- -- Initialize
- delete_runs(in_runner_owner => g_test_runs_rec.runner_owner -- Autonomous Transaction COMMIT
- ,in_runner_name => g_test_runs_rec.runner_name);
- wt_assert.reset_globals;
- wt_test_run_stat.initialize;
- wt_result.initialize(g_test_runs_rec.id);
- wt_profiler.initialize(in_test_run_id => g_test_runs_rec.id,
- in_runner_name => g_test_runs_rec.runner_name,
- out_dbout_owner => g_test_runs_rec.dbout_owner,
- out_dbout_name => g_test_runs_rec.dbout_name,
- out_dbout_type => g_test_runs_rec.dbout_type,
- out_trigger_offset => g_test_runs_rec.trigger_offset,
- out_profiler_runid => g_test_runs_rec.profiler_runid,
- out_error_message => l_error_stack);
- concat_err_message;
- -- Call the Test Runner
- begin
- execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;';
- exception
- when OTHERS
- then
- l_error_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- concat_err_message;
- end;
-
- -- Finalize
- insert_test_run; -- Autonomous Transaction COMMIT
- wt_profiler.finalize; -- Autonomous Transaction COMMIT
- wt_result.finalize; -- Autonomous Transaction COMMIT
- wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT
-
-exception
- when OTHERS
- then
- l_error_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- if g_test_runs_rec.id is null
- then
- DBMS_OUTPUT.PUT_LINE(l_error_stack);
- DBMS_OUTPUT.PUT_LINE('---------------------------');
- DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message);
- else
- concat_err_message;
- insert_test_run; -- Autonomous Transaction COMMIT
- end if;
- wt_profiler.finalize; -- Autonomous Transaction COMMIT
- wt_result.finalize; -- Autonomous Transaction COMMIT
- wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT
-
-end test_run;
-
---==============================================================--
--- No Unit Test for TEST_RUN.
--- Too complicated because testing occurs while the TEST_RUN
--- procedure is executing. This also prevents 100% profiling.
---==============================================================--
-
-
-------------------------------------------------------------
-procedure test_all
-is
- TYPE runners_nt_type is table of varchar2(128);
- l_runners_nt runners_nt_type;
-begin
- select package_name
- bulk collect into l_runners_nt
- from user_arguments t1
- where object_name = 'WTPLSQL_RUN'
- and position = 1
- and sequence = 0
- and data_type is null
- and not exists (
- select 'x' from user_arguments t2
- where t2.object_name = t1.object_name
- and t2.position > t1.position
- and t2.sequence > t1.sequence
- and ( t2.overload is null
- OR t2.overload = t1.overload)
- );
- for i in 1 .. l_runners_nt.COUNT
- loop
- test_run(l_runners_nt(i));
- end loop;
-end test_all;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_test_all
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'TEST_ALL Happy Path';
- test_all_aa.DELETE;
- wtplsql_skip_test := TRUE;
- -- TEST_ALL will populate the test_all_aa array
- wtplsql.test_all;
- wtplsql_skip_test := FALSE;
- -- This package should be in the test_all_aa array
- -------------------------------------- WTPLSQL Testing --
- wt_assert.this (
- msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')',
- check_this_in => test_all_aa.EXISTS('WTPLSQL'));
- end t_test_all;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_runs
- (in_test_run_id in number)
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
-begin
- -- Profiler delete must be first because it contains a
- -- PRAGMA AUTONOMOUS_TRANSACTION
- wt_test_run_stat.delete_records(in_test_run_id);
- wt_profiler.delete_records(in_test_run_id);
- wt_result.delete_records(in_test_run_id);
- delete from wt_test_runs where id = in_test_run_id;
- COMMIT;
-end delete_runs;
-
-procedure delete_runs
- (in_runner_owner in varchar2
- ,in_runner_name in varchar2)
-is
- num_recs number;
-begin
- num_recs := 1;
- for buf2 in (select id from wt_test_runs
- where runner_owner = in_runner_owner
- and runner_name = in_runner_name
- order by start_dtm desc, id desc)
- loop
- -- Keep the last 20 rest runs for this USER
- if num_recs > C_KEEP_NUM_RECS
- then
- -- Autonomous Transaction COMMIT
- delete_runs(buf2.id);
- end if;
- num_recs := num_recs + 1;
- end loop;
-end delete_runs;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_run_id
- is
- l_num_recs number;
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- DELETE_RECORDS has already run when we arrive here.
- -- Cleanup from previous test
- delete from wt_test_runs
- where id between 0-C_KEEP_NUM_RECS and 0-1;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1';
- select count(*)
- into l_num_recs
- from wt_test_runs
- where runner_owner = USER
- and runner_name = g_test_runs_rec.runner_name;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'Number of Records Before Insert',
- check_this_in => l_num_recs);
- wt_assert.this (
- msg_in => 'Number of Records Before Insert <= ' || C_KEEP_NUM_RECS,
- check_this_in => l_num_recs <= C_KEEP_NUM_RECS);
- -------------------------------------- WTPLSQL Testing --
- insert into wt_test_runs values g_test_runs_rec;
- COMMIT;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records After Insert',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || g_test_runs_rec.id,
- against_value_in => 1);
- delete_runs(g_test_runs_rec.id); -- Autonomous Transaction
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records After Delete',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || g_test_runs_rec.id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2';
- wt_assert.eqqueryvalue (
- msg_in => 'Confirm number of records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- for i in 1 .. C_KEEP_NUM_RECS
- loop
- insert into wt_test_runs
- (id, start_dtm, runner_owner, runner_name)
- values
- (0-i, sysdate-7000-i, USER, g_test_runs_rec.runner_name);
- end loop;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Check Added ' || C_KEEP_NUM_RECS || ' records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs + C_KEEP_NUM_RECS);
- delete_runs(USER, g_test_runs_rec.runner_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Check number of records reduced',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => C_KEEP_NUM_RECS);
- delete from wt_test_runs
- where id between 0-C_KEEP_NUM_RECS and 0-1;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Confirm original number of records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1';
- begin
- delete_runs(-9995); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'Delete Runs(-9995)',
- check_this_in => l_err_stack);
- end t_delete_run_id;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_test_runs_rec_and_table
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path';
- -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
- -- procedure in this package.
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.id'
- ,check_this_in => g_test_runs_rec.id);
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.start_dtm'
- ,check_this_in => g_test_runs_rec.start_dtm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.runner_owner'
- ,check_this_in => g_test_runs_rec.runner_owner);
- wt_assert.eq
- (msg_in => 'g_test_runs_rec.runner_name'
- ,check_this_in => g_test_runs_rec.runner_name
- ,against_this_in => 'WTPLSQL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_owner'
- ,check_this_in => g_test_runs_rec.dbout_owner);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_name'
- ,check_this_in => g_test_runs_rec.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_type'
- ,check_this_in => g_test_runs_rec.dbout_type);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.profiler_runid'
- ,check_this_in => g_test_runs_rec.profiler_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.end_dtm'
- ,check_this_in => g_test_runs_rec.end_dtm);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.error_message'
- ,check_this_in => g_test_runs_rec.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue
- (msg_in => 'TEST_RUNS Record for this TEST_RUN'
- ,check_query_in => 'select count(*) from WT_TEST_RUNS' ||
- ' where id = ''' || g_test_runs_rec.id || ''''
- ,against_value_in => 0);
- end t_test_runs_rec_and_table;
- ----------------------------------------
- procedure WTPLSQL_RUN
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- t_show_version;
- t_check_runner;
- t_insert_test_run;
- t_test_all;
- t_delete_run_id;
- t_test_runs_rec_and_table;
- end;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wtplsql;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WTPLSQL/headerBg.jpg b/docs/core/DBDocs/package body/WTPLSQL/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/report.css b/docs/core/DBDocs/package body/WTPLSQL/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WTPLSQL/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WTPLSQL/report.js b/docs/core/DBDocs/package body/WTPLSQL/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WTPLSQL/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topDimTabBg.gif b/docs/core/DBDocs/package body/WTPLSQL/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topDimTabL.gif b/docs/core/DBDocs/package body/WTPLSQL/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topDimTabR.gif b/docs/core/DBDocs/package body/WTPLSQL/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topTabBg.gif b/docs/core/DBDocs/package body/WTPLSQL/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topTabL.gif b/docs/core/DBDocs/package body/WTPLSQL/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WTPLSQL/topTabR.gif b/docs/core/DBDocs/package body/WTPLSQL/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WTPLSQL/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT.html b/docs/core/DBDocs/package body/WT_ASSERT.html
deleted file mode 100644
index 20edb69..0000000
--- a/docs/core/DBDocs/package body/WT_ASSERT.html
+++ /dev/null
@@ -1,4080 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
See (public) RESET_GLOBALS procedure for default global values
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_ASSERT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41932 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:09:16 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:16 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_ASSERT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wt_assert is
-
- -- See (public) RESET_GLOBALS procedure for default global values
- TYPE g_rec_type is record
- (last_pass boolean
- ,raise_exception boolean
- ,last_assert wt_results.assertion%TYPE
- ,last_msg wt_results.message%TYPE
- ,last_details wt_results.details%TYPE);
- g_rec g_rec_type;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/');
- temp_rowid2 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAB/');
- temp_long1 CONSTANT long := hextoraw('0123456789ABCDEF0123456789ABCDEF');
- temp_long2 CONSTANT long := hextoraw('FEDCBA9876543210FEDCBA9876543210');
- temp_raw1 CONSTANT raw(2) := hextoraw('2345');
- temp_raw2 CONSTANT raw(2) := hextoraw('6789');
- temp_lraw1 CONSTANT long raw := hextoraw('0123456789ABCDEF0123456789ABCDEF');
- temp_lraw2 CONSTANT long raw := hextoraw('FEDCBA9876543210FEDCBA9876543210');
- temp_blob1 BLOB;
- temp_blob2 CONSTANT BLOB := hextoraw('FEDCBA9876543210FEDCBA9876543210');
- -------------------------------------- WTPLSQL Testing --
- temp_nc1 CONSTANT NVARCHAR2(12) := 'NCHAR1';
- temp_nc2 CONSTANT NVARCHAR2(12) := 'NCHAR2';
- temp_bool CONSTANT boolean := NULL;
- temp_clob1 CLOB;
- temp_clob2 CONSTANT CLOB := 'This is another clob.';
- temp_nclob1 NCLOB;
- temp_nclob2 CONSTANT NCLOB := 'This is another clob.';
- temp_xml1 XMLTYPE;
- temp_xml2 CONSTANT XMLTYPE := xmltype('<?xml version="1.0" encoding="UTF-8"?><note>2</note>');
- -------------------------------------- WTPLSQL Testing --
- temp_pint1 CONSTANT pls_integer := 2;
- temp_pint2 CONSTANT pls_integer := 3;
- temp_date CONSTANT date := sysdate;
- temp_tstmp CONSTANT timestamp := systimestamp;
- temp_tstlzn CONSTANT timestamp with local time zone := systimestamp;
- temp_tstzn CONSTANT timestamp with time zone := systimestamp;
- temp_intds1 CONSTANT interval day to second := interval '+01 01:01:01.001' day to second;
- temp_intds2 CONSTANT interval day to second := interval '+02 02:02:02.002' day to second;
- temp_intym1 CONSTANT interval year to month := interval '+01-01' year to month;
- temp_intym2 CONSTANT interval year to month := interval '+02-02' year to month;
- -------------------------------------- WTPLSQL Testing --
- temp_rec g_rec_type;
- temp_testcase VARCHAR2(4000);
- wtplsql_skip_save boolean := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-----------------------
--- Private Procedures
-----------------------
-
-------------------------------------------------------------
-function boolean_to_status
- (in_boolean in boolean)
- return varchar2
-is
-begin
- if in_boolean is null
- then
- return '';
- elsif in_boolean
- then
- return 'TRUE';
- end if;
- return 'FALSE';
-end boolean_to_status;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_boolean_to_status
- is
- begin
- wt_assert.g_testcase := 'BOOLEAN_TO_STATUS';
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'Test for "TRUE" conversion'
- ,check_this_in => boolean_to_status(TRUE)
- ,against_this_in => 'TRUE');
- wt_assert.eq
- (msg_in => 'Test for "FALSE" conversion'
- ,check_this_in => boolean_to_status(FALSE)
- ,against_this_in => 'FALSE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'Test for NULL'
- ,check_this_in => boolean_to_status(temp_bool));
- end t_boolean_to_status;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure process_assertion
-is
-begin
-
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not wtplsql_skip_save then
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
- wt_result.save
- (in_assertion => g_rec.last_assert
- ,in_status => case g_rec.last_pass
- when TRUE then C_PASS
- else C_FAIL
- end
- ,in_details => g_rec.last_details
- ,in_testcase => g_testcase
- ,in_message => g_rec.last_msg);
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- end if;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
- if g_rec.raise_exception and not g_rec.last_pass
- then
- raise_application_error(-20003, wt_text_report.format_test_result
- (in_assertion => g_rec.last_assert
- ,in_status => C_FAIL
- ,in_details => g_rec.last_details
- ,in_testcase => g_testcase
- ,in_message => g_rec.last_msg) );
- end if;
-
-end process_assertion;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_process_assertion
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- g_testcase := 'PROCESS_ASSERTION';
- g_rec.last_assert := 'THIS';
- g_rec.last_pass := FALSE;
- g_rec.last_details := 'Expected "PASS" and got "FAIL"';
- g_rec.last_msg := 'Process Assertion Forced Failure';
- g_rec.raise_exception := TRUE;
- wtplsql_skip_save := TRUE;
- process_assertion; -- Should throw exception
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- exception
- when ASSERT_FAILURE_EXCEPTION then
- wtplsql_skip_save := FALSE;
- end t_process_assertion;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure compare_queries (
- check_query_in in varchar2,
- against_query_in in varchar2)
-is
- l_ret_txt varchar2(10);
- l_qry_txt varchar2(32000);
- l_exec_txt varchar2(32767);
-begin
- -- Define Query for the Comparison
- l_qry_txt := 'with check_query as (' || check_query_in ||
- '), against_query as (' || against_query_in ||
- '), q1 as (select * from check_query' ||
- ' MINUS select * from against_query' ||
- '), q2 as (select * from against_query' ||
- ' MINUS select * from check_query' ||
- ') select * from q1 UNION select * from q2' ;
- ----------------------------------------
- -- Define EXECUTE IMMEDIATE text
- l_exec_txt :=
-'declare
- cursor cur is ' || l_qry_txt || ';
- rec cur%rowtype;
-begin
- open cur;
- fetch cur into rec;
- :ret_txt := case cur%FOUND when TRUE then ''FOUND''
- else ''NOTFOUND'' end;
- close cur;
-end;';
- ----------------------------------------
- -- Run the Comparison
- execute immediate l_exec_txt using out l_ret_txt;
- if l_ret_txt = 'FOUND'
- then
- g_rec.last_pass := FALSE; -- Some Difference Found
- else
- g_rec.last_pass := TRUE; -- Nothing found, queries match
- end if;
- -- No Exceptions Raised
- g_rec.last_details := 'Comparison Query: ' || l_qry_txt;
-exception
- when OTHERS
- then
- g_rec.last_details := SQLERRM || CHR(10) ||
- 'FAILURE of Compare Query: ' || l_qry_txt || ';';
- g_rec.last_pass := FALSE;
-end compare_queries;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_compare_queries
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1';
- compare_queries (
- check_query_in => 'select bogus123 from bogus456',
- against_query_in => 'select bogus987 from bogus654');
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull(
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this(
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- '%PL/SQL: ORA-00942: table or view does not exist%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2';
- compare_queries (
- check_query_in => 'select table_name from user_tables',
- against_query_in => 'select tablespace_name from user_tables');
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull(
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this(
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details like
- '%Comparison Query: with check_query as' ||
- ' (select table_name from user_tables%');
- end t_compare_queries;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
----------------------
--- Public Procedures
----------------------
-
-------------------------------------------------------------
-function last_pass
- return boolean
-is
-begin
- return g_rec.last_pass;
-end last_pass;
-
-function last_assert
- return wt_results.assertion%TYPE
-is
-begin
- return g_rec.last_assert;
-end last_assert;
-
-function last_msg
- return wt_results.message%TYPE
-is
-begin
- return g_rec.last_msg;
-end last_msg;
-
-function last_details
- return wt_results.details%TYPE
-is
-begin
- return g_rec.last_details;
-end last_details;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_last_values
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Last Values Tests';
- wt_assert.eq (
- msg_in => 'Last Pass',
- check_this_in => last_pass,
- against_this_in => g_rec.last_pass,
- null_ok_in => TRUE);
- wt_assert.eq (
- msg_in => 'Last Assert',
- check_this_in => last_assert,
- against_this_in => g_rec.last_assert,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'Last MSG',
- check_this_in => last_msg,
- against_this_in => temp_rec.last_msg,
- null_ok_in => TRUE);
- wt_assert.eq (
- msg_in => 'Last Details',
- check_this_in => last_details,
- against_this_in => g_rec.last_details,
- null_ok_in => TRUE);
- end t_last_values;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure reset_globals
-is
-begin
- g_testcase := '';
- g_rec.last_pass := NULL;
- g_rec.last_assert := '';
- g_rec.last_msg := '';
- g_rec.last_details := '';
- g_rec.raise_exception := FALSE;
-end reset_globals;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_reset_globals
- is
- begin
- reset_globals; -- Resets g_testcase
- temp_rec := g_rec;
- temp_testcase := g_testcase;
- -------------------------------------- WTPLSQL Testing --
- g_testcase := 'RESET_GLOBALS';
- wt_assert.isnull(
- msg_in => 'temp_testcase',
- check_this_in => temp_testcase);
- wt_assert.isnull
- (msg_in => 'temp_rec.last_pass'
- ,check_this_in => temp_rec.last_pass);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq(
- msg_in => 'temp_rec.raise_exception',
- check_this_in => temp_rec.raise_exception,
- against_this_in => FALSE);
- wt_assert.isnull
- (msg_in => 'temp_rec.last_assert'
- ,check_this_in => temp_rec.last_assert);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'temp_rec.last_msg'
- ,check_this_in => temp_rec.last_msg);
- wt_assert.isnull
- (msg_in => 'temp_rec.last_details'
- ,check_this_in => temp_rec.last_details);
- end t_reset_globals;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-function get_NLS_DATE_FORMAT
- return varchar2
-is
- l_format varchar2(50);
-begin
- select value into l_format
- from nls_session_parameters
- where parameter in 'NLS_DATE_FORMAT';
- return l_format;
-end get_NLS_DATE_FORMAT;
-
-procedure set_NLS_DATE_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS')
-is
-begin
- execute immediate 'alter session set NLS_DATE_FORMAT = ''' ||
- in_format || '''';
-end set_NLS_DATE_FORMAT;
-
-function get_NLS_TIMESTAMP_FORMAT
- return varchar2
-is
- l_format varchar2(50);
-begin
- select value into l_format
- from nls_session_parameters
- where parameter in 'NLS_TIMESTAMP_FORMAT';
- return l_format;
-end get_NLS_TIMESTAMP_FORMAT;
-
-procedure set_NLS_TIMESTAMP_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6')
-is
-begin
- execute immediate 'alter session set NLS_TIMESTAMP_FORMAT = ''' ||
- in_format || '''';
-end set_NLS_TIMESTAMP_FORMAT;
-
-function get_NLS_TIMESTAMP_TZ_FORMAT
- return varchar2
-is
- l_format varchar2(50);
-begin
- select value into l_format
- from nls_session_parameters
- where parameter in 'NLS_TIMESTAMP_TZ_FORMAT';
- return l_format;
-end get_NLS_TIMESTAMP_TZ_FORMAT;
-
-procedure set_NLS_TIMESTAMP_TZ_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM')
-is
-begin
- execute immediate 'alter session set NLS_TIMESTAMP_TZ_FORMAT = ''' ||
- in_format || '''';
-end set_NLS_TIMESTAMP_TZ_FORMAT;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_nls_settings
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'NLS Settings';
- set_NLS_DATE_FORMAT('DD-MON-YYYY');
- wt_assert.eq
- (msg_in => 'get_NLS_DATE_FORMAT 1'
- ,check_this_in => get_NLS_DATE_FORMAT
- ,against_this_in => 'DD-MON-YYYY');
- set_NLS_DATE_FORMAT;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'get_NLS_DATE_FORMAT 2'
- ,check_this_in => get_NLS_DATE_FORMAT
- ,against_this_in => 'DD-MON-YYYY HH24:MI:SS');
- set_NLS_TIMESTAMP_FORMAT('DD-MON-YYYY');
- wt_assert.eq
- (msg_in => 'get_NLS_TIMESTAMP_FORMAT 2'
- ,check_this_in => get_NLS_TIMESTAMP_FORMAT
- ,against_this_in => 'DD-MON-YYYY');
- set_NLS_TIMESTAMP_FORMAT;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'get_NLS_TIMESTAMP_FORMAT 2'
- ,check_this_in => get_NLS_TIMESTAMP_FORMAT
- ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6');
- set_NLS_TIMESTAMP_TZ_FORMAT('DD-MON-YYYY');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
- ,check_this_in => get_NLS_TIMESTAMP_TZ_FORMAT
- ,against_this_in => 'DD-MON-YYYY');
- set_NLS_TIMESTAMP_TZ_FORMAT;
- wt_assert.eq
- (msg_in => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
- ,check_this_in => get_NLS_TIMESTAMP_TZ_FORMAT
- ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
- end t_nls_settings;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------
--- Assertion Procedures
-------------------------
-
-------------------------------------------------------------
-procedure this (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'THIS';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := nvl(check_this_in, FALSE);
- g_rec.last_details := 'Expected "TRUE" and got "' ||
- boolean_to_status(check_this_in) || '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end this;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_this
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'This Happy Path';
- wt_assert.this (
- msg_in => 'Run Test',
- check_this_in => TRUE);
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'THIS');
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected "TRUE" and got "TRUE"');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'This Sad Path 1';
- wtplsql_skip_save := TRUE;
- this (
- msg_in => 'Not Used',
- check_this_in => FALSE);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'This Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- this (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'This Sad Path 3';
- wtplsql_skip_save := TRUE;
- this (
- msg_in => 'Not Used',
- check_this_in => NULL);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- end t_this;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- EQ: string overload
-procedure eq (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'EQ';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
- or ( check_this_in is null
- and against_this_in is null
- and null_ok_in )
- );
- g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
- '" and got "' || substr(check_this_in ,1,1000) ||
- '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eq;
-
--- EQ: boolean overload
-procedure eq (
- msg_in in varchar2,
- check_this_in in boolean,
- against_this_in in boolean,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
-begin
- eq (msg_in => msg_in
- ,check_this_in => boolean_to_status(check_this_in)
- ,against_this_in => boolean_to_status(against_this_in)
- ,null_ok_in => null_ok_in
- ,raise_exc_in => raise_exc_in);
-end eq;
-
--- EQ: XMLTYPE
-procedure eq (
- msg_in in varchar2,
- check_this_in in XMLTYPE,
- against_this_in in XMLTYPE,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'EQ';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (xmltype.getclobval(check_this_in) =
- xmltype.getclobval(against_this_in) );
- g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) ||
- '" and got "' || substr(xmltype.getclobval(check_this_in) ,1,1000) ||
- '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eq;
-
--- EQ: CLOB
-procedure eq (
- msg_in in varchar2,
- check_this_in in CLOB,
- against_this_in in CLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'EQ';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
- or ( check_this_in is null
- and against_this_in is null
- and null_ok_in )
- );
- g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
- '" and got "' || substr(check_this_in ,1,1000) ||
- '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eq;
-
--- EQ: BLOB
-procedure eq (
- msg_in in varchar2,
- check_this_in in BLOB,
- against_this_in in BLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
- compare_results number;
-begin
- g_rec.last_assert := 'EQ';
- g_rec.last_msg := msg_in;
- compare_results := nvl(DBMS_LOB.COMPARE(check_this_in, against_this_in),-1);
- g_rec.last_pass := ( (compare_results = 0)
- or ( check_this_in is null
- and against_this_in is null
- and null_ok_in )
- );
- g_rec.last_details := 'DBMS_LOB.COMPARE on BLOBs, compare_results: ' || compare_results;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eq;
-
--------------------------------------------------------------------------
--- This is the start of a MASSIVE Unit Test on the "EQ" assertion ---
--------------------------------------------------------------------------
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_eq
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => 'X',
- against_this_in => 'X');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_pass value',
- check_this_in => temp_rec.last_pass);
- wt_assert.this (
- msg_in => 'temp_rec.last_pass',
- check_this_in => (temp_rec.last_pass = TRUE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_assert value',
- check_this_in => temp_rec.last_assert);
- wt_assert.this (
- msg_in => 'temp_rec.last_assert',
- check_this_in => (temp_rec.last_assert = 'EQ'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_msg value',
- check_this_in => temp_rec.last_msg);
- wt_assert.this (
- msg_in => 'temp_rec.last_msg',
- check_this_in => (temp_rec.last_msg = 'Run Test'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details = 'Expected "X" and got "X"'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => 'X',
- against_this_in => 'X',
- null_ok_in => TRUE);
- wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3';
- eq (
- msg_in => 'Run Test',
- check_this_in => '',
- against_this_in => '',
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => 'X',
- against_this_in => 'Y');
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => 'X');
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => 'Y');
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eq (
- msg_in => 'Not Used',
- check_this_in => 'X',
- against_this_in => 'Y',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => '',
- against_this_in => 'Y');
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'check_this_in value',
- check_this_in => '');
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => 'Y');
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => '',
- against_this_in => '');
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'check_this_in value',
- check_this_in => '');
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => '');
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => 'X',
- against_this_in => 'Y',
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => 'X');
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => 'Y');
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => '',
- against_this_in => 'Y',
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'check_this_in value',
- check_this_in => '');
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => 'Y');
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes ROWID
- wt_assert.g_testcase := 'EQ ROWID Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_rowid1,
- against_this_in => temp_rowid1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ ROWID Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_rowid1,
- against_this_in => temp_rowid2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_rowid1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_rowid2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes LONG
- wt_assert.g_testcase := 'EQ LONG Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_long1,
- against_this_in => temp_long1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ LONG Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_long1,
- against_this_in => temp_long2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_long1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_long2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes RAW
- wt_assert.g_testcase := 'EQ RAW Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_raw1,
- against_this_in => temp_raw1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ RAW Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_raw1,
- against_this_in => temp_raw2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_raw1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_raw2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes LONG RAW
- wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_lraw1,
- against_this_in => temp_lraw1);
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes LONG RAW
- wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_lraw1,
- against_this_in => temp_lraw2);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1';
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_lraw1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_lraw2);
- wt_assert.this (
- msg_in => 'Sad Path 1',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- VARCHAR2 includes Includes NVARCHAR2
- wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_nc1,
- against_this_in => temp_nc1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_nc1,
- against_this_in => temp_nc2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_nc1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_nc2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => FALSE,
- against_this_in => FALSE);
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => FALSE,
- against_this_in => FALSE,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_bool,
- against_this_in => temp_bool,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- against_this_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => TRUE);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- against_this_in => temp_bool);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => FALSE);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_bool);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- against_this_in => TRUE,
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => TRUE);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- against_this_in => temp_bool,
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => FALSE);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_bool);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => 4,
- against_this_in => 4);
- wt_assert.g_testcase := 'EQ NUMBER Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => 9876543210987654321098765432109876543210,
- against_this_in => 9876543210987654321098765432109876543210);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => 4,
- against_this_in => 5);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => 4);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => 5);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: NUMBER implicit conversion includes PLS_INTEGER
- wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_pint1,
- against_this_in => temp_pint1);
- wtplsql_skip_save := TRUE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1';
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_pint1,
- against_this_in => temp_pint2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_pint1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_pint2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ DATE Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_date,
- against_this_in => temp_date);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ DATE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_date,
- against_this_in => temp_date + 1/24);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_date);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_date + 1/24);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: DATE implicit conversion includes TIMESTAMP
- wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1';
- eq (
- msg_in => 'EQ TIMSETAMP Happy Path 1',
- check_this_in => temp_tstmp,
- against_this_in => temp_tstmp);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_tstmp,
- against_this_in => temp_tstmp + 1/24);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_tstmp);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_tstmp + 1/24);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: DATE implicit conversion includes TIMESTAMP
- wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_tstzn,
- against_this_in => temp_tstzn);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_tstlzn,
- against_this_in => temp_tstlzn + 1/24);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_tstlzn);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_tstlzn + 1/24);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: DATE implicit conversion includes TIMESTAMP
- wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_tstzn,
- against_this_in => temp_tstzn);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_tstzn,
- against_this_in => temp_tstzn + 1/24);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_tstzn);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_tstzn + 1/24);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: DATE implicit conversion includes INTERVAL
- wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_intds1,
- against_this_in => temp_intds1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_intds1,
- against_this_in => temp_intds2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_intds1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_intds2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- -- EQ: DATE implicit conversion includes INTERVAL
- wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_intym1,
- against_this_in => temp_intym1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_intym1,
- against_this_in => temp_intym2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_intym1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_intym2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_xml1,
- against_this_in => temp_xml1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_pass value',
- check_this_in => temp_rec.last_pass);
- wt_assert.this (
- msg_in => 'temp_rec.last_pass',
- check_this_in => (temp_rec.last_pass = TRUE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => ' g_rec.last_assert value',
- check_this_in => temp_rec.last_assert);
- wt_assert.this (
- msg_in => 'temp_rec.last_assert',
- check_this_in => (temp_rec.last_assert = 'EQ'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_msg value',
- check_this_in => temp_rec.last_msg);
- wt_assert.this (
- msg_in => 'temp_rec.last_msg',
- check_this_in => (temp_rec.last_msg = 'Run Test'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_xml1,
- against_this_in => temp_xml2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => xmltype.getclobval(temp_xml1));
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => xmltype.getclobval(temp_xml2));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_xml1,
- against_this_in => temp_xml2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_clob1,
- against_this_in => temp_clob1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_pass value',
- check_this_in => temp_rec.last_pass);
- wt_assert.this (
- msg_in => 'temp_rec.last_pass',
- check_this_in => (temp_rec.last_pass = TRUE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_assert value',
- check_this_in => temp_rec.last_assert);
- wt_assert.this (
- msg_in => 'temp_rec.last_assert',
- check_this_in => (temp_rec.last_assert = 'EQ'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_msg value',
- check_this_in => temp_rec.last_msg);
- wt_assert.this (
- msg_in => 'temp_rec.last_msg',
- check_this_in => (temp_rec.last_msg = 'Run Test'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_clob1,
- against_this_in => temp_clob1,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Happy Path 3';
- eq (
- msg_in => 'Run Test',
- check_this_in => cast (NULL as CLOB),
- against_this_in => cast (NULL as CLOB),
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_clob1,
- against_this_in => temp_clob2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_clob1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_clob2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_clob1,
- against_this_in => temp_clob2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Sad Path 3';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_clob1,
- against_this_in => cast (NULL as CLOB));
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_clob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as CLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ CLOB Sad Path 4';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_clob1,
- against_this_in => cast (NULL as CLOB),
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_clob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as CLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_nclob1,
- against_this_in => temp_nclob1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_nclob1,
- against_this_in => temp_nclob1,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Happy Path 3';
- eq (
- msg_in => 'Run Test',
- check_this_in => cast (NULL as NCLOB),
- against_this_in => cast (NULL as NCLOB),
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_nclob1,
- against_this_in => temp_nclob2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_nclob1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_nclob2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_nclob1,
- against_this_in => temp_nclob2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Sad Path 3';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_nclob1,
- against_this_in => cast (NULL as NCLOB));
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_nclob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as NCLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ NCLOB Sad Path 4';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_nclob1,
- against_this_in => cast (NULL as NCLOB),
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_nclob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as NCLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Happy Path 1';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_blob1,
- against_this_in => temp_blob1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_pass value',
- check_this_in => temp_rec.last_pass);
- wt_assert.this (
- msg_in => 'temp_rec.last_pass',
- check_this_in => (temp_rec.last_pass = TRUE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_assert value',
- check_this_in => temp_rec.last_assert);
- wt_assert.this (
- msg_in => 'temp_rec.last_assert',
- check_this_in => (temp_rec.last_assert = 'EQ'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_msg value',
- check_this_in => temp_rec.last_msg);
- wt_assert.this (
- msg_in => 'temp_rec.last_msg',
- check_this_in => (temp_rec.last_msg = 'Run Test'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details =
- 'DBMS_LOB.COMPARE on BLOBs, compare_results: 0'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Happy Path 2';
- eq (
- msg_in => 'Run Test',
- check_this_in => temp_blob1,
- against_this_in => temp_blob1,
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Happy Path 3';
- eq (
- msg_in => 'Run Test',
- check_this_in => cast (NULL as BLOB),
- against_this_in => cast (NULL as BLOB),
- null_ok_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_blob1,
- against_this_in => temp_blob2);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_blob1);
- wt_assert.isnotnull (
- msg_in => 'against_this_in value',
- check_this_in => temp_blob2);
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_blob1,
- against_this_in => temp_blob2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Sad Path 3';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_blob1,
- against_this_in => cast (NULL as BLOB));
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_blob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as BLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQ BLOB Sad Path 4';
- wtplsql_skip_save := TRUE;
- eq (
- msg_in => 'Not Used',
- check_this_in => temp_blob1,
- against_this_in => cast (NULL as BLOB),
- null_ok_in => TRUE);
- wtplsql_skip_save := FALSE;
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'check_this_in value',
- check_this_in => temp_blob1);
- wt_assert.isnull (
- msg_in => 'against_this_in value',
- check_this_in => cast (NULL as BLOB));
- wt_assert.this (
- msg_in => 'last_pass = FALSE',
- check_this_in => (temp_rec.last_pass = FALSE));
- end t_eq;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
------------------------------------------------------------------------
--- This is the end of a MASSIVE Unit Test on the "EQ" assertion ---
------------------------------------------------------------------------
-
-
-------------------------------------------------------------
--- ISNOTNULL string overload
-procedure isnotnull (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNOTNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is not null);
- g_rec.last_details := 'Expected NOT NULL and got "' ||
- substr(check_this_in,1,2000) || '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnotnull;
-
--- ISNOTNULL boolean overload
-procedure isnotnull (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- isnotnull (msg_in => msg_in
- ,check_this_in => boolean_to_status(check_this_in)
- ,null_ok_in => null_ok_in
- ,raise_exc_in => raise_exc_in);
-end isnotnull;
-
--- ISNOTNULL CLOB overload
-procedure isnotnull (
- msg_in in varchar2,
- check_this_in in CLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNOTNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is not null);
- g_rec.last_details := 'Expected NOT NULL and got "' ||
- substr(check_this_in,1,2000) || '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnotnull;
-
--- ISNOTNULL BLOB overload
-procedure isnotnull (
- msg_in in varchar2,
- check_this_in in BLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNOTNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is not null);
- if g_rec.last_pass
- then
- g_rec.last_details := 'BLOB is NOT NULL';
- else
- g_rec.last_details := 'BLOB is NULL';
- end if;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnotnull;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_isnotnull
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1';
- isnotnull (
- msg_in => 'Run Test',
- check_this_in => 'X');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNOTNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected NOT NULL and got "X"');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => '');
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => '',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1';
- isnotnull (
- msg_in => 'Run Test',
- check_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => temp_bool);
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => temp_bool,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1';
- isnotnull (
- msg_in => 'Run Test',
- check_this_in => temp_clob1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNOTNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected NOT NULL and got "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => cast (null as CLOB));
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => cast (null as CLOB),
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1';
- isnotnull (
- msg_in => 'Run Test',
- check_this_in => temp_blob1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNOTNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'BLOB is NOT NULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => cast (null as BLOB));
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnotnull (
- msg_in => 'Not Used',
- check_this_in => cast (null as BLOB),
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- end t_isnotnull;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- ISNULL string overload
-procedure isnull (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is null);
- g_rec.last_details := 'Expected NULL and got "' ||
- substr(check_this_in,1,2000) || '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnull;
-
--- ISNULL boolean overload
-procedure isnull (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- isnull (msg_in => msg_in
- ,check_this_in => boolean_to_status(check_this_in)
- ,null_ok_in => null_ok_in
- ,raise_exc_in => raise_exc_in);
-end isnull;
-
--- ISNULL CLOB overload
-procedure isnull (
- msg_in in varchar2,
- check_this_in in CLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is null);
- g_rec.last_details := 'Expected NULL and got "' ||
- substr(check_this_in,1,2000) || '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnull;
-
--- ISNULL BLOB overload
-procedure isnull (
- msg_in in varchar2,
- check_this_in in BLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'ISNULL';
- g_rec.last_msg := msg_in;
- g_rec.last_pass := (check_this_in is null);
- if g_rec.last_pass
- then
- g_rec.last_details := 'BLOB is NULL';
- else
- g_rec.last_details := 'BLOB is NOT NULL';
- end if;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end isnull;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_isnull
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1';
- isnull (
- msg_in => 'Run Test',
- check_this_in => '');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected NULL and got ""');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnull (
- msg_in => 'Not Used',
- check_this_in => 'X');
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnull (
- msg_in => 'Not Used',
- check_this_in => 'X',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1';
- isnull (
- msg_in => 'Run Test',
- check_this_in => temp_bool);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnull (
- msg_in => 'Not Used',
- check_this_in => FALSE);
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnull (
- msg_in => 'Not Used',
- check_this_in => FALSE,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1';
- isnull (
- msg_in => 'Run Test',
- check_this_in => cast (null as CLOB));
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected NULL and got ""');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnull (
- msg_in => 'Not Used',
- check_this_in => temp_clob1);
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnull (
- msg_in => 'Not Used',
- check_this_in => temp_clob1,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1';
- isnull (
- msg_in => 'Run Test',
- check_this_in => cast (null as BLOB));
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'ISNULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'BLOB is NULL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- isnull (
- msg_in => 'Not Used',
- check_this_in => temp_blob1);
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- isnull (
- msg_in => 'Not Used',
- check_this_in => temp_blob1,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'g_rec.last_pass',
- check_this_in => g_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- end t_isnull;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Check a given call raises an exception
-procedure raises (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in varchar2)
-is
- l_sqlerrm varchar2(4000);
- l_errstack varchar2(4000);
-begin
- begin
- execute immediate check_call_in;
- exception when OTHERS then
- l_sqlerrm := SQLERRM;
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace
- ,1,4000);
- end;
- --
- g_rec.last_assert := 'RAISES/THROWS';
- g_rec.last_msg := msg_in;
- if against_exc_in is null AND l_sqlerrm is null
- then
- -- Both are Null
- g_rec.last_pass := TRUE;
- elsif against_exc_in is null OR l_sqlerrm is null
- then
- -- If both were Null, it would have been caught above.
- -- So, only one can be Null
- g_rec.last_pass := FALSE;
- else
- -- If either was Null, it would have been caught above.
- g_rec.last_pass := l_sqlerrm like '%' || against_exc_in || '%';
- end if;
- if against_exc_in is null
- then
- g_rec.last_details := 'No exception was expected' ||
- '. Exception raised was "' || l_sqlerrm ||
- '". Exception raised by: "' || check_call_in || '".';
- elsif l_sqlerrm is null
- then
- g_rec.last_details := 'Expected exception "%' || against_exc_in ||
- '%". No exception was raised by: "' || check_call_in || '".';
- else
- g_rec.last_details := 'Expected exception "%' || against_exc_in ||
- '%". Actual exception raised was "' || l_sqlerrm ||
- '". Exception raised by: "' || check_call_in || '".';
- end if;
- if not g_rec.last_pass
- then
- g_rec.last_details :=
- substr(g_rec.last_details || ' Error Stack: ' || l_errstack, 1, 4000);
- end if;
- process_assertion;
-end raises;
-
-procedure raises (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in number)
-is
-begin
- if against_exc_in is null
- then
- raises (
- msg_in => msg_in,
- check_call_in => check_call_in,
- against_exc_in => '');
- else
- raises (
- msg_in => msg_in,
- check_call_in => check_call_in,
- against_exc_in => '-' || lpad(abs(against_exc_in),5,'0'));
- end if;
-end raises;
-
-procedure throws (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in varchar2)
-is
-begin
- raises (
- msg_in => msg_in,
- check_call_in => check_call_in,
- against_exc_in => against_exc_in);
-end throws;
-
-procedure throws (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in number)
-is
-begin
- raises (
- msg_in => msg_in,
- check_call_in => check_call_in,
- against_exc_in => against_exc_in);
-end throws;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_raises
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Raises Tests Happy Path 1';
- raises (
- msg_in => 'RAISES Varchar2 Test',
- check_call_in => 'begin wt_assert.bogus; end;',
- against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'RAISES/THROWS');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'RAISES Varchar2 Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
- 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Raises Tests Happy Path 2';
- raises (
- msg_in => 'RAISES Number Test',
- check_call_in => 'begin wt_assert.bogus; end;',
- against_exc_in => 302);
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%-00302%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
- -------------------------------------- WTPLSQL Testing --
- throws (
- msg_in => 'THROWS Varchar2 Test',
- check_call_in => 'begin wt_assert.bogus; end;',
- against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
- -------------------------------------- WTPLSQL Testing --
- throws (
- msg_in => 'THROWS Number Test',
- check_call_in => 'begin wt_assert.bogus; end;',
- against_exc_in => 302);
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%-00302%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Raises Tests Happy Path 3';
- raises (
- msg_in => 'RAISES Varchar2 No Error',
- check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
- against_exc_in => '');
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details,
- against_this_in => 'No exception was expected. ' ||
- 'Exception raised was "". ' ||
- 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
- -------------------------------------- WTPLSQL Testing --
- raises (
- msg_in => 'RAISES Number No Error',
- check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
- against_exc_in => cast (null as number));
- temp_rec := g_rec;
- wt_assert.eq (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details,
- against_this_in => 'No exception was expected. ' ||
- 'Exception raised was "". ' ||
- 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Raises Tests Sad Path 1';
- wtplsql_skip_save := TRUE;
- raises (
- msg_in => 'Not Used',
- check_call_in => 'begin wt_assert.bogus; end;',
- against_exc_in => 'Incorrect Exception');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected exception "%Incorrect Exception%". ' ||
- 'Actual exception raised was "ORA-%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Raises Tests Sad Path 2';
- wtplsql_skip_save := TRUE;
- raises (
- msg_in => 'Not Used',
- check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT; end;',
- against_exc_in => 'Incorrect Exception');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%Incorrect Exception%". ' ||
- 'No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". ' ||
- 'Error Stack: ');
- end t_raises;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- EQQUERYVALUE
-procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in varchar2,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
- type rc_type is ref cursor;
- l_rc rc_type;
- l_rc_buff varchar2(32000);
- l_errstack varchar2(4000);
-begin
- g_rec.last_assert := 'EQQUERYVALUE';
- g_rec.last_msg := msg_in;
- open l_rc for check_query_in;
- fetch l_rc into l_rc_buff;
- close l_rc;
- g_rec.last_pass := ( l_rc_buff = against_value_in
- or ( l_rc_buff is null
- and against_value_in is null
- and null_ok_in ) );
- g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
- '" and got "' || substr(l_rc_buff ,1,1000) ||
- '" for Query: ' || substr(check_query_in ,1,1000) ;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
- g_rec.last_details := 'Exception raised for Query: ' ||
- substr(check_query_in ,1,1000) ||
- CHR(10) || l_errstack;
- g_rec.last_pass := FALSE;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqqueryvalue;
-
--- EQQUERYVALUE XMLTYPE Overload
-procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in XMLTYPE,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
- type rc_type is ref cursor;
- l_rc rc_type;
- l_rc_buff XMLTYPE;
- l_errstack varchar2(4000);
-begin
- g_rec.last_assert := 'EQQUERYVALUE';
- g_rec.last_msg := msg_in;
- open l_rc for check_query_in;
- fetch l_rc into l_rc_buff;
- close l_rc;
- g_rec.last_pass := (xmltype.getclobval(l_rc_buff) =
- xmltype.getclobval(against_value_in) );
- g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) ||
- '" and got "' || substr(xmltype.getclobval(l_rc_buff ),1,1000) ||
- '" for Query: ' || substr( check_query_in ,1,1000) ;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
- g_rec.last_details := 'Exception raised for Query: ' ||
- substr(check_query_in ,1,1000) ||
- CHR(10) || l_errstack;
- g_rec.last_pass := FALSE;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqqueryvalue;
-
--- EQQUERYVALUE CLOB Overload
-procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in CLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
- type rc_type is ref cursor;
- l_rc rc_type;
- l_rc_buff CLOB;
- l_errstack varchar2(4000);
-begin
- g_rec.last_assert := 'EQQUERYVALUE';
- g_rec.last_msg := msg_in;
- open l_rc for check_query_in;
- fetch l_rc into l_rc_buff;
- close l_rc;
- g_rec.last_pass := ( l_rc_buff = against_value_in
- or ( l_rc_buff is null
- and against_value_in is null
- and null_ok_in ) );
- g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
- '" and got "' || substr(l_rc_buff ,1,1000) ||
- '" for Query: ' || substr(check_query_in ,1,1000) ;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
- g_rec.last_details := 'Exception raised for Query: ' ||
- substr(check_query_in ,1,1000) ||
- CHR(10) || l_errstack;
- g_rec.last_pass := FALSE;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqqueryvalue;
-
--- EQQUERYVALUE BLOB Overload
-procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in BLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false)
-is
- type rc_type is ref cursor;
- l_rc rc_type;
- l_rc_buff BLOB;
- compare_results number;
- l_errstack varchar2(4000);
-begin
- g_rec.last_assert := 'EQQUERYVALUE';
- g_rec.last_msg := msg_in;
- open l_rc for check_query_in;
- fetch l_rc into l_rc_buff;
- close l_rc;
- compare_results := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1);
- g_rec.last_pass := ( (compare_results = 0)
- or ( l_rc_buff is null
- and against_value_in is null
- and null_ok_in ) );
- g_rec.last_details := 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
- substr(check_query_in ,1,2000) ||
- ', compare_results: ' || compare_results;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
- g_rec.last_details := 'Exception raised for Query: ' ||
- substr(check_query_in ,1,1000) ||
- CHR(10) || l_errstack;
- g_rec.last_pass := FALSE;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqqueryvalue;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_eqqueryvalue
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select dummy from DUAL',
- against_value_in => 'X',
- null_ok_in => false);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQQUERYVALUE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Expected "X" and got "X" for Query: select dummy from DUAL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select max(dummy) from DUAL where 0 = 1',
- against_value_in => '',
- null_ok_in => true);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select dummy from DUAL',
- against_value_in => 'Y');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select dummy from DUAL',
- against_value_in => 'Y',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'Garbage query that won''t work',
- against_value_in => 'Y');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details like
- 'Exception raised for Query: Garbage query that won''t work' ||
- CHR(10) || 'ORA-00900: invalid SQL statement%');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select temp_xml from wt_self_test where id = 1',
- against_value_in => temp_xml1);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQQUERYVALUE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_xml from wt_self_test where id = 1',
- against_value_in => temp_xml2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "<?xml version="1.0" encoding="UTF-8"?>' ||
- '<note>2</note>" and got "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_xml from wt_self_test where id = 1',
- against_value_in => temp_xml2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'Garbage query that won''t work',
- against_value_in => temp_xml2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details like
- 'Exception raised for Query: Garbage query that won''t work' ||
- CHR(10) || 'ORA-00900: invalid SQL statement%');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select temp_clob from wt_self_test where id = 1',
- against_value_in => temp_clob1,
- null_ok_in => false);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQQUERYVALUE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select temp_clob from wt_self_test where 0 = 1',
- against_value_in => '',
- null_ok_in => true);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_clob from wt_self_test where id = 1',
- against_value_in => temp_clob2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected "This is another clob." and got "' ||
- '<?xml version="1.0" encoding="UTF-8"?>%'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_clob from wt_self_test where id = 1',
- against_value_in => temp_clob2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'Garbage query that won''t work',
- against_value_in => temp_clob2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details like
- 'Exception raised for Query: Garbage query that won''t work' ||
- CHR(10) || 'ORA-00900: invalid SQL statement%');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select temp_blob from wt_self_test where id = 1',
- against_value_in => temp_blob1,
- null_ok_in => false);
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQQUERYVALUE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query:' ||
- ' select temp_blob from wt_self_test where id = 1, compare_results: 0');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2';
- eqqueryvalue (
- msg_in => 'Run Test',
- check_query_in => 'select temp_blob from wt_self_test where 0 = 1',
- against_value_in => cast (null as BLOB),
- null_ok_in => true);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_blob from wt_self_test where id = 1',
- against_value_in => temp_blob2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
- 'select temp_blob from wt_self_test where id = 1, compare_results: -1');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'select temp_blob from wt_self_test where id = 1',
- against_value_in => temp_blob2,
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqqueryvalue (
- msg_in => 'Not Used',
- check_query_in => 'Garbage query that won''t work',
- against_value_in => temp_blob2);
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details like
- 'Exception raised for Query: Garbage query that won''t work' ||
- CHR(10) || 'ORA-00900: invalid SQL statement%');
- end t_eqqueryvalue;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure eqquery (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_query_in in varchar2,
- raise_exc_in in boolean := false)
-is
-begin
- g_rec.last_assert := 'EQQUERY';
- g_rec.last_msg := msg_in;
- compare_queries(check_query_in, against_query_in);
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqquery;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_eqquery
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1';
- wt_assert.eqquery (
- msg_in => 'Run Test',
- check_query_in => 'select * from USER_TABLES',
- against_query_in => 'select * from USER_TABLES');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQQUERY');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'EQQUERY Tests Happy Path 1b g_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Comparison Query: %'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqquery (
- msg_in => 'Not Used',
- check_query_in => 'select * from USER_TABLES',
- against_query_in => 'select * from USER_TABLES where 0 = 1');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Comparison Query: %'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqquery (
- msg_in => 'Not Used',
- check_query_in => 'select * from USER_TABLES',
- against_query_in => 'select * from USER_TABLES where 0 = 1',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqquery (
- msg_in => 'Not Used',
- check_query_in => 'select * from USER_TABLES',
- against_query_in => 'select * from ALL_TABLES');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- '%PL/SQL: ORA-01789: query block has incorrect number of result columns%'));
- end t_eqquery;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure eqtable (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- check_where_in in varchar2 := null,
- against_where_in in varchar2 := null,
- raise_exc_in in boolean := false)
-is
- l_check_query varchar2(16000) := 'select * from ' || check_this_in;
- l_against_query varchar2(16000) := 'select * from ' || against_this_in;
-begin
- g_rec.last_assert := 'EQTABLE';
- g_rec.last_msg := msg_in;
- if check_where_in is not null
- then
- l_check_query := l_check_query || ' where ' || check_where_in;
- end if;
- if against_where_in is not null
- then
- l_against_query := l_against_query || ' where ' || against_where_in;
- end if;
- compare_queries(l_check_query, l_against_query);
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqtable;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_eqtable
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1';
- wt_assert.eqtable (
- msg_in => 'Run Test',
- check_this_in => 'USER_TABLES',
- against_this_in => 'USER_TABLES',
- check_where_in => '',
- against_where_in => '');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQTABLE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Comparison Query: %'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2';
- eqtable (
- msg_in => 'Run Test',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''' || USER || '''',
- against_where_in => 'owner = ''' || USER || '''');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABLE Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqtable (
- msg_in => 'Not Used',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''' || USER || '''',
- against_where_in => '0 = 1');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Comparison Query: %'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABLE Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqtable (
- msg_in => 'Not Used',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''' || USER || '''',
- against_where_in => '0 = 1',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABLE Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqtable (
- msg_in => 'Not Used',
- check_this_in => 'USER_TABLES',
- against_this_in => 'ALL_TABLES');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details like
- '%PL/SQL: ORA-01789: query block has incorrect number of result columns%');
- end t_eqtable;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure eqtabcount (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- check_where_in in varchar2 := null,
- against_where_in in varchar2 := null,
- raise_exc_in in boolean := false)
-is
- l_query varchar2(16000) := 'select count(*) from ' || check_this_in;
- l_cnt number;
- l_success boolean;
- l_check_cnt number;
- procedure l_run_query is
- type rc_type is ref cursor;
- l_rc rc_type;
- begin
- open l_rc for l_query;
- fetch l_rc into l_cnt;
- close l_rc;
- l_success := TRUE;
- exception
- when OTHERS
- then
- g_rec.last_details := SQLERRM || CHR(10) ||
- 'FAILURE of Compare Query: ' || l_query || ';';
- g_rec.last_pass := FALSE;
- l_success := FALSE;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
- end l_run_query;
-begin
- g_rec.last_assert := 'EQTABCOUNT';
- g_rec.last_msg := msg_in;
- --
- l_query := 'select count(*) from ' || check_this_in;
- if check_where_in is not null
- then
- l_query := l_query || ' where ' || check_where_in;
- end if;
- l_run_query;
- if NOT l_success then return; end if;
- l_check_cnt := l_cnt;
- --
- l_query := 'select count(*) from ' || against_this_in;
- if against_where_in is not null
- then
- l_query := l_query || ' where ' || against_where_in;
- end if;
- l_run_query;
- if NOT l_success then return; end if;
- g_rec.last_pass := (l_check_cnt = l_cnt);
- --
- g_rec.last_details := 'Expected ' || l_cnt || ' rows from "' || against_this_in ||
- '" and got ' || l_check_cnt || ' rows from "' || check_this_in ||
- '"';
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end eqtabcount;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_eqtabcount
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1';
- eqtabcount (
- msg_in => 'Run Test',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''' || USER || '''',
- against_where_in => 'owner = ''' || USER || '''');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'EQTABCOUNT');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected % rows from "ALL_TABLES"' ||
- ' and got % rows from "ALL_TABLES"'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2';
- eqtabcount (
- msg_in => 'Run Test',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'USER_TABLES',
- check_where_in => 'owner = ''' || USER || '''',
- against_where_in => '');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1';
- wtplsql_skip_save := TRUE;
- eqtabcount (
- msg_in => 'Not Used',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''JOHN DOE''',
- against_where_in => 'owner = ''' || USER || '''');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected % rows from "ALL_TABLES" and ' ||
- 'got % rows from "ALL_TABLES"'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- eqtabcount (
- msg_in => 'Not Used',
- check_this_in => 'ALL_TABLES',
- against_this_in => 'ALL_TABLES',
- check_where_in => 'owner = ''JOHN DOE''',
- against_where_in => 'owner = ''' || USER || '''',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3';
- wtplsql_skip_save := TRUE;
- eqtabcount (
- msg_in => 'Not Used',
- check_this_in => 'USER_TABLES',
- against_this_in => 'USER_TAB_COLUMNS');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- 'Expected % rows from "USER_TAB_COLUMNS" and got % rows from "USER_TABLES"'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4';
- wtplsql_skip_save := TRUE;
- eqtabcount (
- msg_in => 'Not Used',
- check_this_in => 'BOGUS1',
- against_this_in => 'BOGUS2');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.isnotnull (
- msg_in => 'temp_rec.last_details value',
- check_this_in => temp_rec.last_details);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.this (
- msg_in => 'temp_rec.last_details',
- check_this_in => (temp_rec.last_details like
- '%table or view does not exist%'));
- wt_assert.this (
- msg_in => 'temp_rec.last_details 2',
- check_this_in => (temp_rec.last_details like
- '%FAILURE of Compare Query%'));
- end t_eqtabcount;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure objexists (
- msg_in in varchar2,
- obj_owner_in in varchar2,
- obj_name_in in varchar2,
- obj_type_in in varchar2 default null,
- raise_exc_in in boolean := false)
-is
- l_num_objects number;
-begin
- g_rec.last_assert := 'OBJEXISTS';
- g_rec.last_msg := msg_in;
- select count(*) into l_num_objects
- from all_objects
- where object_name = obj_name_in
- and ( obj_owner_in is null
- or obj_owner_in = owner)
- and ( obj_type_in is null
- or obj_type_in = object_type);
- g_rec.last_pass := case l_num_objects when 0 then FALSE else TRUE end;
- g_rec.last_details := 'Number of objects found for "' ||
- case when obj_owner_in is null then ''
- else obj_owner_in || '.' end ||
- obj_name_in || '"' ||
- case when obj_type_in is null then ''
- else '(' || obj_type_in || ')' end ||
- ' is ' || l_num_objects;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end objexists;
-
--- Concatenated SCHEMA_NAME.OBJECT_NAME
-procedure objexists (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
- l_pos number := instr(check_this_in, '.');
-begin
- objexists(msg_in => msg_in
- ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
- ,obj_name_in => substr(check_this_in, l_pos+1, length(check_this_in)));
-end objexists;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_object_exists
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Happy Path 1';
- objexists (
- msg_in => 'Run Test',
- obj_owner_in => 'SYS',
- obj_name_in => 'DUAL');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'OBJEXISTS');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Happy Path 2';
- objexists (
- msg_in => 'Run Test',
- obj_owner_in => 'SYS',
- obj_name_in => 'DUAL',
- obj_type_in => 'TABLE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Happy Path 3';
- objexists (
- msg_in => 'Run Test',
- check_this_in => 'SYS.DUAL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Happy Path 4';
- objexists (
- msg_in => 'Run Test',
- check_this_in => 'DUAL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Sad Path 1';
- wtplsql_skip_save := TRUE;
- objexists (
- msg_in => 'Not Used',
- obj_owner_in => 'JOE SMITH',
- obj_name_in => 'BOGUS');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Number of objects found for "JOE SMITH.BOGUS" is 0');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJEXISTS Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- objexists (
- msg_in => 'Not Used',
- obj_owner_in => 'JOE SMITH',
- obj_name_in => 'BOGUS',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- end t_object_exists;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure objnotexists (
- msg_in in varchar2,
- obj_owner_in in varchar2,
- obj_name_in in varchar2,
- obj_type_in in varchar2 default null,
- raise_exc_in in boolean := false)
-is
- l_num_objects number;
-begin
- g_rec.last_assert := 'OBJNOTEXISTS';
- g_rec.last_msg := msg_in;
- select count(*) into l_num_objects
- from all_objects
- where object_name = obj_name_in
- and ( obj_owner_in is null
- or obj_owner_in = owner)
- and ( obj_type_in is null
- or obj_type_in = object_type);
- g_rec.last_pass := case l_num_objects when 0 then TRUE else FALSE end;
- g_rec.last_details := 'Number of objects found for "' ||
- case when obj_owner_in is null then ''
- else obj_owner_in || '.' end ||
- obj_name_in || '"' ||
- case when obj_type_in is null then ''
- else '(' || obj_type_in || ')' end ||
- ' is ' || l_num_objects;
- g_rec.raise_exception := raise_exc_in;
- process_assertion;
-end objnotexists;
-
--- Concatenated SCHEMA_NAME.OBJECT_NAME
-procedure objnotexists (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false)
-is
- l_pos number := instr(check_this_in, '.');
-begin
- objnotexists(msg_in => msg_in
- ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
- ,obj_name_in => substr(check_this_in, l_pos+1, length(check_this_in)));
-end objnotexists;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_object_not_exists
- is
- l_found_exception BOOLEAN;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1';
- objnotexists (
- msg_in => 'Run Test',
- obj_owner_in => 'BOGUS',
- obj_name_in => 'THING123');
- temp_rec := g_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => TRUE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_assert',
- check_this_in => temp_rec.last_assert,
- against_this_in => 'OBJNOTEXISTS');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_msg',
- check_this_in => temp_rec.last_msg,
- against_this_in => 'Run Test');
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Number of objects found for "BOGUS.THING123" is 0');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2';
- objnotexists (
- msg_in => 'Run Test',
- obj_owner_in => 'BOGUS',
- obj_name_in => 'THING123',
- obj_type_in => 'PACKAGE');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3';
- objnotexists (
- msg_in => 'Run Test',
- check_this_in => 'BOGUS.THING123');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1';
- wtplsql_skip_save := TRUE;
- objnotexists (
- msg_in => 'Not Used',
- obj_owner_in => 'SYS',
- obj_name_in => 'DUAL');
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'temp_rec.last_details',
- check_this_in => temp_rec.last_details,
- against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2';
- wtplsql_skip_save := TRUE;
- begin
- objnotexists (
- msg_in => 'Not Used',
- obj_owner_in => 'SYS',
- obj_name_in => 'DUAL',
- raise_exc_in => TRUE);
- l_found_exception := FALSE;
- exception when ASSERT_FAILURE_EXCEPTION then
- l_found_exception := TRUE;
- end;
- -------------------------------------- WTPLSQL Testing --
- temp_rec := g_rec;
- wtplsql_skip_save := FALSE;
- wt_assert.eq (
- msg_in => 'temp_rec.last_pass',
- check_this_in => temp_rec.last_pass,
- against_this_in => FALSE);
- wt_assert.eq (
- msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
- check_this_in => l_found_exception,
- against_this_in => TRUE);
- end t_object_not_exists;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- -- Can't profile this package because all the "assert" tests
- -- pause profiling before they execute.
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %--
- is
- begin
- select temp_clob, temp_nclob, temp_xml, temp_blob
- into temp_clob1, temp_nclob1, temp_xml1, temp_blob1
- from wt_self_test where id = 1;
- -------------------------------------- WTPLSQL Testing --
- t_boolean_to_status;
- t_process_assertion;
- t_compare_queries;
- t_nls_settings;
- t_last_values;
- t_reset_globals;
- t_this;
- t_eq;
- t_isnotnull;
- t_isnull;
- -------------------------------------- WTPLSQL Testing --
- t_raises;
- t_eqqueryvalue;
- t_eqquery;
- t_eqtable;
- t_eqtabcount;
- t_object_exists;
- t_object_not_exists;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_assert;
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/headerBg.jpg b/docs/core/DBDocs/package body/WT_ASSERT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/report.css b/docs/core/DBDocs/package body/WT_ASSERT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WT_ASSERT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/report.js b/docs/core/DBDocs/package body/WT_ASSERT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WT_ASSERT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabBg.gif b/docs/core/DBDocs/package body/WT_ASSERT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabL.gif b/docs/core/DBDocs/package body/WT_ASSERT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabR.gif b/docs/core/DBDocs/package body/WT_ASSERT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topTabBg.gif b/docs/core/DBDocs/package body/WT_ASSERT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topTabL.gif b/docs/core/DBDocs/package body/WT_ASSERT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_ASSERT/topTabR.gif b/docs/core/DBDocs/package body/WT_ASSERT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WT_ASSERT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER.html b/docs/core/DBDocs/package body/WT_PROFILER.html
deleted file mode 100644
index 807c74b..0000000
--- a/docs/core/DBDocs/package body/WT_PROFILER.html
+++ /dev/null
@@ -1,2167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_PROFILER |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41933 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:09:17 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:17 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:17 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_PROFILER |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wt_profiler
-as
-
- TYPE rec_type is record
- (test_run_id wt_test_runs.id%TYPE
- ,dbout_owner wt_test_runs.dbout_owner%TYPE
- ,dbout_name wt_test_runs.dbout_name%TYPE
- ,dbout_type wt_test_runs.dbout_type%TYPE
- ,prof_runid binary_integer
- ,trigger_offset binary_integer
- ,error_message varchar2(4000));
- g_rec rec_type;
-
- TYPE ignr_aa_type is table
- of varchar2(1)
- index by PLS_INTEGER;
- g_ignr_aa ignr_aa_type;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_insert boolean := FALSE;
- g_skip_add boolean := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-----------------------
--- Private Procedures
-----------------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
-
- procedure tl_compile_db_object
- (in_ptype in varchar2
- ,in_pname in varchar2
- ,in_source in varchar2)
- is
- l_sql_txt varchar2(4000);
- l_errtxt varchar2(32000) := '';
- begin
- -------------------------------------- WTPLSQL Testing --
- -- Wrap in_source to complete the DDL statement
- l_sql_txt := 'create or replace ' || in_ptype || ' ' ||
- in_pname || ' is' || CHR(10) ||
- in_source || CHR(10) ||
- 'end ' || in_pname || ';';
- wt_assert.raises
- (msg_in => 'Compile ' || in_ptype || ' ' || in_pname
- ,check_call_in => l_sql_txt
- ,against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- for buff in (select * from user_errors
- where attribute = 'ERROR'
- and name = in_pname
- and type = in_ptype
- order by sequence)
- loop
- l_errtxt := l_errtxt || buff.line || ', ' ||
- buff.position || ': ' || buff.text || CHR(10);
- end loop;
- wt_assert.isnull
- (msg_in => 'Compile ' || in_ptype || ' ' || in_pname ||
- ' Error'
- ,check_this_in => l_errtxt);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.objexists (
- msg_in => in_pname || ' ' || in_ptype,
- obj_owner_in => USER,
- obj_name_in => upper(in_pname),
- obj_type_in => upper(in_ptype));
- end tl_compile_db_object;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_drop_db_object
- (in_pname in varchar2,
- in_ptype in varchar2)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
- wt_assert.raises
- (msg_in => 'drop ' || in_ptype || ' ' || in_pname
- ,check_call_in => l_sql_txt
- ,against_exc_in => '');
- wt_assert.objnotexists (
- msg_in => in_pname || ' ' || in_ptype,
- obj_owner_in => USER,
- obj_name_in => upper(in_pname),
- obj_type_in => upper(in_ptype));
- end tl_drop_db_object;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_count_plsql_profiler_recs
- (in_test_run_id in number
- ,in_expected_count in number)
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue
- (msg_in => 'Number of plsql_profiler_runs (' || in_test_run_id || ')'
- ,check_query_in => 'select count(*) from plsql_profiler_runs' ||
- ' where runid = ' || in_test_run_id
- ,against_value_in => in_expected_count);
- wt_assert.eqqueryvalue
- (msg_in => 'Number of plsql_profiler_units (' || in_test_run_id || ')'
- ,check_query_in => 'select count(*) from plsql_profiler_units' ||
- ' where runid = ' || in_test_run_id
- ,against_value_in => in_expected_count);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue
- (msg_in => 'Number of plsql_profiler_data (' || in_test_run_id || ')'
- ,check_query_in => 'select count(*) from plsql_profiler_data' ||
- ' where runid = ' || in_test_run_id
- ,against_value_in => in_expected_count);
- end tl_count_plsql_profiler_recs;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_insert_plsql_profiler_recs
- (in_test_run_id in number)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into plsql_profiler_runs (runid)' ||
- ' values (' || in_test_run_id || ')';
- wt_assert.raises (
- msg_in => 'insert plsql_profiler_runs (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' ||
- ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
- wt_assert.raises (
- msg_in => 'insert plsql_profiler_units (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' ||
- ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
- wt_assert.raises (
- msg_in => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- commit;
- end tl_insert_plsql_profiler_recs;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_delete_plsql_profiler_recs
- (in_test_run_id in number)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from plsql_profiler_data' ||
- ' where runid = ' || in_test_run_id;
- wt_assert.raises (
- msg_in => 'delete plsql_profiler_data (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from plsql_profiler_units' ||
- ' where runid = ' || in_test_run_id;
- wt_assert.raises (
- msg_in => 'delete plsql_profiler_units (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from plsql_profiler_runs' ||
- ' where runid = ' || in_test_run_id;
- wt_assert.raises (
- msg_in => 'delete plsql_profiler_runs (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- commit;
- end tl_delete_plsql_profiler_recs;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_insert_test_runs
- (in_test_run_id in NUMBER
- ,in_runner_name in varchar2)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into wt_test_runs' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || in_test_run_id || ', sysdate, USER, ''' ||
- in_runner_name || ''')';
- wt_assert.raises (
- msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- wt_assert.eqqueryvalue (
- msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || in_test_run_id,
- against_value_in => 1);
- commit;
- end tl_insert_test_runs;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_delete_test_runs
- (in_test_run_id in NUMBER)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
- wt_assert.raises (
- msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- wt_assert.eqqueryvalue (
- msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || in_test_run_id,
- against_value_in => 0);
- commit;
- end tl_delete_test_runs;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_insert_dbout_profiles
- (in_rec in wt_dbout_profiles%ROWTYPE)
- is
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- begin
- insert into wt_dbout_profiles values in_rec;
- l_sqlerrm := SQLERRM;
- commit;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Insert wt_dbout_profiles (' || in_rec.test_run_id ||
- ',' || in_rec.line || ')',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles (' || in_rec.test_run_id ||
- ',' || in_rec.line || ') Count',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || in_rec.test_run_id ||
- ' and line = ' || in_rec.line,
- against_value_in => 1);
- end tl_insert_dbout_profiles;
---==============================================================--
- -------------------------------------- WTPLSQL Testing --
- procedure tl_delete_dbout_profiles
- (in_test_run_id in NUMBER)
- is
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' ||
- in_test_run_id;
- wt_assert.raises (
- msg_in => 'Delete wt_dbout_profiles (' || in_test_run_id || ')',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles (' || in_test_run_id || ') Count',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || in_test_run_id,
- against_value_in => 0);
- commit;
- end tl_delete_dbout_profiles;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-------------------------------------------------------------
--- Return DBMS_PROFILER specific error messages
-function get_error_msg
- (retnum_in in binary_integer)
- return varchar2
-is
- l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: ';
-begin
- case retnum_in
- when dbms_profiler.error_param then return l_msg_prefix ||
- 'A subprogram was called with an incorrect parameter.';
- when dbms_profiler.error_io then return l_msg_prefix ||
- 'Data flush operation failed.' ||
- ' Check whether the profiler tables have been created,' ||
- ' are accessible, and that there is adequate space.';
- when dbms_profiler.error_version then return l_msg_prefix ||
- 'There is a mismatch between package and database implementation.' ||
- ' Oracle returns this error if an incorrect version of the' ||
- ' DBMS_PROFILER package is installed, and if the version of the' ||
- ' profiler package cannot work with this database version.';
- else return l_msg_prefix ||
- 'Unknown error number ' || retnum_in;
- end case;
-end get_error_msg;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_get_error_msg
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Get Error Messages';
- wt_assert.isnotnull (
- msg_in => 'ERROR_PARAM Test 1',
- check_this_in => get_error_msg(dbms_profiler.error_param));
- wt_assert.this (
- msg_in => 'ERROR_PARAM Test 2',
- check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param)
- ,'incorrect parameter','i'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'ERROR_IO Test 1',
- check_this_in => get_error_msg(dbms_profiler.error_io));
- wt_assert.this (
- msg_in => 'ERROR_IO Test 2',
- check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io)
- ,'Data flush operation','i'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'ERROR_VERSION Test 1',
- check_this_in => get_error_msg(dbms_profiler.error_version));
- wt_assert.this (
- msg_in => 'ERROR_VERSION Test 2',
- check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version)
- ,'incorrect version','i'));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'Unknown Error Test 1',
- check_this_in => get_error_msg(-9999));
- wt_assert.this (
- msg_in => 'Unknown Error Test 2',
- check_this_in => regexp_like(get_error_msg(-9999)
- ,'Unknown error','i'));
- end t_get_error_msg;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_plsql_profiler_recs
- (in_profiler_runid in number)
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
-begin
- delete from plsql_profiler_data
- where runid = in_profiler_runid;
- delete from plsql_profiler_units
- where runid = in_profiler_runid;
- delete from plsql_profiler_runs
- where runid = in_profiler_runid;
- COMMIT;
-end delete_plsql_profiler_recs;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_profiler_recs
- is
- c_test_run_id constant number := -99;
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
- begin
- delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1',
- check_this_in => l_err_stack);
- tl_count_plsql_profiler_recs(c_test_run_id, 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
- tl_insert_plsql_profiler_recs(c_test_run_id);
- tl_count_plsql_profiler_recs(c_test_run_id, 1);
- begin
- delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2',
- check_this_in => l_err_stack);
- tl_count_plsql_profiler_recs(c_test_run_id, 0);
- end t_delete_profiler_recs;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure find_dbout
- (in_pkg_name in varchar2)
-is
- --
- -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
- -- Within a namespace, no two objects can have the same name. The following
- -- schema objects share one namespace:
- -- -) Packages
- -- -) Private synonyms
- -- -) Sequences
- -- -) Stand-alone procedures
- -- -) Stand-alone stored functions
- -- -) User-defined operators
- -- -) User-defined types
- -- -) Tables
- -- -) Views
- -- Each of the following schema objects has its own namespace:
- -- -) Clusters
- -- -) Constraints
- -- -) Database triggers
- -- -) Dimensions
- -- -) Indexes
- -- -) Materialized views (When you create a materialized view, the database
- -- creates an internal table of the same name. This table has the same
- -- namespace as the other tables in the schema. Therefore, a schema
- -- cannot contain a table and a materialized view of the same name.)
- -- -) Private database links
- -- Because tables and sequences are in the same namespace, a table and a
- -- sequence in the same schema cannot have the same name. However, tables
- -- and indexes are in different namespaces. Therefore, a table and an index
- -- in the same schema can have the same name.
- -- Each schema in the database has its own namespaces for the objects it
- -- contains. This means, for example, that two tables in different schemas
- -- are in different namespaces and can have the same name.
- -- Results are unknown if a Database Object Under Test has the same name in
- -- different namespaces.
- --
- -- Head Regular Expression is
- -- '--% WTPLSQL SET DBOUT "' - literal string
- -- Main Regular Expression is
- -- '[[:alnum:] ._$#:]' - Any alpha, numeric, " ", ".", "_", "$", "#", or ":" character
- -- + - One or more of the previous characters
- -- Tail Regular Expression is
- -- '" %--' - literal string
- C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "';
- C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+';
- C_TAIL_RE CONSTANT varchar2(30) := '" %--';
- -- This cursor is used to catch the first occurance of a DBOUT annotation
- cursor c_annotation is
- select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT
- from dba_source src
- where src.owner = USER
- and src.name = in_pkg_name
- and src.type = 'PACKAGE BODY'
- and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)
- order by src.line;
- l_target varchar2(32000);
- -- This cursor is used to confirm the PL/SQL source is readable
- cursor c_readable is
- select *
- from dba_source src
- where src.owner = g_rec.dbout_owner
- and src.name = g_rec.dbout_name
- and src.type = g_rec.dbout_type;
- b_readable c_readable%ROWTYPE;
- -- These hold the positions of the separators dot (.) and colon (:)
- l_dot_pos number;
- l_cln_pos number;
-begin
- -- Find the first occurance of the DBOUT annotation
- open c_annotation;
- fetch c_annotation into l_target;
- if c_annotation%NOTFOUND
- then
- -- No annotation was found, close and end
- close c_annotation;
- return;
- end if;
- close c_annotation;
- -- Strip the Head Sub-String
- l_target := regexp_replace(SRCSTR => l_target
- ,PATTERN => '^' || C_HEAD_RE
- ,REPLACESTR => ''
- ,POSITION => 1
- ,OCCURRENCE => 1);
- -- Strip the Tail Sub-String
- l_target := regexp_replace(SRCSTR => l_target
- ,PATTERN => C_TAIL_RE || '$'
- ,REPLACESTR => ''
- ,POSITION => 1
- ,OCCURRENCE => 1);
- -- Locate the Owner/Name separator
- l_dot_pos := instr(l_target,'.');
- l_cln_pos := instr(l_target,':');
- begin
- select obj.owner
- ,obj.object_name
- ,obj.object_type
- into g_rec.dbout_owner
- ,g_rec.dbout_name
- ,g_rec.dbout_type
- from dba_objects obj
- where ( ( -- No separators were given, assume USER is the owner.
- -- No object type was given. This could throw TOO_MANY_ROWS.
- l_dot_pos = 0
- and l_cln_pos = 0
- and obj.owner = USER
- and obj.object_name = l_target )
- OR ( -- No object type was given. This could throw TOO_MANY_ROWS.
- l_dot_pos != 0
- and l_cln_pos = 0
- and obj.owner = substr(l_target, 1, l_dot_pos-1)
- and obj.object_name = substr(l_target, l_dot_pos+1, 512) )
- OR ( -- No object owner was given, assume USER is the owner.
- l_dot_pos = 0
- and l_cln_pos != 0
- and obj.owner = USER
- and obj.object_name = substr(l_target, 1, l_cln_pos-1)
- and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
- OR ( -- All separators were given
- l_dot_pos != 0
- and l_cln_pos != 0
- and obj.owner = substr(l_target, 1, l_dot_pos-1)
- and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
- and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
- );
- exception
- when NO_DATA_FOUND
- then
- g_rec.error_message := 'Unable to find database object "' ||
- l_target || '".';
- return;
- when TOO_MANY_ROWS
- then
- g_rec.error_message := 'Found too many database objects "' ||
- l_target || '".';
- return;
- end;
- -- Find the first occurance of any PL/SQL source
- open c_readable;
- fetch c_readable into b_readable;
- if c_readable%NOTFOUND
- then
- if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY',
- 'TYPE BODY', 'TRIGGER')
- then
- -- These object types should have PL/SQL source code available
- --%WTPLSQL_begin_ignore_lines%-- Untestable:
- g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type ||
- ' ' || g_rec.dbout_owner || '.' || g_rec.dbout_name ;
- --%WTPLSQL_end_ignore_lines%--
- else
- g_rec.prof_runid := -1; -- Don't run profiler.
- end if;
- end if;
- close c_readable;
- --
-end find_dbout;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_find_dbout
- is
- l_recSAVE rec_type;
- l_recNULL rec_type;
- l_recTEST rec_type;
- l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
- -------------------------------------- WTPLSQL Testing --
- procedure run_find_dbout is begin
- l_recSAVE := g_rec;
- g_rec := l_recNULL;
- find_dbout(l_pname);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- end run_find_dbout;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Setup';
- tl_compile_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source => 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type);
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'PACKAGE BODY');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || USER ||
- '.' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'PACKAGE BODY');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- -- Don't remove the "||", otherwise this will set the DBOUT
- ' --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type);
- wt_assert.eq
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message
- ,against_this_in => 'Unable to find database object "BOGUS1".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || USER ||
- '.' || l_pname || '" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- wt_assert.eq
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message
- ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- -- Don't remove the "||", otherwise this will set the DBOUT
- ' --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => 'SYS');
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => 'ALL_OBJECTS');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'VIEW');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Teardown';
- tl_drop_db_object(l_pname, 'package');
- end t_find_dbout;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure load_ignr_aa
-is
- cursor c_find_begin is
- select line
- ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col
- from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type
- and text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\'
- order by line;
- buff_find_begin c_find_begin%ROWTYPE;
- cursor c_find_end (in_line in number, in_col in number) is
- with q1 as (
- select line
- ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col
- from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type
- and line >= in_line
- and text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\'
- )
- select line
- ,col
- from q1
- where line > in_line
- or ( line = in_line
- and col > in_col)
- order by line
- ,col;
- buff_find_end c_find_end%ROWTYPE;
-begin
- g_ignr_aa.delete;
- open c_find_begin;
- loop
- fetch c_find_begin into buff_find_begin;
- exit when c_find_begin%NOTFOUND;
- open c_find_end (buff_find_begin.line, buff_find_begin.col);
- fetch c_find_end into buff_find_end;
- if c_find_end%NOTFOUND
- then
- select max(line)
- into buff_find_end.line
- from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type;
- end if;
- close c_find_end;
- for i in buff_find_begin.line + g_rec.trigger_offset ..
- buff_find_end.line + g_rec.trigger_offset
- loop
- g_ignr_aa(i) := 'X';
- end loop;
- end loop;
- close c_find_begin;
-end load_ignr_aa;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_load_ignr_aa
- is
- l_recSAVE rec_type;
- l_ignrSAVE ignr_aa_type;
- l_ignrTEST ignr_aa_type;
- l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
- -------------------------------------- WTPLSQL Testing --
- procedure run_load_ignr is begin
- l_recSAVE := g_rec;
- l_ignrSAVE := g_ignr_aa;
- g_ignr_aa.delete;
- g_rec.dbout_owner := USER;
- g_rec.dbout_name := l_pname;
- g_rec.dbout_type := 'PACKAGE BODY';
- g_rec.trigger_offset := 0;
- load_ignr_aa;
- l_ignrTEST := g_ignr_aa;
- g_ignr_aa := l_ignrSAVE;
- g_rec := l_recSAVE;
- end run_load_ignr;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Setup';
- wt_assert.isnotnull
- (msg_in => 'Number of IGNR_AA elements'
- ,check_this_in => g_ignr_aa.COUNT);
- tl_compile_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Happy Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source => 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_load_ignr;
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Happy Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 3
- ' l_junk := 1;' ); -- Line 4
- -- end -- Line 5
- run_load_ignr;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 3);
- for i in 3 .. 5
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Happy Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 1;' || CHR(10) || -- Line 3
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
- ' l_junk := 2;' || CHR(10) || -- Line 5
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' l_junk := 3;' ); -- Line 7
- run_load_ignr;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 3);
- for i in 4 .. 6
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Happy Path 4';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 1;' || CHR(10) || -- Line 3
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
- ' l_junk := 2;' || CHR(10) || -- Line 5
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' l_junk := 3;' || CHR(10) || -- Line 7
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
- -- end -- Line 10
- run_load_ignr;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 6);
- for i in 4 .. 6
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- for i in 8 .. 10
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Sad Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 3
- ' l_junk := 4;' ); -- Line 4
- run_load_ignr;
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Sad Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 1;' || CHR(10) || -- Line 3
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
- ' l_junk := 2;' || CHR(10) || -- Line 5
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' l_junk := 3;' || CHR(10) || -- Line 7
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
- run_load_ignr;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 3);
- for i in 4 .. 6
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Sad Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 1;' || CHR(10) || -- Line 3
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
- ' l_junk := 2;' || CHR(10) || -- Line 5
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' l_junk := 3;' || CHR(10) || -- Line 7
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
- run_load_ignr;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
- ,against_this_in => 5);
- for i in 4 .. 8
- loop
- wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
- ,against_this_in => TRUE);
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Load Ignr Teardown';
- tl_drop_db_object(l_pname, 'package');
- wt_assert.isnotnull
- (msg_in => 'Number of IGNR_AA elements'
- ,check_this_in => g_ignr_aa.COUNT);
- end t_load_ignr_aa;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure insert_dbout_profile
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- prof_rec wt_dbout_profiles%ROWTYPE;
- l_max_line number;
- procedure l_set_status is begin
- if g_ignr_aa.EXISTS(prof_rec.line)
- then
- -- Found Statement to Ignore
- prof_rec.status := 'IGNR';
- return;
- end if;
- if prof_rec.total_occur > 0
- then
- -- Found Executed Statement
- prof_rec.status := 'EXEC';
- return;
- end if;
- if prof_rec.total_occur = 0
- and prof_rec.total_usecs = 0
- then
- -- Check for declaration if Not Executed
- if regexp_like(prof_rec.text, '^[[:space:]]*' ||
- '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
- '[[:space:]]', 'i')
- then
- -- Exclude declarations if Not Executed
- prof_rec.status := 'EXCL';
- elsif prof_rec.line = l_max_line
- AND regexp_like(prof_rec.text, 'END', 'i')
- then
- prof_rec.status := 'EXCL';
- else
- -- Found Not Executed Statement
- prof_rec.status := 'NOTX';
- end if;
- return;
- end if;
- -- Everything else is unknown
- prof_rec.status := 'UNKN';
- end l_set_status;
-begin
- -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION.
- select max(ppd.line#) into l_max_line
- from plsql_profiler_units ppu
- join plsql_profiler_data ppd
- on ppd.unit_number = ppu.unit_number
- and ppd.runid = g_rec.prof_runid
- where ppu.unit_owner = g_rec.dbout_owner
- and ppu.unit_name = g_rec.dbout_name
- and ppu.unit_type = g_rec.dbout_type
- and ppu.runid = g_rec.prof_runid;
- load_ignr_aa;
- prof_rec.test_run_id := g_rec.test_run_id;
- for buf1 in (
- select src.line
- ,ppd.total_occur
- ,ppd.total_time
- ,ppd.min_time
- ,ppd.max_time
- ,src.text
- from plsql_profiler_units ppu
- join plsql_profiler_data ppd
- on ppd.unit_number = ppu.unit_number
- and ppd.runid = g_rec.prof_runid
- join dba_source src
- on src.line = ppd.line# + g_rec.trigger_offset
- and src.owner = g_rec.dbout_owner
- and src.name = g_rec.dbout_name
- and src.type = g_rec.dbout_type
- where ppu.unit_owner = g_rec.dbout_owner
- and ppu.unit_name = g_rec.dbout_name
- and ppu.unit_type = g_rec.dbout_type
- and ppu.runid = g_rec.prof_runid )
- loop
- prof_rec.line := buf1.line;
- prof_rec.total_occur := buf1.total_occur;
- prof_rec.total_usecs := buf1.total_time/1000;
- prof_rec.min_usecs := buf1.min_time/1000;
- prof_rec.max_usecs := buf1.max_time/1000;
- prof_rec.text := buf1.text;
- prof_rec.status := NULL;
- l_set_status;
- insert into wt_dbout_profiles values prof_rec;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not g_skip_add then
- $END
- wt_test_run_stat.add_profile(prof_rec);
- $IF $$WTPLSQL_SELFTEST $THEN
- end if;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
- end loop;
- COMMIT;
- -- Delete PLSQL Profiler has it's own
- -- PRAGMA AUTONOMOUS_TRANSACTION and COMMIT;
- g_ignr_aa.delete;
- delete_plsql_profiler_recs(g_rec.prof_runid);
-end insert_dbout_profile;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_insert_dbout_profile
- is
- units_rec plsql_profiler_units%ROWTYPE;
- data_rec plsql_profiler_data%ROWTYPE;
- l_recSAVE rec_type;
- l_recNULL rec_type;
- c_test_run_id constant number := -97;
- l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
- l_sqlerrm varchar2(4000);
- l_err_stack varchar2(32000);
- -------------------------------------- WTPLSQL Testing --
- procedure insert_plsql_profiler_data
- (in_line# in number
- ,in_total_occur in number
- ,in_total_time in number)
- is
- begin
- data_rec.line# := in_line#;
- data_rec.total_occur := in_total_occur;
- data_rec.total_time := in_total_time;
- -------------------------------------- WTPLSQL Testing --
- begin
- insert into plsql_profiler_data values data_rec;
- commit;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- wt_assert.eq (
- msg_in => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')',
- check_this_in => SQLERRM,
- against_this_in => 'ORA-0000: normal, successful completion');
- end insert_plsql_profiler_data;
- -------------------------------------- WTPLSQL Testing --
- procedure test_dbout_profiler
- (in_line# in number
- ,in_col_name in varchar2
- ,in_value in varchar2)
- is
- begin
- wt_assert.eqqueryvalue
- (msg_in => 'wt_dbout_profiles line ' || in_line# ||
- ', column ' || in_col_name
- ,check_query_in => 'select ' || in_col_name ||
- ' from wt_dbout_profiles' ||
- ' where test_run_id = ' || c_test_run_id ||
- ' and line = ' || in_line#
- ,against_value_in => in_value);
- end test_dbout_profiler;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
- tl_compile_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 1;' || CHR(10) || -- Line 3
- ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
- ' l_junk := 2;' || CHR(10) || -- Line 5
- ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' if 0 = 1 then' || CHR(10) || -- Line 7
- ' l_junk := 3;' || CHR(10) || -- Line 8
- ' end if;' ); -- Line 9
- tl_insert_plsql_profiler_recs(c_test_run_id);
- tl_count_plsql_profiler_recs(c_test_run_id, 1);
- tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
- -------------------------------------- WTPLSQL Testing --
- units_rec.runid := c_test_run_id;
- units_rec.unit_number := 1;
- units_rec.unit_owner := USER;
- units_rec.unit_name := l_pname;
- units_rec.unit_type := 'PACKAGE BODY';
- units_rec.total_time := 0;
- -------------------------------------- WTPLSQL Testing --
- begin
- insert into plsql_profiler_units values units_rec;
- commit;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'insert UNIT 1 into plsql_profiler_units',
- check_this_in => l_err_stack);
- wt_assert.eqqueryvalue
- (msg_in => 'Number of UNIT 1 plsql_profiler_units'
- ,check_query_in => 'select count(*) from plsql_profiler_units' ||
- ' where runid = ' || c_test_run_id ||
- ' and unit_number = 1'
- ,against_value_in => 1);
- -------------------------------------- WTPLSQL Testing --
- data_rec.runid := c_test_run_id;
- data_rec.unit_number := 1;
- data_rec.min_time := 0;
- data_rec.max_time := 1;
- insert_plsql_profiler_data(1, 0, 0);
- insert_plsql_profiler_data(2, 0, 1);
- insert_plsql_profiler_data(3, 1, 1);
- insert_plsql_profiler_data(5, 1, 1);
- insert_plsql_profiler_data(7, 1, 1);
- insert_plsql_profiler_data(8, 0, 0);
- insert_plsql_profiler_data(9, 1, 1);
- insert_plsql_profiler_data(10, 0, 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue
- (msg_in => 'Number of UNIT 1 plsql_profiler_data'
- ,check_query_in => 'select count(*) from plsql_profiler_data' ||
- ' where runid = ' || c_test_run_id ||
- ' and unit_number = 1'
- ,against_value_in => 8);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
- l_recSAVE := g_rec;
- g_rec.test_run_id := c_test_run_id;
- g_rec.dbout_owner := USER;
- g_rec.dbout_name := l_pname;
- g_rec.dbout_type := 'PACKAGE BODY';
- g_rec.prof_runid := c_test_run_id;
- g_rec.trigger_offset := 0;
- g_rec.error_message := '';
- -------------------------------------- WTPLSQL Testing --
- g_skip_add := TRUE;
- begin
- insert_dbout_profile;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- g_skip_add := FALSE;
- g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- -------------------------------------- WTPLSQL Testing --
- test_dbout_profiler(1, 'STATUS', 'EXCL');
- test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
- test_dbout_profiler(2, 'STATUS', 'UNKN');
- test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10));
- test_dbout_profiler(3, 'STATUS', 'EXEC');
- test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10));
- test_dbout_profiler(5, 'STATUS', 'IGNR');
- test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10));
- test_dbout_profiler(7, 'STATUS', 'EXEC');
- test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10));
- test_dbout_profiler(8, 'STATUS', 'NOTX');
- test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10));
- test_dbout_profiler(9, 'STATUS', 'EXEC');
- test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10));
- test_dbout_profiler(10, 'STATUS', 'EXCL');
- test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- tl_delete_dbout_profiles(c_test_run_id);
- tl_delete_test_runs(c_test_run_id);
- tl_delete_plsql_profiler_recs(c_test_run_id);
- tl_count_plsql_profiler_recs(c_test_run_id, 0);
- tl_drop_db_object(l_pname, 'package');
- end t_insert_dbout_profile;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
----------------------
--- Public Procedures
----------------------
-
-
-------------------------------------------------------------
-procedure initialize
- (in_test_run_id in number,
- in_runner_name in varchar2,
- out_dbout_owner out varchar2,
- out_dbout_name out varchar2,
- out_dbout_type out varchar2,
- out_trigger_offset out number,
- out_profiler_runid out number,
- out_error_message out varchar2)
-is
- l_rec_NULL rec_type;
- l_retnum binary_integer;
-begin
- -- Reset variables
- out_dbout_owner := '';
- out_dbout_name := '';
- out_dbout_type := '';
- out_trigger_offset := NULL;
- out_profiler_runid := NULL;
- out_error_message := '';
- g_rec := l_rec_NULL;
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- -- In case a test failed and left this set to TRUE
- g_skip_insert := FALSE;
- g_skip_add := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- -- Abort if there is no Test Run ID
- if in_test_run_id is null
- then
- raise_application_error (-20004, 'i_test_run_id is null');
- end if;
- g_rec.test_run_id := in_test_run_id;
- -- Find the Database Object Under Test
- find_dbout(in_pkg_name => in_runner_name);
- out_dbout_owner := g_rec.dbout_owner;
- out_dbout_name := g_rec.dbout_name;
- out_dbout_type := g_rec.dbout_type;
- out_error_message := g_rec.error_message;
- -- There muxt be a name and no error message
- if g_rec.dbout_name is null -- No DBOUT notation
- or g_rec.error_message is not null -- Error with DBOUT or Source
- or g_rec.prof_runid = -1 -- Skip Profiling
- then
- g_rec.prof_runid := NULL;
- return;
- end if;
- -- Calculate the trigger offset, if any.
- g_rec.trigger_offset := wt_profiler.trigger_offset
- (dbout_owner_in => g_rec.dbout_owner
- ,dbout_name_in => g_rec.dbout_name
- ,dbout_type_in => g_rec.dbout_type );
- out_trigger_offset := g_rec.trigger_offset;
- -- Check Versions
- l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
- if l_retnum <> 0 then
- ------%WTPLSQL_begin_ignore_lines%------ Can't test this
- --dbms_profiler.get_version(major_version, minor_version);
- raise_application_error(-20005,
- 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
- ----------------%WTPLSQL_end_ignore_lines%----------------
- end if;
- -- This starts the PROFILER Running!!!
- --dbms_output.put_line('DEBUG1. g_rec.prof_runid = ' || g_rec.prof_runid);
- l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid);
- if l_retnum <> 0 then
- ------%WTPLSQL_begin_ignore_lines%------ Can't test this
- raise_application_error(-20006,
- 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
- ----------------%WTPLSQL_end_ignore_lines%----------------
- end if;
- -- Everything is OK, set the Profiler Run ID
- out_profiler_runid := g_rec.prof_runid;
- --dbms_output.put_line('DEBUG2. g_rec.prof_runid = ' || g_rec.prof_runid);
-end initialize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_initialize
- is
- c_test_run_id constant number := -96;
- l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE';
- l_recSAVE rec_type;
- l_recTEST rec_type;
- l_recOUT rec_type;
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
- tl_compile_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test HAPPY Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 7;' ); -- Line 3
- -------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- initialize
- (in_test_run_id => c_test_run_id,
- in_runner_name => l_pname,
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT dbout_owner',
- check_this_in => l_recOUT.dbout_owner);
- wt_assert.isnull (
- msg_in => 'OUT dbout_name',
- check_this_in => l_recOUT.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT dbout_type',
- check_this_in => l_recOUT.dbout_type);
- wt_assert.isnull (
- msg_in => 'OUT prof_runid',
- check_this_in => l_recOUT.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT trigger_offset',
- check_this_in => l_recOUT.trigger_offset);
- wt_assert.isnull (
- msg_in => 'OUT error_message',
- check_this_in => l_recOUT.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type);
- wt_assert.isnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test HAPPY Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- '--% WTPLSQL SET DBOUT "' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) || -- Line 3
- ' l_junk := 7;' ); -- Line 4
- -------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- initialize
- (in_test_run_id => c_test_run_id,
- in_runner_name => l_pname,
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT dbout_owner',
- check_this_in => l_recOUT.dbout_owner,
- against_this_in => USER);
- wt_assert.eq (
- msg_in => 'OUT dbout_name',
- check_this_in => l_recOUT.dbout_name,
- against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT dbout_type',
- check_this_in => l_recOUT.dbout_type,
- against_this_in => 'PACKAGE BODY');
- wt_assert.isnotnull (
- msg_in => 'OUT prof_runid',
- check_this_in => l_recOUT.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT trigger_offset',
- check_this_in => l_recOUT.trigger_offset,
- against_this_in => 0);
- wt_assert.isnull (
- msg_in => 'OUT error_message',
- check_this_in => l_recOUT.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner,
- against_this_in => USER);
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name,
- against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type,
- against_this_in => 'PACKAGE BODY');
- wt_assert.isnotnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset,
- against_this_in => 0);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test Sad Path 1';
- l_recSAVE := g_rec;
- begin
- initialize
- (in_test_run_id => null,
- in_runner_name => 'Sad Path 1',
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_sqlerrm := SQLERRM;
- -------------------------------------- WTPLSQL Testing --
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => 'SQLERRM',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-20004: i_test_run_id is null');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- tl_drop_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname);
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Because this procedure is called to cleanup after erorrs,
--- it must be able to run multiple times without causing damage.
-procedure finalize
-is
- l_rec_NULL rec_type;
-begin
- if g_rec.prof_runid is null
- then
- return;
- end if;
- if g_rec.test_run_id is null
- then
- raise_application_error (-20000, 'g_rec.test_run_id is null');
- end if;
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- if not g_skip_insert
- then
- $END
- begin
- -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
- --dbms_output.put_line('DEBUG3. g_rec.prof_runid = ' || g_rec.prof_runid);
- dbms_profiler.STOP_PROFILER;
- exception when others then
- g_rec := l_rec_NULL;
- --dbms_output.put_line('DEBUG4. SQLERRM = ' || sqlerrm);
- raise;
- end;
- insert_dbout_profile;
- $IF $$WTPLSQL_SELFTEST
- $THEN
- end if;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- g_rec := l_rec_NULL;
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- l_recSAVE rec_type;
- l_recTEST rec_type;
- l_sqlerrm varchar2(4000);
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path 1';
- l_recSAVE := g_rec;
- g_rec.prof_runid := NULL;
- wt_assert.isnull (
- msg_in => 'g_rec.prof_runid',
- check_this_in => g_rec.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- begin
- finalize;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'format_error_stack and format_error_backtrace',
- check_this_in => l_err_stack);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path 2';
- l_recSAVE := g_rec;
- g_rec.test_run_id := -1;
- g_rec.dbout_owner := 'TEST OWNER';
- g_rec.dbout_name := 'TEST NAME';
- g_rec.dbout_type := 'TEST TYPE';
- g_rec.prof_runid := -2;
- g_rec.trigger_offset := -3;
- g_rec.error_message := 'TEST MESSAGE';
- -------------------------------------- WTPLSQL Testing --
- g_skip_insert := TRUE;
- begin
- finalize;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- g_skip_insert := FALSE;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- wt_assert.isnull (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Sad Path 1';
- l_recSAVE := g_rec;
- g_rec.prof_runid := -1;
- g_rec.test_run_id := NULL;
- begin
- finalize;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => 'SQLERRM',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-20000: g_rec.test_run_id is null');
- end t_finalize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Find begining of PL/SQL Block in a Trigger
-function trigger_offset
- (dbout_owner_in in varchar2
- ,dbout_name_in in varchar2
- ,dbout_type_in in varchar2)
- return number
-is
-begin
- if dbout_type_in != 'TRIGGER'
- then
- return 0;
- end if;
- for buff in (
- select line, text from dba_source
- where owner = dbout_owner_in
- and name = dbout_name_in
- and type = 'TRIGGER'
- order by line )
- loop
- if regexp_instr(buff.text,
- '(^declare$' ||
- '|^declare[[:space:]]' ||
- '|[[:space:]]declare$' ||
- '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0
- OR
- regexp_instr(buff.text,
- '(^begin$' ||
- '|^begin[[:space:]]' ||
- '|[[:space:]]begin$' ||
- '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0
- then
- return buff.line - 1;
- end if;
- end loop;
- return 0;
-end trigger_offset;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_trigger_offset
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Trigger Offset Happy Path';
- wt_assert.eq (
- msg_in => 'Trigger Test',
- check_this_in => trigger_offset (dbout_owner_in => USER
- ,dbout_name_in => 'WT_SELF_TEST$TEST'
- ,dbout_type_in => 'TRIGGER'),
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Package Test',
- check_this_in => trigger_offset (dbout_owner_in => USER
- ,dbout_name_in => 'WT_PROFILER'
- ,dbout_type_in => 'PACKAGE BODY'),
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Trigger Offset Sad Path';
- wt_assert.eq (
- msg_in => 'Non Existent Object',
- check_this_in => trigger_offset (dbout_owner_in => 'BOGUS456'
- ,dbout_name_in => 'BOGUS123'
- ,dbout_type_in => 'TRIGGER'),
- against_this_in => 0);
- end t_trigger_offset;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-function calc_pct_coverage
- (in_test_run_id in number)
- return number
-IS
-BEGIN
- for buff in (
- select sum(case status when 'EXEC' then 1 else 0 end) HITS
- ,sum(case status when 'NOTX' then 1 else 0 end) MISSES
- from wt_dbout_profiles p
- where test_run_id = in_test_run_id )
- loop
- if buff.hits + buff.misses = 0
- then
- return -1;
- else
- return round(100 * buff.hits / (buff.hits + buff.misses),2);
- end if;
- end loop;
- return null;
-END calc_pct_coverage;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_calc_pct_coverage
- is
- c_test_run_id constant number := -95;
- l_rec wt_dbout_profiles%ROWTYPE;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
- tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
- l_rec.test_run_id := c_test_run_id;
- l_rec.total_occur := 1;
- l_rec.total_usecs := 1;
- l_rec.min_usecs := 1;
- l_rec.max_usecs := 1;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
- l_rec.line := 1;
- l_rec.status := 'EXEC';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 2;
- l_rec.status := 'NOTX';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 3;
- l_rec.status := 'EXEC';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- wt_assert.eq (
- msg_in => 'Main Test',
- check_this_in => calc_pct_coverage(c_test_run_id),
- against_this_in => 66.67);
- tl_delete_dbout_profiles(c_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
- l_rec.line := 1;
- l_rec.status := 'EXCL';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 2;
- l_rec.status := 'UNKN';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 3;
- l_rec.status := 'EXCL';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- wt_assert.eq (
- msg_in => 'Main Test',
- check_this_in => calc_pct_coverage(c_test_run_id),
- against_this_in => -1);
- tl_delete_dbout_profiles(c_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
- wt_assert.isnull (
- msg_in => 'Missing Test Run ID',
- check_this_in => calc_pct_coverage(-99990));
- wt_assert.isnull (
- msg_in => 'NULL Test Run ID',
- check_this_in => calc_pct_coverage(null));
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Calculate Percent Coverage Teardown';
- tl_delete_test_runs(c_test_run_id);
- end t_calc_pct_coverage;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
-is
- l_profiler_runid number;
-begin
- select profiler_runid into l_profiler_runid
- from wt_test_runs where id = in_test_run_id;
- delete_plsql_profiler_recs(l_profiler_runid);
- delete from wt_dbout_profiles
- where test_run_id = in_test_run_id;
-exception
- when NO_DATA_FOUND
- then
- return;
-end delete_records;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_records
- is
- c_test_run_id constant number := -98;
- l_rec wt_dbout_profiles%ROWTYPE;
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Setup';
- wt_assert.eqqueryvalue (
- msg_in => 'wt_test_runs Count 0',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || c_test_run_id,
- against_value_in => 0);
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 0',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || c_test_run_id,
- against_value_in => 0);
- tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
- -------------------------------------- WTPLSQL Testing --
- l_rec.test_run_id := c_test_run_id;
- l_rec.line := 1;
- l_rec.status := 'EXEC';
- l_rec.total_occur := 1;
- l_rec.total_usecs := 1;
- l_rec.min_usecs := 1;
- l_rec.max_usecs := 1;
- l_rec.text := 'Testing';
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path 1';
- begin
- delete_records(c_test_run_id);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || c_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Sad Path 1';
- begin
- delete_records(-9876);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || c_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Sad Path 2';
- begin
- delete_records(NULL);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
- ' where test_run_id = ' || c_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Teardown';
- tl_delete_test_runs(c_test_run_id);
- end t_delete_records;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %--
- is
- begin
- t_get_error_msg;
- t_delete_profiler_recs;
- t_find_dbout;
- t_load_ignr_aa;
- t_insert_dbout_profile;
- t_initialize;
- t_finalize;
- t_trigger_offset;
- t_calc_pct_coverage;
- t_delete_records;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_profiler;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/headerBg.jpg b/docs/core/DBDocs/package body/WT_PROFILER/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/report.css b/docs/core/DBDocs/package body/WT_PROFILER/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WT_PROFILER/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/report.js b/docs/core/DBDocs/package body/WT_PROFILER/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WT_PROFILER/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabBg.gif b/docs/core/DBDocs/package body/WT_PROFILER/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabL.gif b/docs/core/DBDocs/package body/WT_PROFILER/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabR.gif b/docs/core/DBDocs/package body/WT_PROFILER/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabBg.gif b/docs/core/DBDocs/package body/WT_PROFILER/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabL.gif b/docs/core/DBDocs/package body/WT_PROFILER/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_PROFILER/topTabR.gif b/docs/core/DBDocs/package body/WT_PROFILER/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WT_PROFILER/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT.html b/docs/core/DBDocs/package body/WT_RESULT.html
deleted file mode 100644
index 9358aa6..0000000
--- a/docs/core/DBDocs/package body/WT_RESULT.html
+++ /dev/null
@@ -1,666 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_RESULT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41931 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:09:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:16 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_RESULT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wt_result
-as
-
- TYPE results_nt_type is table of wt_results%ROWTYPE;
- g_results_nt results_nt_type;
- g_results_rec wt_results%ROWTYPE;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_add BOOLEAN := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-----------------------
--- Private Procedures
-----------------------
-
-
----------------------
--- Public Procedures
----------------------
-
-------------------------------------------------------------
-procedure initialize
- (in_test_run_id in wt_test_runs.id%TYPE)
-is
- l_results_recNULL wt_results%ROWTYPE;
-begin
- if in_test_run_id is NULL
- then
- raise_application_error(-20009, '"in_test_run_id" cannot be NULL');
- end if;
- g_results_rec := l_results_recNULL;
- g_results_rec.test_run_id := in_test_run_id;
- g_results_rec.result_seq := 0;
- g_results_rec.executed_dtm := systimestamp;
- g_results_nt := results_nt_type(null);
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_add := FALSE;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-end initialize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_initialize
- is
- l_results_recNULL wt_results%ROWTYPE;
- l_results_recSAVE wt_results%ROWTYPE;
- l_results_recTEST wt_results%ROWTYPE;
- l_results_ntSAVE results_nt_type;
- l_results_ntTEST results_nt_type;
- begin
- -------------------------------------- WTPLSQL Testing --
- l_results_ntSAVE := g_results_nt;
- l_results_recSAVE := g_results_rec;
- g_results_rec := l_results_recNULL;
- initialize(-99);
- l_results_recTEST := g_results_rec;
- g_results_rec := l_results_recSAVE;
- l_results_ntTEST := g_results_nt;
- g_results_nt := l_results_ntSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path';
- wt_assert.eq (
- msg_in => 'l_results_recTEST.test_run_id',
- check_this_in => l_results_recTEST.test_run_id,
- against_this_in => -99);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_results_recTEST.result_seq',
- check_this_in => l_results_recTEST.result_seq,
- against_this_in => 0);
- wt_assert.isnotnull (
- msg_in => 'l_results_recTEST.executed_dtm',
- check_this_in => l_results_recTEST.executed_dtm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.interval_msecs',
- check_this_in => l_results_recTEST.interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.assertion',
- check_this_in => l_results_recTEST.assertion);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.status',
- check_this_in => l_results_recTEST.status);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.details',
- check_this_in => l_results_recTEST.details);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.testcase',
- check_this_in => l_results_recTEST.testcase);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.message',
- check_this_in => l_results_recTEST.message);
- wt_assert.eq (
- msg_in => 'l_results_ntTEST.COUNT',
- check_this_in => l_results_ntTEST.COUNT,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_ntTEST(1).test_run_id',
- check_this_in => l_results_ntTEST(1).test_run_id);
- wt_assert.raises (
- msg_in => 'Raises ORA-20009',
- check_call_in => 'begin wt_result.initialize(NULL); end;',
- against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL');
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Because this procedure is called to cleanup after errors,
--- it must be able to run multiple times without causing damage.
-procedure finalize
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_results_recNULL wt_results%ROWTYPE;
-begin
- if g_results_rec.test_run_id IS NULL
- then
- return;
- end if;
- -- There is always an extra NULL element in the g_results_nt array.
- forall i in 1 .. g_results_nt.COUNT - 1
- insert into wt_results values g_results_nt(i);
- COMMIT;
- g_results_nt := results_nt_type(null);
- g_results_rec := l_results_recNULL;
- g_results_nt := results_nt_type(null);
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- -------------------------------------- WTPLSQL Testing --
- type num_recs_aa_type is table of number index by varchar2(50);
- num_recs_aa num_recs_aa_type;
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_results_recNULL wt_results%ROWTYPE;
- l_results_recSAVE wt_results%ROWTYPE;
- l_results_recTEST wt_results%ROWTYPE;
- l_results_ntSAVE results_nt_type;
- l_results_ntTEST results_nt_type;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := ' ';
- l_results_ntSAVE := g_results_nt; -- Capture Original Values
- l_results_recSAVE := g_results_rec; -- Capture Original Values
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- g_results_rec := l_results_recNULL;
- g_results_rec.test_run_id := -99;
- g_results_rec.result_seq := 1;
- g_results_rec.executed_dtm := systimestamp;
- g_results_rec.interval_msecs := 99;
- -------------------------------------- WTPLSQL Testing --
- g_results_rec.assertion := 'FINALTEST';
- g_results_rec.status := wt_assert.C_PASS;
- g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test';
- g_results_nt := results_nt_type(null);
- g_results_nt(1) := g_results_rec;
- g_results_nt.extend; -- Finalize expects that last element to be NULL
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- g_results_rec.test_run_id := NULL;
- select count(*)
- into num_recs_aa('Finalize Before NULL Test Record Count')
- from wt_results
- where test_run_id = -99;
- finalize;
- -------------------------------------- WTPLSQL Testing --
- select count(*)
- into num_recs_aa('Finalize After NULL Test Record Count')
- from wt_results
- where test_run_id = -99;
- rollback; -- UNDO all database changes
- g_results_rec.test_run_id := -99;
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- l_test_runs_rec.id := -99;
- l_test_runs_rec.start_dtm := systimestamp;
- l_test_runs_rec.runner_name := 'Finalize Test';
- l_test_runs_rec.runner_owner := 'BOGUS';
- insert into wt_test_runs values l_test_runs_rec;
- commit; -- Must commit because finalize is AUTONOMOUS TRANSACTION
- -------------------------------------- WTPLSQL Testing --
- finalize; -- g_results_nt is still loaded with one element
- l_results_ntTEST := g_results_nt;
- l_results_recTEST := g_results_rec;
- select count(*)
- into num_recs_aa('Finalize Record Count Test')
- from wt_results
- where test_run_id = -99;
- delete from wt_results where test_run_id = -99;
- delete from wt_test_runs where id = -99;
- commit; -- UNDO all database changes
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path';
- -- Restore values so we can test
- g_results_rec := l_results_recSAVE;
- g_results_nt := l_results_ntSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Before NULL Test Record Count',
- check_this_in => num_recs_aa('Finalize Before NULL Test Record Count'),
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'After NULL Test Record Count',
- check_this_in => num_recs_aa('Finalize After NULL Test Record Count'),
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.test_run_id',
- check_this_in => l_results_recTEST.test_run_id);
- wt_assert.eq (
- msg_in => 'l_results_ntTEST.COUNT',
- check_this_in => l_results_ntTEST.COUNT,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'Record Count Test',
- check_this_in => num_recs_aa('Finalize Record Count Test'),
- against_this_in => 1);
- end t_finalize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure save
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE)
-is
- l_current_tstamp timestamp;
-begin
- if g_results_rec.test_run_id IS NULL
- then
- wt_text_report.ad_hoc_result
- (in_assertion
- ,in_status
- ,in_details
- ,in_testcase
- ,in_message);
- return;
- end if;
- -- Set the time and interval
- l_current_tstamp := systimestamp;
- g_results_rec.interval_msecs := extract(day from (
- l_current_tstamp - g_results_rec.executed_dtm
- ) * 86400 * 1000);
- g_results_rec.executed_dtm := l_current_tstamp;
- -- Set the IN variables
- g_results_rec.assertion := in_assertion;
- g_results_rec.status := in_status;
- g_results_rec.details := substr(in_details,1,4000);
- g_results_rec.testcase := substr(in_testcase,1,50);
- g_results_rec.message := substr(in_message,1,200);
- -- Increment, Extend, and Load
- g_results_rec.result_seq := g_results_rec.result_seq + 1;
- g_results_nt(g_results_nt.COUNT) := g_results_rec;
- g_results_nt.extend;
-
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not g_skip_add then
-$END
- wt_test_run_stat.add_result(g_results_rec);
-$IF $$WTPLSQL_SELFTEST $THEN
- end if;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-end save;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_save_testing
- is
- -------------------------------------- WTPLSQL Testing --
- TYPE l_dbmsout_buff_type is table of varchar2(32767);
- l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1);
- l_test_run_id number;
- l_dbmsout_line varchar2(32767);
- l_dbmsout_stat number;
- l_nt_count number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup';
- -- Save/Clear the DBMS_OUPTUT Buffer
- loop
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- exit when l_dbmsout_stat != 0;
- l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
- l_dbmsout_buff.extend;
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path';
- l_test_run_id := g_results_rec.test_run_id;
- g_results_rec.test_run_id := NULL;
- g_skip_add := TRUE;
- wt_result.save (
- in_assertion => 'SELFTEST1',
- in_status => wt_assert.C_PASS,
- in_details => 't_save_testing Details',
- in_testcase => wt_assert.g_testcase,
- in_message => 't_save_testing Message');
- g_skip_add := FALSE;
- g_results_rec.test_run_id := l_test_run_id;
- -------------------------------------- WTPLSQL Testing --
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- wt_assert.eq (
- msg_in => 'DBMS_OUTPUT Status',
- check_this_in => l_dbmsout_stat,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- if wt_assert.last_pass
- then
- wt_assert.isnotnull (
- msg_in => 'DBMS_OUTPUT Line',
- check_this_in => l_dbmsout_line);
- wt_assert.this (
- msg_in => 'Save Testing NULL Test DBMS_OUTPUT 3 Message',
- check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase ||
- '%t_save_testing %'));
- -------------------------------------- WTPLSQL Testing --
- if not wt_assert.last_pass
- then
- -- No match, put the line back into DBMS_OUTPUT buffer and end this.
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
- end if;
- end if;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown';
- -- Restore the DBMS_OUPTUT Buffer
- for i in 1 .. l_dbmsout_buff.COUNT - 1
- loop
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Save Testing Happy Path';
- l_nt_count := g_results_nt.COUNT;
- g_skip_add := TRUE;
- wt_result.save (
- in_assertion => 'SELFTEST2',
- in_status => wt_assert.C_PASS,
- in_details => 't_save_testing Testing Details',
- in_testcase => wt_assert.g_testcase,
- in_message => 't_save_testing Testing Message');
- g_skip_add := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt.COUNT',
- check_this_in => g_results_nt.COUNT,
- against_this_in => l_nt_count + 1);
- if not wt_assert.last_pass
- then
- return; -- Something went wrong, end this now.
- end if;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').assetion',
- check_this_in => g_results_nt(l_nt_count).assertion,
- against_this_in => 'SELFTEST2');
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').status',
- check_this_in => g_results_nt(l_nt_count).status,
- against_this_in => wt_assert.C_PASS);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').details',
- check_this_in => g_results_nt(l_nt_count).details,
- against_this_in => 't_save_testing Testing Details');
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').testcase',
- check_this_in => g_results_nt(l_nt_count).testcase,
- against_this_in => wt_assert.g_testcase);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').message',
- check_this_in => g_results_nt(l_nt_count).message,
- against_this_in => 't_save_testing Testing Message');
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').interval_msecs',
- check_this_in => g_results_nt(l_nt_count).interval_msecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').executed_dtm',
- check_this_in => g_results_nt(l_nt_count).executed_dtm);
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').result_seq',
- check_this_in => g_results_nt(l_nt_count).result_seq);
- -- Can't Delete Test Element. g_results_nt.COUNT is not reduced
- -- because nested tables are not dense.
- --g_results_nt.delete(l_nt_count + 1);
- end t_save_testing;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
-is
-begin
- delete from wt_results
- where test_run_id = in_test_run_id;
-end delete_records;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_records
- is
- -------------------------------------- WTPLSQL Testing --
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_results_rec wt_results%ROWTYPE;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path';
- select count(*) into l_num_recs
- from wt_results
- where test_run_id = -99;
- wt_assert.isnotnull (
- msg_in => 'Before Insert Count',
- check_this_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- l_test_runs_rec.id := -99;
- l_test_runs_rec.start_dtm := sysdate;
- l_test_runs_rec.runner_name := 'Delete Records Test';
- l_test_runs_rec.runner_owner := 'BOGUS';
- insert into wt_test_runs values l_test_runs_rec;
- l_results_rec.test_run_id := -99;
- -------------------------------------- WTPLSQL Testing --
- l_results_rec.result_seq := 1;
- l_results_rec.executed_dtm := sysdate;
- l_results_rec.interval_msecs := 99;
- l_results_rec.assertion := 'DELRECTEST';
- l_results_rec.status := wt_assert.C_PASS;
- l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test';
- insert into wt_results values l_results_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'After Insert Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs + 1);
- delete_records(-99);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'After Test Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs);
- rollback;
- wt_assert.eqqueryvalue (
- msg_in => 'After ROLLBACK Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs);
- end t_delete_records;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %--
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- t_initialize;
- t_finalize;
- t_save_testing;
- t_delete_records;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_result;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WT_RESULT/headerBg.jpg b/docs/core/DBDocs/package body/WT_RESULT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/report.css b/docs/core/DBDocs/package body/WT_RESULT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WT_RESULT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WT_RESULT/report.js b/docs/core/DBDocs/package body/WT_RESULT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WT_RESULT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabBg.gif b/docs/core/DBDocs/package body/WT_RESULT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabL.gif b/docs/core/DBDocs/package body/WT_RESULT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topDimTabR.gif b/docs/core/DBDocs/package body/WT_RESULT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabBg.gif b/docs/core/DBDocs/package body/WT_RESULT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabL.gif b/docs/core/DBDocs/package body/WT_RESULT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_RESULT/topTabR.gif b/docs/core/DBDocs/package body/WT_RESULT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WT_RESULT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html
deleted file mode 100644
index ad770f5..0000000
--- a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT.html
+++ /dev/null
@@ -1,1150 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_TEST_RUN_STAT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41961 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:21:18 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:18 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:18 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wt_test_run_stat
-as
-
- TYPE tc_aa_type is
- table of wt_testcase_stats%ROWTYPE
- index by varchar2(50);
- g_tc_aa tc_aa_type;
- g_rec wt_test_run_stats%ROWTYPE;
-
-
-----------------------
--- Private Procedures
-----------------------
-
-
----------------------
--- Public Procedures
----------------------
-
-
-------------------------------------------------------------
-procedure initialize
-is
- l_recNULL wt_test_run_stats%ROWTYPE;
-begin
- g_rec := l_recNULL;
- g_tc_aa.delete;
-end initialize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_initialize
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path 1 Setup';
- l_tc_aaTEST('TESTCASE1').test_run_id := -2;
- l_recTEST.test_run_id := -1;
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
- check_this_in => l_tc_aaTEST('TESTCASE1').test_run_id,
- against_this_in => -2 );
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -1 );
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- initialize;
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path 1';
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST.COUNT',
- check_this_in => l_tc_aaTEST.COUNT,
- against_this_in => 0 );
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id );
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure add_result
- (in_results_rec in wt_results%ROWTYPE)
-is
- tc varchar2(50);
-begin
- -- If this raises an exception, it must be done before any other values
- -- are set because they will not be rolled-back after the "raise".
- case in_results_rec.status
- when 'PASS' then
- g_rec.passes := nvl(g_rec.passes,0) + 1;
- when 'FAIL' then
- g_rec.failures := nvl(g_rec.failures,0) + 1;
- when 'ERR' then
- g_rec.errors := nvl(g_rec.errors,0) + 1;
- else
- raise_application_error(-20010, 'Unknown Result status "' ||
- in_results_rec.status || '"');
- end case;
- g_rec.test_run_id := in_results_rec.test_run_id;
- g_rec.asserts := nvl(g_rec.asserts,0) + 1;
- g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999)
- ,in_results_rec.interval_msecs);
- g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0)
- ,in_results_rec.interval_msecs);
- g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) +
- in_results_rec.interval_msecs;
- if in_results_rec.testcase is not null
- then
- tc := in_results_rec.testcase;
- g_tc_aa(tc).testcase := tc;
- g_tc_aa(tc).test_run_id := in_results_rec.test_run_id;
- g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1;
- case in_results_rec.status
- when 'PASS' then
- g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1;
- when 'FAIL' then
- g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1;
- when 'ERR' then
- g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1;
- -- No need to check "ELSE" because it would have been caught above
- end case;
- g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999)
- ,in_results_rec.interval_msecs);
- g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0)
- ,in_results_rec.interval_msecs);
- g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) +
- in_results_rec.interval_msecs;
- end if;
-end add_result;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_add_result
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_resultTEST wt_results%ROWTYPE;
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- Overview:
- -- 1) Save results in temporary variables
- -- 2) Clear ADD_RESULT variables
- -- 3) Call ADD_RESULT several times with test data.
- -- 4) Capture test results
- -- 5) Restore saved results
- -- 6) Confirm the test results using WT_ASSERT.
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- l_resultTEST.test_run_id := -10;
- l_resultTEST.interval_msecs := 10;
- l_resultTEST.status := 'PASS';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- -------------------------------------- WTPLSQL Testing --
- l_resultTEST.interval_msecs := 20;
- l_resultTEST.status := 'FAIL';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- l_resultTEST.interval_msecs := 30;
- l_resultTEST.status := 'ERR';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- -------------------------------------- WTPLSQL Testing --
- l_resultTEST.interval_msecs := 40;
- l_resultTEST.status := 'ABC';
- l_resultTEST.testcase := 'TESTCASE1';
- begin
- add_result(l_resultTEST);
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- wt_assert.g_testcase := 'Add Result Testing';
- wt_assert.eq (
- msg_in => 'Add Result Sad Path 1',
- check_this_in => 'ORA-20010: Unknown Result status "ABC"',
- against_this_in => l_sqlerrm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -10);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_recTEST.min_interval_msecs',
- check_this_in => l_recTEST.min_interval_msecs,
- against_this_in => 10);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.max_interval_msecs',
- check_this_in => l_recTEST.max_interval_msecs,
- against_this_in => 30);
- wt_assert.eq (
- msg_in => 'l_recTEST.tot_interval_msecs',
- check_this_in => l_recTEST.tot_interval_msecs,
- against_this_in => 60);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
- check_this_in => l_tc_aaTEST('TESTCASE1').test_run_id,
- against_this_in => -10);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').asserts',
- check_this_in => l_tc_aaTEST('TESTCASE1').asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').passes',
- check_this_in => l_tc_aaTEST('TESTCASE1').passes,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').failures',
- check_this_in => l_tc_aaTEST('TESTCASE1').failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').errors',
- check_this_in => l_tc_aaTEST('TESTCASE1').errors,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').min_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').min_interval_msecs,
- against_this_in => 10);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').max_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').max_interval_msecs,
- against_this_in => 30);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').tot_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').tot_interval_msecs,
- against_this_in => 60);
- end t_add_result;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure add_profile
- (in_dbout_profiles_rec in wt_dbout_profiles%ROWTYPE)
-is
-begin
- -- If this raises an exception, it must be done before any other values
- -- are set because they will not be rolled-back after the "raise".
- case in_dbout_profiles_rec.status
- when 'EXEC' then
- g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
- -- Only count the executed time.
- g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999)
- ,in_dbout_profiles_rec.min_usecs);
- g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0)
- ,in_dbout_profiles_rec.max_usecs);
- g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) +
- ( in_dbout_profiles_rec.total_usecs /
- in_dbout_profiles_rec.total_occur );
- when 'IGNR' then
- g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
- when 'EXCL' then
- g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
- when 'NOTX' then
- g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
- when 'UNKN' then
- g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
- else
- raise_application_error(-20011, 'Unknown Profile status "' ||
- in_dbout_profiles_rec.status || '"');
- end case;
- g_rec.test_run_id := in_dbout_profiles_rec.test_run_id;
- g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
-end add_profile;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_add_profile
- is
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_profileTEST wt_dbout_profiles%ROWTYPE;
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- Overview:
- -- 1) Save results in temporary variables
- -- 2) Clear ADD_PROFILE variables
- -- 3) Call ADD_PROFILE several times with test data.
- -- 4) Capture test results
- -- 5) Restore saved results
- -- 6) Confirm the test results using WT_ASSERT.
- -------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- g_rec := l_recTEST;
- l_profileTEST.test_run_id := -20;
- l_profileTEST.min_usecs := 10;
- l_profileTEST.max_usecs := 20;
- l_profileTEST.total_usecs := 30;
- l_profileTEST.total_occur := 1;
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'EXCL';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXCL';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'UNKN';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'ABC';
- begin
- add_profile(l_profileTEST);
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Add Profile Testing';
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -20);
- wt_assert.eq (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines,
- against_this_in => 15);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.min_executed_usecs',
- check_this_in => l_recTEST.min_executed_usecs,
- against_this_in => 10);
- wt_assert.eq (
- msg_in => 'l_recTEST.max_executed_usecs',
- check_this_in => l_recTEST.max_executed_usecs,
- against_this_in => 20);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.tot_executed_usecs',
- check_this_in => l_recTEST.tot_executed_usecs,
- against_this_in => 150);
- wt_assert.eq (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines,
- against_this_in => 5);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines,
- against_this_in => 4);
- wt_assert.eq (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Add Result Sad Path 1',
- check_this_in => 'ORA-20011: Unknown Profile status "ABC"',
- against_this_in => l_sqlerrm);
- end t_add_profile;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure finalize
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_executable_lines number;
- tc varchar2(50);
-begin
- if g_rec.test_run_id is null
- then
- initialize;
- return;
- end if;
- g_rec.testcases := g_tc_aa.COUNT;
- g_rec.asserts := nvl(g_rec.asserts ,0);
- g_rec.passes := nvl(g_rec.passes ,0);
- g_rec.failures := nvl(g_rec.failures,0);
- g_rec.errors := nvl(g_rec.errors ,0);
- if g_rec.asserts != 0
- then
- g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3);
- g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3);
- end if;
- if g_rec.profiled_lines is not null
- then
- g_rec.executed_lines := nvl(g_rec.executed_lines ,0);
- g_rec.ignored_lines := nvl(g_rec.ignored_lines,0);
- g_rec.excluded_lines := nvl(g_rec.excluded_lines ,0);
- g_rec.notexec_lines := nvl(g_rec.notexec_lines ,0);
- g_rec.unknown_lines := nvl(g_rec.unknown_lines ,0);
- l_executable_lines := g_rec.executed_lines + g_rec.notexec_lines;
- if l_executable_lines != 0
- then
- g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3);
- g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3);
- end if;
- end if;
- insert into wt_test_run_stats values g_rec;
- if g_rec.testcases > 0
- then
- tc := g_tc_aa.FIRST;
- loop
- g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0);
- g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0);
- g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0);
- g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0);
- if g_rec.asserts != 0
- then
- g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes /
- g_tc_aa(tc).asserts, 3);
- g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs /
- g_tc_aa(tc).asserts, 3);
- end if;
- insert into wt_testcase_stats values g_tc_aa(tc);
- exit when tc = g_tc_aa.LAST;
- tc := g_tc_aa.NEXT(tc);
- end loop;
- end if;
- COMMIT;
- initialize;
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_recNULL wt_test_run_stats%ROWTYPE;
- l_tstat_rec wt_testcase_stats%ROWTYPE;
- l_test_run_id number := -102;
- l_tc varchar2(50) := 'TC2';
- l_sql_txt varchar2(4000);
- l_sqlerrm varchar2(4000);
- -------------------------------------- WTPLSQL Testing --
- procedure run_finalize (in_msg_txt in varchar2) is begin
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- begin
- finalize;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => in_msg_txt,
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- end run_finalize;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path Setup';
- l_sql_txt := 'insert into WT_TEST_RUNS' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER3'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUNS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path 1';
- l_tc_aaTEST.delete;
- l_recTEST := l_recNULL;
- l_recTEST.test_run_id := l_test_run_id;
- run_finalize('Run Finalize for Happy Path 1'); -- AUTONOMOUS COMMIT
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_recTEST
- from WT_TEST_RUN_STATS
- where test_run_id = l_test_run_id;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TEST_RUN_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_yield',
- check_this_in => l_recTEST.test_yield);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.testcases',
- check_this_in => l_recTEST.testcases,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.min_interval_msecs',
- check_this_in => l_recTEST.min_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.avg_interval_msecs',
- check_this_in => l_recTEST.avg_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.max_interval_msecs',
- check_this_in => l_recTEST.max_interval_msecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.tot_interval_msecs',
- check_this_in => l_recTEST.tot_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.code_coverage',
- check_this_in => l_recTEST.code_coverage);
- wt_assert.isnull (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.avg_executed_usecs',
- check_this_in => l_recTEST.avg_executed_usecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TESTCASE_STATS records',
- check_query_in => 'select count(*) from WT_TESTCASE_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUN_STATS Record',
- check_call_in => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TEST_RUN_STATS records',
- check_query_in => 'select count(*) from WT_TEST_RUN_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path 2';
- l_tc_aaTEST.delete;
- l_tc_aaTEST(l_tc||'a').test_run_id := l_test_run_id;
- l_tc_aaTEST(l_tc||'a').testcase := l_tc||'a';
- l_tc_aaTEST(l_tc||'a').asserts := 3;
- l_tc_aaTEST(l_tc||'a').passes := 2;
- l_tc_aaTEST(l_tc||'a').failures := 1;
- --l_tc_aaTEST(l_tc||'a').errors := null;
- l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST(l_tc||'b').test_run_id := l_test_run_id;
- l_tc_aaTEST(l_tc||'b').testcase := l_tc||'b';
- l_tc_aaTEST(l_tc||'b').asserts := 3;
- l_tc_aaTEST(l_tc||'b').passes := 2;
- l_tc_aaTEST(l_tc||'b').failures := 1;
- --l_tc_aaTEST(l_tc||'b').errors := null;
- l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST := l_recNULL;
- l_recTEST.test_run_id := l_test_run_id;
- l_recTEST.asserts := 6;
- l_recTEST.passes := 4;
- l_recTEST.failures := 2;
- --l_recTEST.errors := null;
- l_recTEST.tot_interval_msecs := 600;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST.profiled_lines := 20;
- l_recTEST.executed_lines := 8;
- l_recTEST.ignored_lines := 6;
- l_recTEST.excluded_lines := 4;
- l_recTEST.notexec_lines := 2;
- --l_recTEST.unknown_lines := null;
- l_recTEST.tot_executed_usecs := 2000;
- run_finalize('Run Finalize for Happy Path 2'); -- AUTONOMOUS COMMIT
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_tstat_rec
- from WT_TESTCASE_STATS
- where test_run_id = l_test_run_id
- and testcase = l_tc||'a';
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TESTCASE_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_run_id',
- check_this_in => l_tstat_rec.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.testcase',
- check_this_in => l_tstat_rec.testcase,
- against_this_in => l_tc||'a');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.asserts',
- check_this_in => l_tstat_rec.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.passes',
- check_this_in => l_tstat_rec.passes,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.failures',
- check_this_in => l_tstat_rec.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.errors',
- check_this_in => l_tstat_rec.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_yield',
- check_this_in => l_tstat_rec.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.avg_interval_msecs',
- check_this_in => l_tstat_rec.avg_interval_msecs,
- against_this_in => 100);
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_tstat_rec
- from WT_TESTCASE_STATS
- where test_run_id = l_test_run_id
- and testcase = l_tc||'b';
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TESTCASE_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_run_id',
- check_this_in => l_tstat_rec.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.testcase',
- check_this_in => l_tstat_rec.testcase,
- against_this_in => l_tc||'b');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.asserts',
- check_this_in => l_tstat_rec.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.passes',
- check_this_in => l_tstat_rec.passes,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.failures',
- check_this_in => l_tstat_rec.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.errors',
- check_this_in => l_tstat_rec.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_yield',
- check_this_in => l_tstat_rec.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.avg_interval_msecs',
- check_this_in => l_tstat_rec.avg_interval_msecs,
- against_this_in => 100);
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_recTEST
- from WT_TEST_RUN_STATS
- where test_run_id = l_test_run_id;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TEST_RUN_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.test_yield',
- check_this_in => l_recTEST.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 6);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 4);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 2);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.testcases',
- check_this_in => l_recTEST.testcases,
- against_this_in => 2);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.avg_interval_msecs',
- check_this_in => l_recTEST.avg_interval_msecs,
- against_this_in => 100);
- wt_assert.eq (
- msg_in => 'l_recTEST.code_coverage',
- check_this_in => l_recTEST.code_coverage,
- against_this_in => 0.8);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines,
- against_this_in => 20);
- wt_assert.eq (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines,
- against_this_in => 8);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines,
- against_this_in => 6);
- wt_assert.eq (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines,
- against_this_in => 4);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.avg_executed_usecs',
- check_this_in => l_recTEST.avg_executed_usecs,
- against_this_in => 200);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TESTCASE_STATS Record',
- check_call_in => 'delete from WT_TESTCASE_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TESTCASE_STATS records',
- check_query_in => 'select count(*) from WT_TESTCASE_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUN_STATS Record',
- check_call_in => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TEST_RUN_STATS records',
- check_query_in => 'select count(*) from WT_TEST_RUN_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Sad Path 1';
- l_tc_aaTEST.delete;
- l_recTEST := l_recNULL;
- l_recTEST.asserts := 2;
- run_finalize('Run Finalize for Sad Path 1'); -- AUTONOMOUS COMMIT
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id);
- wt_assert.isnull (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path Teardown';
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUNS Record',
- check_call_in => 'delete from WT_TEST_RUNS where id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- end t_finalize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
-is
-begin
- delete from wt_testcase_stats
- where test_run_id = in_test_run_id;
- delete from wt_test_run_stats
- where test_run_id = in_test_run_id;
-end delete_records;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_records
- is
- l_test_run_id number := -100;
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path Setup';
- l_sql_txt := 'insert into WT_TEST_RUNS' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER2'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUNS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' ||
- l_test_run_id || ')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUN_STATS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' ||
- ' values (' || l_test_run_id || ', ''TESTCASE2'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TESTCASE_STATS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path and Teardown';
- wt_assert.raises (
- msg_in => 'Delete Records with NULL ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(' ||
- l_test_run_id || '); end;',
- against_exc_in => '');
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUNS Record',
- check_call_in => 'delete from WT_TEST_RUNS where id = ' || l_test_run_id,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Test Sad Paths';
- wt_assert.raises (
- msg_in => 'Delete Records with NULL ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(null); end;',
- against_exc_in => '');
- wt_assert.raises (
- msg_in => 'Delete Records with Invalid ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(-0.01); end;',
- against_exc_in => '');
- end t_delete_records;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %--
- is
- begin
- t_initialize;
- t_add_result;
- t_add_profile;
- t_finalize;
- t_delete_records;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_test_run_stat;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.css b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.js b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif b/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEST_RUN_STAT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT.html b/docs/core/DBDocs/package body/WT_TEXT_REPORT.html
deleted file mode 100644
index 820be42..0000000
--- a/docs/core/DBDocs/package body/WT_TEXT_REPORT.html
+++ /dev/null
@@ -1,527 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_TEXT_REPORT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41934 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE BODY |
-
-
-| CREATED |
-29-JUN-2018 15:09:17 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:18 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:18 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-2 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_TEXT_REPORT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package body wt_text_report
-as
-
- g_test_runs_rec wt_test_runs%ROWTYPE;
- g_test_run_stats_rec wt_test_run_stats%ROWTYPE;
-
-
-----------------------
--- Private Procedures
-----------------------
-
-------------------------------------------------------------
-procedure p
- (in_text in varchar2)
-is
-begin
- dbms_output.put_line(in_text);
-end p;
-
-------------------------------------------------------------
-procedure result_summary
-is
-begin
- p(' Total Test Cases: ' || to_char(nvl(g_test_run_stats_rec.testcases ,0),'9999999') ||
- ' Total Assertions: ' || to_char(nvl(g_test_run_stats_rec.asserts ,0),'9999999') );
- p(' Minimum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.min_interval_msecs,0),'9999999') ||
- ' Failed Assertions: ' || to_char(nvl(g_test_run_stats_rec.failures ,0),'9999999') );
- p(' Average Interval msec: ' || to_char(nvl(g_test_run_stats_rec.avg_interval_msecs,0),'9999999') ||
- ' Error Assertions: ' || to_char(nvl(g_test_run_stats_rec.errors ,0),'9999999') );
- p(' Maximum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.max_interval_msecs,0),'9999999') ||
- ' Test Yield: ' || to_char( g_test_run_stats_rec.test_yield * 100 ,'9990.99') ||
- '%' );
- p(' Total Run Time (sec): ' || to_char(extract(day from (g_test_runs_rec.end_dtm -
- g_test_runs_rec.start_dtm)*86400*100)/100 ,'99990.9') );
-end result_summary;
-
-------------------------------------------------------------
-procedure profile_summary
-is
-begin
- p(' Ignored Lines: ' || to_char(nvl(g_test_run_stats_rec.ignored_lines ,0),'9999999') ||
- ' Total Profiled Lines: ' || to_char(nvl(g_test_run_stats_rec.profiled_lines ,0),'9999999') );
- p(' Excluded Lines: ' || to_char(nvl(g_test_run_stats_rec.excluded_lines ,0),'9999999') ||
- ' Total Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.executed_lines ,0),'9999999') );
- p(' Minimum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.min_executed_usecs,0),'9999999') ||
- ' Not Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.notexec_lines ,0),'9999999') );
- p(' Average LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.avg_executed_usecs,0),'9999999') ||
- ' Unknown Lines: ' || to_char(nvl(g_test_run_stats_rec.unknown_lines ,0),'9999999') );
- p(' Maximum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.max_executed_usecs,0),'9999999') ||
- ' Code Coverage: ' || to_char( g_test_run_stats_rec.code_coverage * 100 ,'9990.99') ||
- '%' );
- p(' Trigger Source Offset: ' || to_char( g_test_runs_rec.trigger_offset ,'9999999') );
-end profile_summary;
-
-------------------------------------------------------------
-procedure summary_out
-is
-begin
- p('');
- p(' wtPLSQL ' || wtplsql.show_version ||
- ' - Run ID ' || g_test_runs_rec.id ||
- ': ' || to_char(g_test_runs_rec.start_dtm, g_date_format) ||
- CHR(10) );
- p(' Test Results for ' || g_test_runs_rec.runner_owner ||
- '.' || g_test_runs_rec.runner_name );
- result_summary;
- if g_test_runs_rec.dbout_name is not null
- AND g_test_runs_rec.profiler_runid is null
- then
- p('');
- p(' Note: ' || g_test_runs_rec.dbout_type || ' ' ||
- g_test_runs_rec.dbout_owner || '.' ||
- g_test_runs_rec.dbout_name || ' was not profiled.');
- end if;
- if g_test_runs_rec.error_message is not null
- then
- p('');
- p(' *** Test Runner Error ***');
- p(g_test_runs_rec.error_message);
- end if;
- ----------------------------------------
- if g_test_runs_rec.profiler_runid is null
- then
- return;
- end if;
- p('');
- p(' Code Coverage for ' || g_test_runs_rec.dbout_type ||
- ' ' || g_test_runs_rec.dbout_owner ||
- '.' || g_test_runs_rec.dbout_name );
- profile_summary;
-end summary_out;
-
-------------------------------------------------------------
-procedure results_out
- (in_show_pass in boolean)
-is
- l_last_testcase wt_results.testcase%TYPE;
- l_show_pass_txt varchar2(1);
- header_shown boolean;
- procedure l_show_header is begin
- p('');
- p(' - ' || g_test_runs_rec.runner_owner ||
- '.' || g_test_runs_rec.runner_name ||
- ' Test Result Details (Test Run ID ' ||
- g_test_runs_rec.id ||
- ')' );
- p('-----------------------------------------------------------');
- end l_show_header;
-begin
- if in_show_pass
- then
- l_show_pass_txt := 'Y';
- else
- l_show_pass_txt := 'N';
- end if;
- header_shown := FALSE;
- for buff in (
- select status
- ,interval_msecs
- ,testcase
- ,assertion
- ,details
- ,message
- from wt_results
- where test_run_id = g_test_runs_rec.id
- and ( l_show_pass_txt = 'Y'
- or status != 'PASS')
- order by result_seq )
- loop
- if not header_shown
- then
- l_show_header;
- header_shown := TRUE;
- end if;
- if buff.testcase = l_last_testcase
- OR ( buff.testcase is null
- AND l_last_testcase is null )
- then
- p(format_test_result
- (in_assertion => buff.assertion
- ,in_status => buff.status
- ,in_details => buff.details
- ,in_testcase => NULL
- ,in_message => buff.message
- ,in_interval_msecs => buff.interval_msecs) );
- else
- p(format_test_result
- (in_assertion => buff.assertion
- ,in_status => buff.status
- ,in_details => buff.details
- ,in_testcase => buff.testcase
- ,in_message => buff.message
- ,in_interval_msecs => buff.interval_msecs) );
- l_last_testcase := buff.testcase;
- end if;
- end loop;
-end results_out;
-
-------------------------------------------------------------
-procedure profile_out
- (in_show_aux in boolean)
-is
- l_header_txt CONSTANT varchar2(2000) :=
- 'Source TotTime MinTime MaxTime ' || chr(10) ||
- ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) ||
- '------ ---- ------ --------- ------- --------- ------------';
- l_show_aux_txt varchar2(1);
- header_shown boolean;
- procedure l_show_header is begin
- p('');
- p(' - ' || g_test_runs_rec.dbout_owner ||
- '.' || g_test_runs_rec.dbout_name ||
- ' ' || g_test_runs_rec.dbout_type ||
- ' Code Coverage Details (Test Run ID ' ||
- g_test_runs_rec.id ||
- ')' );
- end l_show_header;
-begin
- if g_test_runs_rec.profiler_runid is null
- then
- return;
- end if;
- if in_show_aux
- then
- l_show_aux_txt := 'Y';
- else
- l_show_aux_txt := 'N';
- end if;
- header_shown := FALSE;
- for buff in (
- select line
- ,status
- ,total_occur
- ,total_usecs
- ,min_usecs
- ,max_usecs
- ,text
- ,rownum
- from wt_dbout_profiles
- where test_run_id = g_test_runs_rec.id
- and ( l_show_aux_txt = 'Y'
- or status not in ('EXEC','IGNR','UNKN','EXCL'))
- order by line )
- loop
- if not header_shown
- then
- l_show_header;
- p(l_header_txt);
- header_shown := TRUE;
- end if;
- if mod(buff.rownum,25) = 0
- then
- p(l_header_txt);
- end if;
- p(to_char(buff.line,'99999') ||
- case buff.status when 'NOTX' then '#NOTX#'
- else ' ' || rpad(buff.status,4) || ' '
- end ||
- to_char(buff.total_occur,'99999') || ' ' ||
- to_char(buff.total_usecs,'99999999') || ' ' ||
- to_char(buff.min_usecs,'999999') || ' ' ||
- to_char(buff.max_usecs,'99999999') || ' ' ||
- replace(buff.text,CHR(10),'') );
- end loop;
-end profile_out;
-
-
----------------------
--- Public Procedures
----------------------
-
-------------------------------------------------------------
-function format_test_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE
- ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
- return varchar2
-is
- l_out_str varchar2(32000) := '';
-begin
- if in_testcase is not null
- then
- l_out_str := ' ---- Test Case: ' || in_testcase || CHR(10);
- end if;
- if in_status = wt_assert.C_PASS
- then
- l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' ';
- else
- l_out_str := l_out_str || '#' || rpad(in_status,4) || '#';
- end if;
- if in_interval_msecs is not null
- then
- l_out_str := l_out_str || lpad(in_interval_msecs,4) || 'ms ';
- end if;
- if in_message is not null
- then
- l_out_str := l_out_str || in_message || '. ';
- end if;
- l_out_str := l_out_str || in_assertion || ' - ';
- if g_single_line_output
- then
- l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n');
- else
- l_out_str := l_out_str || in_details;
- end if;
- return l_out_str;
-end format_test_result;
-
-------------------------------------------------------------
-procedure ad_hoc_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE)
-is
-begin
- p(format_test_result
- (in_assertion => in_assertion
- ,in_status => in_status
- ,in_details => in_details
- ,in_testcase => in_testcase
- ,in_message => in_message));
-end ad_hoc_result;
-
-------------------------------------------------------------
-procedure dbms_out
- (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER
- ,in_runner_name in wt_test_runs.runner_name%TYPE default null
- ,in_detail_level in number default 0
- ,in_summary_last in boolean default FALSE)
-is
-
- cursor c_main(in_test_run_id in number) is
- select * from wt_test_run_stats
- where test_run_id = in_test_run_id;
- g_test_run_statsNULL wt_test_run_stats%ROWTYPE;
-
-begin
-
- for buff in (
- select * from wt_test_runs
- where ( runner_name, start_dtm) in
- (select t2.runner_name, max(t2.start_dtm)
- from wt_test_runs t2
- where ( ( in_runner_name is not null
- and in_runner_name = t2.runner_name)
- OR in_runner_name is null )
- and t2.runner_owner = in_runner_owner
- group by t2.runner_name )
- order by start_dtm, runner_name )
- loop
-
- -- Load Test Run Record
- g_test_runs_rec := buff;
-
- -- Load the Stats Record
- g_test_run_stats_rec := g_test_run_statsNULL;
- open c_main(buff.id);
- fetch c_main into g_test_run_stats_rec;
- close c_main;
-
- -- Setup Display Order
- if in_summary_last
- then
- if in_detail_level >= 10
- then
- profile_out(in_detail_level >= 30);
- results_out(in_detail_level >= 20);
- end if;
- summary_out;
- else
- summary_out;
- if in_detail_level >= 10
- then
- results_out(in_detail_level >= 20);
- profile_out(in_detail_level >= 30);
- end if;
- end if;
-
- p('');
-
- end loop;
-
-end dbms_out;
-
-
-end wt_text_report;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg b/docs/core/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.css b/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.js b/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package body/WT_TEXT_REPORT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabBg.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabL.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabL.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif b/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package body/WT_TEXT_REPORT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package body/index.html b/docs/core/DBDocs/package body/index.html
deleted file mode 100644
index d7cc1f3..0000000
--- a/docs/core/DBDocs/package body/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-Package Bodies
-
\ No newline at end of file
diff --git a/docs/core/DBDocs/package/WTPLSQL.html b/docs/core/DBDocs/package/WTPLSQL.html
deleted file mode 100644
index 96ff75c..0000000
--- a/docs/core/DBDocs/package/WTPLSQL.html
+++ /dev/null
@@ -1,225 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
-
- delete_runs delete_runs( in_test_run_id in number )
- delete_runs delete_runs( in_runner_owner in varchar2 , in_runner_name in varchar2 )
- show_version show_version
- test_all test_all
- test_run test_run( in_package_name in varchar2 )
- WTPLSQL_RUN WTPLSQL_RUN
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WTPLSQL |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41925 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:09:14 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WTPLSQL |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wtplsql authid current_user
-as
- -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
-
- function show_version
- return varchar2;
-
- procedure test_run
- (in_package_name in varchar2);
-
- procedure test_all;
-
- procedure delete_runs
- (in_test_run_id in number);
-
- procedure delete_runs
- (in_runner_owner in varchar2
- ,in_runner_name in varchar2);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- -- begin
- -- dbms_utility.compile_schema('WTP',TRUE,FALSE);
- -- end;
- -- /
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wtplsql;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WTPLSQL/headerBg.jpg b/docs/core/DBDocs/package/WTPLSQL/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/report.css b/docs/core/DBDocs/package/WTPLSQL/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WTPLSQL/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WTPLSQL/report.js b/docs/core/DBDocs/package/WTPLSQL/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WTPLSQL/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WTPLSQL/topDimTabBg.gif b/docs/core/DBDocs/package/WTPLSQL/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/topDimTabL.gif b/docs/core/DBDocs/package/WTPLSQL/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/topDimTabR.gif b/docs/core/DBDocs/package/WTPLSQL/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/topTabBg.gif b/docs/core/DBDocs/package/WTPLSQL/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/topTabL.gif b/docs/core/DBDocs/package/WTPLSQL/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WTPLSQL/topTabR.gif b/docs/core/DBDocs/package/WTPLSQL/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WTPLSQL/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT.html b/docs/core/DBDocs/package/WT_ASSERT.html
deleted file mode 100644
index 0761ed8..0000000
--- a/docs/core/DBDocs/package/WT_ASSERT.html
+++ /dev/null
@@ -1,528 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
| Method Summary | | eq( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eq( msg_in in varchar2 , check_this_in in boolean , against_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eq( msg_in in varchar2 , check_this_in in XMLTYPE , against_this_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eq( msg_in in varchar2 , check_this_in in CLOB , against_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | eq( msg_in in varchar2 , check_this_in in BLOB , against_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eqquery( msg_in in varchar2 , check_query_in in varchar2 , against_query_in in varchar2 , raise_exc_in in boolean : = false ) |
- | eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | eqtabcount( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false ) |
- | eqtable( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false ) |
- | get_NLS_DATE_FORMAT Date/Time Formats are configured at the Session Level |
- | get_NLS_TIMESTAMP_FORMAT |
- | get_NLS_TIMESTAMP_TZ_FORMAT |
- | isnotnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | isnotnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | isnotnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | isnotnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | isnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | isnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | isnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | isnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API |
- | last_assert |
- | last_details |
- | last_msg |
- | last_pass Modify as required |
- | objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) |
- | objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false ) |
- | objnotexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 ) |
- | raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number ) |
- | reset_globals |
- | set_NLS_DATE_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS' ) |
- | set_NLS_TIMESTAMP_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6' ) |
- | set_NLS_TIMESTAMP_TZ_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM' ) |
- | this( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) |
- | throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 ) |
- | throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number ) |
- | WTPLSQL_RUN |
-
-
- eq eq( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eq eq( msg_in in varchar2 , check_this_in in boolean , against_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eq eq( msg_in in varchar2 , check_this_in in XMLTYPE , against_this_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eq eq( msg_in in varchar2 , check_this_in in CLOB , against_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- eq eq( msg_in in varchar2 , check_this_in in BLOB , against_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eqquery eqquery( msg_in in varchar2 , check_query_in in varchar2 , against_query_in in varchar2 , raise_exc_in in boolean : = false )
- eqqueryvalue eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eqqueryvalue eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in XMLTYPE , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eqqueryvalue eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- eqqueryvalue eqqueryvalue( msg_in in varchar2 , check_query_in in varchar2 , against_value_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- eqtabcount eqtabcount( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false )
- eqtable eqtable( msg_in in varchar2 , check_this_in in varchar2 , against_this_in in varchar2 , check_where_in in varchar2 : = null , against_where_in in varchar2 : = null , raise_exc_in in boolean : = false )
- get_NLS_DATE_FORMAT get_NLS_DATE_FORMAT Date/Time Formats are configured at the Session Level
- get_NLS_TIMESTAMP_FORMAT get_NLS_TIMESTAMP_FORMAT
- get_NLS_TIMESTAMP_TZ_FORMAT get_NLS_TIMESTAMP_TZ_FORMAT
- isnotnull isnotnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- isnotnull isnotnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- isnotnull isnotnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- isnotnull isnotnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- isnull isnull( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- isnull isnull( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- isnull isnull( msg_in in varchar2 , check_this_in in CLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- isnull isnull( msg_in in varchar2 , check_this_in in BLOB , null_ok_in in boolean : = false , raise_exc_in in boolean : = false ) Not Used, utPLSQL V1 API
- last_assert last_assert
- last_details last_details
- last_msg last_msg
- last_pass last_pass Modify as required
- objexists objexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
- objexists objexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- objnotexists objnotexists( msg_in in varchar2 , obj_owner_in in varchar2 , obj_name_in in varchar2 , obj_type_in in varchar2 default null , raise_exc_in in boolean : = false )
- objnotexists objnotexists( msg_in in varchar2 , check_this_in in varchar2 , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- raises raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 )
- raises raises( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number )
- reset_globals reset_globals
- set_NLS_DATE_FORMAT set_NLS_DATE_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS' )
- set_NLS_TIMESTAMP_FORMAT set_NLS_TIMESTAMP_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6' )
- set_NLS_TIMESTAMP_TZ_FORMAT set_NLS_TIMESTAMP_TZ_FORMAT( in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM' )
- this this( msg_in in varchar2 , check_this_in in boolean , null_ok_in in boolean : = false , raise_exc_in in boolean : = false )
- throws throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in varchar2 )
- throws throws( msg_in varchar2 , check_call_in in varchar2 , against_exc_in in number )
- WTPLSQL_RUN WTPLSQL_RUN
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_ASSERT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41927 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:09:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_ASSERT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wt_assert authid current_user
-is
- -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
-
- ASSERT_FAILURE_EXCEPTION exception;
- PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003);
-
- C_PASS CONSTANT varchar2(10) := 'PASS';
- C_FAIL CONSTANT varchar2(10) := 'FAIL';
-
- -- See RESET_GLOBALS procedure for default global values
-
- -- Testcase name for a series of assertions.
- -- Modify as required
- g_testcase wt_results.testcase%TYPE;
-
- function last_pass
- return boolean;
-
- function last_assert
- return wt_results.assertion%TYPE;
-
- function last_msg
- return wt_results.message%TYPE;
-
- function last_details
- return wt_results.details%TYPE;
-
- procedure reset_globals;
-
- -- Date/Time Formats are configured at the Session Level
- function get_NLS_DATE_FORMAT
- return varchar2;
- procedure set_NLS_DATE_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS');
- function get_NLS_TIMESTAMP_FORMAT
- return varchar2;
- procedure set_NLS_TIMESTAMP_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6');
- function get_NLS_TIMESTAMP_TZ_FORMAT
- return varchar2;
- procedure set_NLS_TIMESTAMP_TZ_FORMAT
- (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
-
- ------------------------
- -- Datatypes Supported
- -- Oracle Data Type Families
- -- https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/predefined.htm#LNPLS2047
- --
- -- VARCHAR2 - Includes ROWID, LONG*, RAW, LONG RAW*, and NVARCHAR2
- -- DATE** - Includes TIMESTAMP and INTERVAL
- -- NUMBER** - Includes PLS_INTEGER
- -- BOOLEAN
- -- XMLTYPE
- -- CLOB - Includes NCLOB
- -- BLOB
- --
- -- *LONG and LONG RAW data length is limited to VARCHAR2 length in PL/SQL (32K).
- -- **VARCHAR2 includes DATE and NUMBER using Implicit Data Conversions:
- -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm#i163326
- --
-
- procedure this (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- --
- procedure eq (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- procedure eq (
- msg_in in varchar2,
- check_this_in in boolean,
- against_this_in in boolean,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- procedure eq (
- msg_in in varchar2,
- check_this_in in XMLTYPE,
- against_this_in in XMLTYPE,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure eq (
- msg_in in varchar2,
- check_this_in in CLOB,
- against_this_in in CLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- procedure eq (
- msg_in in varchar2,
- check_this_in in BLOB,
- against_this_in in BLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- --
- procedure isnotnull (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnotnull (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnotnull (
- msg_in in varchar2,
- check_this_in in CLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnotnull (
- msg_in in varchar2,
- check_this_in in BLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- --
- procedure isnull (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnull (
- msg_in in varchar2,
- check_this_in in boolean,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnull (
- msg_in in varchar2,
- check_this_in in CLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure isnull (
- msg_in in varchar2,
- check_this_in in BLOB,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- --
- procedure raises (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in varchar2);
-
- procedure raises (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in number);
-
- procedure throws (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in varchar2);
-
- procedure throws (
- msg_in varchar2,
- check_call_in in varchar2,
- against_exc_in in number);
-
- --
- procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in varchar2,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in XMLTYPE,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in CLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- procedure eqqueryvalue (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_value_in in BLOB,
- null_ok_in in boolean := false,
- raise_exc_in in boolean := false);
-
- --
- procedure eqquery (
- msg_in in varchar2,
- check_query_in in varchar2,
- against_query_in in varchar2,
- raise_exc_in in boolean := false);
-
- --
- procedure eqtable (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- check_where_in in varchar2 := null,
- against_where_in in varchar2 := null,
- raise_exc_in in boolean := false);
-
- --
- procedure eqtabcount (
- msg_in in varchar2,
- check_this_in in varchar2,
- against_this_in in varchar2,
- check_where_in in varchar2 := null,
- against_where_in in varchar2 := null,
- raise_exc_in in boolean := false);
-
- --
- procedure objexists (
- msg_in in varchar2,
- obj_owner_in in varchar2,
- obj_name_in in varchar2,
- obj_type_in in varchar2 default null,
- raise_exc_in in boolean := false);
-
- procedure objexists (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- --
- procedure objnotexists (
- msg_in in varchar2,
- obj_owner_in in varchar2,
- obj_name_in in varchar2,
- obj_type_in in varchar2 default null,
- raise_exc_in in boolean := false);
-
- procedure objnotexists (
- msg_in in varchar2,
- check_this_in in varchar2,
- null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
- raise_exc_in in boolean := false);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_assert;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WT_ASSERT/headerBg.jpg b/docs/core/DBDocs/package/WT_ASSERT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/report.css b/docs/core/DBDocs/package/WT_ASSERT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WT_ASSERT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WT_ASSERT/report.js b/docs/core/DBDocs/package/WT_ASSERT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WT_ASSERT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topDimTabBg.gif b/docs/core/DBDocs/package/WT_ASSERT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topDimTabL.gif b/docs/core/DBDocs/package/WT_ASSERT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topDimTabR.gif b/docs/core/DBDocs/package/WT_ASSERT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topTabBg.gif b/docs/core/DBDocs/package/WT_ASSERT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topTabL.gif b/docs/core/DBDocs/package/WT_ASSERT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_ASSERT/topTabR.gif b/docs/core/DBDocs/package/WT_ASSERT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WT_ASSERT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER.html b/docs/core/DBDocs/package/WT_PROFILER.html
deleted file mode 100644
index f5214dc..0000000
--- a/docs/core/DBDocs/package/WT_PROFILER.html
+++ /dev/null
@@ -1,229 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
current_user
| Method Summary | | calc_pct_coverage( in_test_run_id in number ) return number ; |
- | delete_records( in_test_run_id in number ) |
- | finalize |
- | initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 ) |
- | trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ; |
- | WTPLSQL_RUN |
-
-
- calc_pct_coverage calc_pct_coverage( in_test_run_id in number ) return number ;
- delete_records delete_records( in_test_run_id in number )
- finalize finalize
- initialize initialize( in_test_run_id in number , in_runner_name in varchar2 , out_dbout_owner out varchar2 , out_dbout_name out varchar2 , out_dbout_type out varchar2 , out_trigger_offset out number , out_profiler_runid out number , out_error_message out varchar2 )
- trigger_offset trigger_offset( dbout_owner_in in varchar2 , dbout_name_in in varchar2 , dbout_type_in in varchar2 ) return number ;
- WTPLSQL_RUN WTPLSQL_RUN
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_PROFILER |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41928 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:09:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:15 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_PROFILER |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wt_profiler authid definer --current_user
-as
-
- procedure initialize
- (in_test_run_id in number,
- in_runner_name in varchar2,
- out_dbout_owner out varchar2,
- out_dbout_name out varchar2,
- out_dbout_type out varchar2,
- out_trigger_offset out number,
- out_profiler_runid out number,
- out_error_message out varchar2);
-
- procedure finalize;
-
- function trigger_offset
- (dbout_owner_in in varchar2
- ,dbout_name_in in varchar2
- ,dbout_type_in in varchar2)
- return number;
-
- function calc_pct_coverage
- (in_test_run_id in number)
- return number;
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_profiler;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WT_PROFILER/headerBg.jpg b/docs/core/DBDocs/package/WT_PROFILER/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/report.css b/docs/core/DBDocs/package/WT_PROFILER/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WT_PROFILER/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WT_PROFILER/report.js b/docs/core/DBDocs/package/WT_PROFILER/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WT_PROFILER/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabBg.gif b/docs/core/DBDocs/package/WT_PROFILER/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabL.gif b/docs/core/DBDocs/package/WT_PROFILER/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topDimTabR.gif b/docs/core/DBDocs/package/WT_PROFILER/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabBg.gif b/docs/core/DBDocs/package/WT_PROFILER/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabL.gif b/docs/core/DBDocs/package/WT_PROFILER/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_PROFILER/topTabR.gif b/docs/core/DBDocs/package/WT_PROFILER/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WT_PROFILER/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT.html b/docs/core/DBDocs/package/WT_RESULT.html
deleted file mode 100644
index 2d39d56..0000000
--- a/docs/core/DBDocs/package/WT_RESULT.html
+++ /dev/null
@@ -1,217 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
| Method Summary | | delete_records( in_test_run_id in number ) |
- | finalize |
- | initialize( in_test_run_id in wt_test_runs . id % TYPE ) |
- | save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) |
- | WTPLSQL_RUN |
-
-
- delete_records delete_records( in_test_run_id in number )
- finalize finalize
- initialize initialize( in_test_run_id in wt_test_runs . id % TYPE )
- save save( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
- WTPLSQL_RUN WTPLSQL_RUN
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_RESULT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41926 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:09:14 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:15 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_RESULT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wt_result authid definer
-as
-
- procedure initialize
- (in_test_run_id in wt_test_runs.id%TYPE);
-
- procedure finalize;
-
- procedure save
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE);
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_result;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WT_RESULT/headerBg.jpg b/docs/core/DBDocs/package/WT_RESULT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/report.css b/docs/core/DBDocs/package/WT_RESULT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WT_RESULT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WT_RESULT/report.js b/docs/core/DBDocs/package/WT_RESULT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WT_RESULT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabBg.gif b/docs/core/DBDocs/package/WT_RESULT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabL.gif b/docs/core/DBDocs/package/WT_RESULT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/topDimTabR.gif b/docs/core/DBDocs/package/WT_RESULT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabBg.gif b/docs/core/DBDocs/package/WT_RESULT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabL.gif b/docs/core/DBDocs/package/WT_RESULT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_RESULT/topTabR.gif b/docs/core/DBDocs/package/WT_RESULT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WT_RESULT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html b/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html
deleted file mode 100644
index 75f7997..0000000
--- a/docs/core/DBDocs/package/WT_TEST_RUN_STAT.html
+++ /dev/null
@@ -1,210 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- add_profile add_profile( in_dbout_profiles_rec in wt_dbout_profiles % ROWTYPE )
- add_result add_result( in_results_rec in wt_results % ROWTYPE )
- delete_records delete_records( in_test_run_id in number )
- finalize finalize
- initialize initialize
- WTPLSQL_RUN WTPLSQL_RUN
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_TEST_RUN_STAT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41960 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:21:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:15 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wt_test_run_stat authid definer
-as
-
- procedure initialize;
-
- procedure add_result
- (in_results_rec in wt_results%ROWTYPE);
-
- procedure add_profile
- (in_dbout_profiles_rec in wt_dbout_profiles%ROWTYPE);
-
- procedure finalize;
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_test_run_stat;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.css b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.js b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif b/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WT_TEST_RUN_STAT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT.html b/docs/core/DBDocs/package/WT_TEXT_REPORT.html
deleted file mode 100644
index a7e5a3f..0000000
--- a/docs/core/DBDocs/package/WT_TEXT_REPORT.html
+++ /dev/null
@@ -1,241 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
To report the latest result details for test runner:
| Method Summary | | ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE ) |
- | dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE ) All profiled source lines. |
- | format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ; |
-
-
- ad_hoc_result ad_hoc_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE )
- dbms_out dbms_out( in_runner_owner in wt_test_runs . runner_owner % TYPE default USER , in_runner_name in wt_test_runs . runner_name % TYPE default null , in_detail_level in number default 0 , in_summary_last in boolean default FALSE ) All profiled source lines.
- format_test_result format_test_result( in_assertion in wt_results . assertion % TYPE , in_status in wt_results . status % TYPE , in_details in wt_results . details % TYPE , in_testcase in wt_results . testcase % TYPE , in_message in wt_results . message % TYPE , in_interval_msecs in wt_results . interval_msecs % TYPE DEFAULT NULL ) return varchar2 ;
-
-
-
-
-| NAME |
-VALUE |
-
-
-| OWNER |
-WTP |
-
-
-| OBJECT_NAME |
-WT_TEXT_REPORT |
-
-
-| SUBOBJECT_NAME |
-null |
-
-
-| OBJECT_ID |
-41929 |
-
-
-| DATA_OBJECT_ID |
-null |
-
-
-| OBJECT_TYPE |
-PACKAGE |
-
-
-| CREATED |
-29-JUN-2018 15:09:15 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:16 |
-
-
-| TIMESTAMP |
-2018-06-29:15:21:15 |
-
-
-| STATUS |
-VALID |
-
-
-| TEMPORARY |
-N |
-
-
-| GENERATED |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NAMESPACE |
-1 |
-
-
-| EDITION_NAME |
-null |
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| EXECUTE |
-PUBLIC |
-NO |
-WTP |
-WT_TEXT_REPORT |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-| NAME |
-OWNER |
-TYPE |
-OBJECT_ID |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-package wt_text_report authid definer
-as
-
- -- To report the latest result details for test runner:
- -- begin
- -- wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE);
- -- end;
- -- /
-
- -- Turn this off to allow output across multiple lines of text
- g_single_line_output boolean := TRUE;
-
- -- DATE data type format for Report Header
- g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
-
- function format_test_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE
- ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
- return varchar2;
-
- procedure ad_hoc_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE);
-
--- "in_detail_level" settings for DBMS_OUT procedure:
--- * Less than 10 (including null) - No Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * 10 to 19 - Minimal Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * Failed assertion result details.
--- * Profiled source lines that were "not executed".
--- * 20 to 29 - Partial Full Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * All assertion result details.
--- * Profiled source lines that were "not executed".
--- * 30 or more - Full Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * All assertion result details.
--- * All profiled source lines.
-
- procedure dbms_out
- (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER
- ,in_runner_name in wt_test_runs.runner_name%TYPE default null
- ,in_detail_level in number default 0
- ,in_summary_last in boolean default FALSE);
-
-end wt_text_report;
-
-
-
-
-
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg b/docs/core/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/report.css b/docs/core/DBDocs/package/WT_TEXT_REPORT/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/package/WT_TEXT_REPORT/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/report.js b/docs/core/DBDocs/package/WT_TEXT_REPORT/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/package/WT_TEXT_REPORT/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabBg.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabL.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabL.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabR.gif b/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/package/WT_TEXT_REPORT/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/package/index.html b/docs/core/DBDocs/package/index.html
deleted file mode 100644
index 06146e0..0000000
--- a/docs/core/DBDocs/package/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-Packages
-
\ No newline at end of file
diff --git a/docs/core/DBDocs/round_text.png b/docs/core/DBDocs/round_text.png
deleted file mode 100644
index fd54f2a..0000000
Binary files a/docs/core/DBDocs/round_text.png and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html
deleted file mode 100644
index 022482d..0000000
--- a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-PLSQL_PROFILER_RUNNUMBER |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:11 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:11 |
-
-
-| SEQUENCE_OWNER |
-WTP |
-
-
-| SEQUENCE_NAME |
-PLSQL_PROFILER_RUNNUMBER |
-
-
-| MIN_VALUE |
-1 |
-
-
-| MAX_VALUE |
-9999999999999999999999999999 |
-
-
-| INCREMENT_BY |
-1 |
-
-
-| CYCLE_FLAG |
-N |
-
-
-| ORDER_FLAG |
-N |
-
-
-| CACHE_SIZE |
-0 |
-
-
-| LAST_NUMBER |
-16 |
-
-
-
-
-
-
-
-
-| OBJECT_ID |
-OWNER |
-OBJECT_TYPE |
-OBJECT_NAME |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif b/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/sequence/PLSQL_PROFILER_RUNNUMBER/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html
deleted file mode 100644
index 22af5be..0000000
--- a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ.html
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:12 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:14 |
-
-
-| SEQUENCE_OWNER |
-WTP |
-
-
-| SEQUENCE_NAME |
-WT_TEST_RUNS_SEQ |
-
-
-| MIN_VALUE |
-1 |
-
-
-| MAX_VALUE |
-9999999999999999999999999999 |
-
-
-| INCREMENT_BY |
-1 |
-
-
-| CYCLE_FLAG |
-N |
-
-
-| ORDER_FLAG |
-N |
-
-
-| CACHE_SIZE |
-20 |
-
-
-| LAST_NUMBER |
-41 |
-
-
-
-
-
-
-
-
-| OBJECT_ID |
-OWNER |
-OBJECT_TYPE |
-OBJECT_NAME |
-STATUS |
-TYPE_LINK |
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif b/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/sequence/WT_TEST_RUNS_SEQ/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/sequence/index.html b/docs/core/DBDocs/sequence/index.html
deleted file mode 100644
index d5945db..0000000
--- a/docs/core/DBDocs/sequence/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-Sequences
-
\ No newline at end of file
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html
deleted file mode 100644
index 78343f9..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA.html
+++ /dev/null
@@ -1,799 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| RUNID |
-NUMBER |
-No |
-null |
-1 |
-Primary key, unique (generated) run identifier |
-
-
-| UNIT_NUMBER |
-NUMBER |
-No |
-null |
-2 |
-Primary key, internally generated library unit number |
-
-
-| LINE# |
-NUMBER |
-No |
-null |
-3 |
-Primary key, not null, line number in unit |
-
-
-| TOTAL_OCCUR |
-NUMBER |
-Yes |
-null |
-4 |
-Number of times line was executed |
-
-
-| TOTAL_TIME |
-NUMBER |
-Yes |
-null |
-5 |
-Total time spent executing line in nanoseconds |
-
-
-| MIN_TIME |
-NUMBER |
-Yes |
-null |
-6 |
-Minimum execution time for this line in nanoseconds |
-
-
-| MAX_TIME |
-NUMBER |
-Yes |
-null |
-7 |
-Maximum execution time for this line in nanoseconds |
-
-
-| SPARE1 |
-NUMBER |
-Yes |
-null |
-8 |
-Unused |
-
-
-| SPARE2 |
-NUMBER |
-Yes |
-null |
-9 |
-Unused |
-
-
-| SPARE3 |
-NUMBER |
-Yes |
-null |
-10 |
-Unused |
-
-
-| SPARE4 |
-NUMBER |
-Yes |
-null |
-11 |
-Unused |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| SYS_C0020887 |
-Check |
-"LINE#" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-null |
-null |
-null |
-
-
-| SYS_C0020888 |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-SYS_C0020888 |
-null |
-null |
-
-
-| SYS_C0020889 |
-Foreign_Key |
-null |
-WTP |
-PLSQL_PROFILER_UNITS |
-SYS_C0020885 |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-null |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| LINE# |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNID |
-1 |
-
-
-| UNIT_NUMBER |
-2 |
-
-
-| LINE# |
-3 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNID |
-1 |
-
-
-| UNIT_NUMBER |
-2 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_PROFILER |
-PACKAGE BODY |
-WTP |
-PLSQL_PROFILER_DATA |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:11 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-PLSQL_PROFILER_DATA |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-10 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Table of program units for DBMS_PROFILER |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-SYS_C0020888 |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-RUNID, UNIT_NUMBER, LINE# |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-SYS_C0020888 |
-WTP |
-PLSQL_PROFILER_DATA |
-RUNID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-SYS_C0020888 |
-WTP |
-PLSQL_PROFILER_DATA |
-UNIT_NUMBER |
-2 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-SYS_C0020888 |
-WTP |
-PLSQL_PROFILER_DATA |
-LINE# |
-3 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.css b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.js b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_DATA/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html
deleted file mode 100644
index 1f817ae..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS.html
+++ /dev/null
@@ -1,722 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| RUNID |
-NUMBER |
-No |
-null |
-1 |
-(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber |
-
-
-| RELATED_RUN |
-NUMBER |
-Yes |
-null |
-2 |
-Runid of related run (for client/server correlation) |
-
-
-| RUN_OWNER |
-VARCHAR2(32 BYTE) |
-Yes |
-null |
-3 |
-User who started run |
-
-
-| RUN_DATE |
-DATE |
-Yes |
-null |
-4 |
-Start time of run |
-
-
-| RUN_COMMENT |
-VARCHAR2(2047 BYTE) |
-Yes |
-null |
-5 |
-User provided comment for this run |
-
-
-| RUN_TOTAL_TIME |
-NUMBER |
-Yes |
-null |
-6 |
-Elapsed time for this run in nanoseconds |
-
-
-| RUN_SYSTEM_INFO |
-VARCHAR2(2047 BYTE) |
-Yes |
-null |
-7 |
-Currently unused |
-
-
-| RUN_COMMENT1 |
-VARCHAR2(2047 BYTE) |
-Yes |
-null |
-8 |
-Additional comment |
-
-
-| SPARE1 |
-VARCHAR2(256 BYTE) |
-Yes |
-null |
-9 |
-Unused |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| SYS_C0020883 |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-SYS_C0020883 |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNID |
-1 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_PROFILER |
-PACKAGE BODY |
-WTP |
-PLSQL_PROFILER_RUNS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:11 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-PLSQL_PROFILER_RUNS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-10 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Table of profiler runs for DBMS_PROFILER |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-SYS_C0020883 |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-RUNID |
-
-
-| WTP |
-PLSQL_PROFILER_RUNS_IDX1 |
-NONUNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-RUN_DATE |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-SYS_C0020883 |
-WTP |
-PLSQL_PROFILER_RUNS |
-RUNID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-PLSQL_PROFILER_RUNS_IDX1 |
-WTP |
-PLSQL_PROFILER_RUNS |
-RUN_DATE |
-1 |
-7 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.css b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.js b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_RUNS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html
deleted file mode 100644
index e49a296..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS.html
+++ /dev/null
@@ -1,763 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| RUNID |
-NUMBER |
-No |
-null |
-1 |
-(Primary key) References plsql_profiler_runs |
-
-
-| UNIT_NUMBER |
-NUMBER |
-No |
-null |
-2 |
-(Primary key) Internally generated library unit # |
-
-
-| UNIT_TYPE |
-VARCHAR2(32 BYTE) |
-Yes |
-null |
-3 |
-Library unit type |
-
-
-| UNIT_OWNER |
-VARCHAR2(32 BYTE) |
-Yes |
-null |
-4 |
-Library unit owner name |
-
-
-| UNIT_NAME |
-VARCHAR2(32 BYTE) |
-Yes |
-null |
-5 |
-Library unit name timestamp on library unit |
-
-
-| UNIT_TIMESTAMP |
-DATE |
-Yes |
-null |
-6 |
-In the future will be used to detect changes to unit between runs |
-
-
-| TOTAL_TIME |
-NUMBER |
-No |
-0 |
-7 |
-Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools |
-
-
-| SPARE1 |
-NUMBER |
-Yes |
-null |
-8 |
-Unused |
-
-
-| SPARE2 |
-NUMBER |
-Yes |
-null |
-9 |
-Unused |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| SYS_C0020884 |
-Check |
-"TOTAL_TIME" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-null |
-null |
-null |
-
-
-| SYS_C0020885 |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-SYS_C0020885 |
-null |
-null |
-
-
-| SYS_C0020886 |
-Foreign_Key |
-null |
-WTP |
-PLSQL_PROFILER_RUNS |
-SYS_C0020883 |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-GENERATED NAME |
-null |
-null |
-29-JUN-2018 15:09:11 |
-null |
-null |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TOTAL_TIME |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNID |
-1 |
-
-
-| UNIT_NUMBER |
-2 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNID |
-1 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_PROFILER |
-PACKAGE BODY |
-WTP |
-PLSQL_PROFILER_UNITS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:11 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-PLSQL_PROFILER_UNITS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-10 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Table of program units for DBMS_PROFILER |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-SYS_C0020885 |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-RUNID, UNIT_NUMBER |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-SYS_C0020885 |
-WTP |
-PLSQL_PROFILER_UNITS |
-RUNID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-SYS_C0020885 |
-WTP |
-PLSQL_PROFILER_UNITS |
-UNIT_NUMBER |
-2 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.css b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.js b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif b/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/PLSQL_PROFILER_UNITS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html b/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html
deleted file mode 100644
index 1b2ce9e..0000000
--- a/docs/core/DBDocs/table/WT_DBOUT_PROFILES.html
+++ /dev/null
@@ -1,1096 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| TEST_RUN_ID |
-NUMBER(38,0) |
-No |
-null |
-1 |
-Foreign Key for the Test Run, Primary Key part 1. |
-
-
-| LINE |
-NUMBER(6,0) |
-No |
-null |
-2 |
-Source code line number, Primary Key part 2. |
-
-
-| STATUS |
-VARCHAR2(4 BYTE) |
-No |
-null |
-3 |
-Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler |
-
-
-| TOTAL_OCCUR |
-NUMBER(9,0) |
-No |
-null |
-4 |
-Number of times this line was executed. |
-
-
-| TOTAL_USECS |
-NUMBER(9,0) |
-No |
-null |
-5 |
-Total time in microseconds spent executing this line. |
-
-
-| MIN_USECS |
-NUMBER(9,0) |
-No |
-null |
-6 |
-Minimum execution time in microseconds for this line. |
-
-
-| MAX_USECS |
-NUMBER(9,0) |
-No |
-null |
-7 |
-Maximum execution time in microseconds for this line. |
-
-
-| TEXT |
-VARCHAR2(4000 BYTE) |
-No |
-null |
-8 |
-Source code text for this line number. |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_DBOUT_PROFILES_CK1 |
-Check |
-status in ('EXEC','NOTX','EXCL','IGNR','UNKN') |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:14 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_FK1 |
-Foreign_Key |
-null |
-WTP |
-WT_TEST_RUNS |
-WT_TEST_RUNS_PK |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN1 |
-Check |
-"TEST_RUN_ID" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN2 |
-Check |
-"LINE" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN3 |
-Check |
-"STATUS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN4 |
-Check |
-"TOTAL_OCCUR" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN5 |
-Check |
-"TOTAL_USECS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN6 |
-Check |
-"MIN_USECS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN7 |
-Check |
-"MAX_USECS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_NN8 |
-Check |
-"TEXT" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-null |
-null |
-null |
-
-
-| WT_DBOUT_PROFILES_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:13 |
-null |
-WT_DBOUT_PROFILES_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| STATUS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| LINE |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| STATUS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TOTAL_OCCUR |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TOTAL_USECS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| MIN_USECS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| MAX_USECS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEXT |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-| LINE |
-2 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| DELETE |
-PUBLIC |
-NO |
-WTP |
-WT_DBOUT_PROFILES |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_DBOUT_PROFILES |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_PROFILER |
-PACKAGE BODY |
-WTP |
-WT_DBOUT_PROFILES |
-TABLE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE BODY |
-WTP |
-WT_DBOUT_PROFILES |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE BODY |
-WTP |
-WT_DBOUT_PROFILES |
-TABLE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE |
-WTP |
-WT_DBOUT_PROFILES |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:13 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:14 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_DBOUT_PROFILES |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-PL/SQL Profiler data for Database Object Under Test (DBOUT). |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_DBOUT_PROFILES_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-TEST_RUN_ID, LINE |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_DBOUT_PROFILES_PK |
-WTP |
-WT_DBOUT_PROFILES |
-TEST_RUN_ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-WT_DBOUT_PROFILES_PK |
-WTP |
-WT_DBOUT_PROFILES |
-LINE |
-2 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.css b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.js b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabBg.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabL.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabL.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif b/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_DBOUT_PROFILES/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS.html b/docs/core/DBDocs/table/WT_RESULTS.html
deleted file mode 100644
index babf78f..0000000
--- a/docs/core/DBDocs/table/WT_RESULTS.html
+++ /dev/null
@@ -1,1155 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| TEST_RUN_ID |
-NUMBER(38,0) |
-No |
-null |
-1 |
-Foreign Key for the Test Run, Primary Key part 1. |
-
-
-| RESULT_SEQ |
-NUMBER(8,0) |
-No |
-null |
-2 |
-Sequence number for this Result, Primary Key part 2. |
-
-
-| EXECUTED_DTM |
-TIMESTAMP(6) |
-No |
-null |
-3 |
-Date/Time (with Fractional Seconds) this Result was captured |
-
-
-| INTERVAL_MSECS |
-NUMBER(10,3) |
-No |
-null |
-4 |
-Interval time in milliseonds since the previous Result or start ot the Test Run. |
-
-
-| ASSERTION |
-VARCHAR2(15 BYTE) |
-No |
-null |
-5 |
-Name of the Assertion Test performed |
-
-
-| STATUS |
-VARCHAR2(4 BYTE) |
-No |
-null |
-6 |
-Passed/Failed Status from the Assertion |
-
-
-| DETAILS |
-VARCHAR2(4000 BYTE) |
-No |
-null |
-7 |
-Assertion Details, i.e. Expected Value and Actual Value |
-
-
-| TESTCASE |
-VARCHAR2(50 BYTE) |
-Yes |
-null |
-8 |
-Optional Test Case name. |
-
-
-| MESSAGE |
-VARCHAR2(200 BYTE) |
-Yes |
-null |
-9 |
-Optional test identifier that helps connect an Assertion to the Test Runner. |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_RESULTS_CK1 |
-Check |
-status in ('PASS','FAIL') |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_FK1 |
-Foreign_Key |
-null |
-WTP |
-WT_TEST_RUNS |
-WT_TEST_RUNS_PK |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN2 |
-Check |
-"TEST_RUN_ID" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN3 |
-Check |
-"RESULT_SEQ" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN4 |
-Check |
-"EXECUTED_DTM" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN5 |
-Check |
-"INTERVAL_MSECS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN6 |
-Check |
-"ASSERTION" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN7 |
-Check |
-"STATUS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_NN8 |
-Check |
-"DETAILS" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_RESULTS_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-WT_RESULTS_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| STATUS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RESULT_SEQ |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| EXECUTED_DTM |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| INTERVAL_MSECS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| ASSERTION |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| STATUS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| DETAILS |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-| RESULT_SEQ |
-2 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| DELETE |
-PUBLIC |
-NO |
-WTP |
-WT_RESULTS |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_RESULTS |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_RESULT |
-PACKAGE BODY |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_ASSERT |
-PACKAGE BODY |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE BODY |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE BODY |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_ASSERT |
-PACKAGE |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-| WTP |
-WT_RESULT |
-PACKAGE |
-WTP |
-WT_RESULTS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:12 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:14 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_RESULTS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Results data from Test Runs. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_RESULTS_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-TEST_RUN_ID, RESULT_SEQ |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_RESULTS_PK |
-WTP |
-WT_RESULTS |
-TEST_RUN_ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-WT_RESULTS_PK |
-WTP |
-WT_RESULTS |
-RESULT_SEQ |
-2 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg b/docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/report.css b/docs/core/DBDocs/table/WT_RESULTS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_RESULTS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_RESULTS/report.js b/docs/core/DBDocs/table/WT_RESULTS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_RESULTS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topDimTabBg.gif b/docs/core/DBDocs/table/WT_RESULTS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topDimTabL.gif b/docs/core/DBDocs/table/WT_RESULTS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif b/docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif b/docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topTabL.gif b/docs/core/DBDocs/table/WT_RESULTS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_RESULTS/topTabR.gif b/docs/core/DBDocs/table/WT_RESULTS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_RESULTS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST.html b/docs/core/DBDocs/table/WT_SELF_TEST.html
deleted file mode 100644
index fa9760c..0000000
--- a/docs/core/DBDocs/table/WT_SELF_TEST.html
+++ /dev/null
@@ -1,739 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| ID |
-NUMBER |
-No |
-null |
-1 |
-Primary Key |
-
-
-| TEMP_CLOB |
-CLOB |
-Yes |
-null |
-2 |
-CLOB test data |
-
-
-| TEMP_NCLOB |
-NCLOB |
-Yes |
-null |
-3 |
-NCLOB test data |
-
-
-| TEMP_XML |
-XMLTYPE |
-Yes |
-null |
-4 |
-XML test data |
-
-
-| TEMP_BLOB |
-BLOB |
-Yes |
-null |
-5 |
-BLOB test data |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_SELF_TEST_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:13 |
-null |
-WT_SELF_TEST_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| ID |
-1 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-| WT_SELF_TEST$TEST |
-BEFORE EACH ROW |
-WTP |
-INSERT |
-ENABLED |
-WT_SELF_TEST |
-
-
-
-
-
-
-
-
-
-trigger wt_self_test$test
- before insert on wt_self_test
- for each row
-declare
- l_junk number;
-begin
- l_junk := 1;
-end;
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_ASSERT |
-PACKAGE BODY |
-WTP |
-WT_SELF_TEST |
-TABLE |
-
-
-| WTP |
-WT_SELF_TEST$TEST |
-TRIGGER |
-WTP |
-WT_SELF_TEST |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-SYS |
-XMLTYPE |
-TYPE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-SYS |
-STANDARD |
-PACKAGE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-PUBLIC |
-XMLTYPE |
-SYNONYM |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-SYS |
-XMLTYPE |
-TYPE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-SYS |
-STANDARD |
-PACKAGE |
-
-
-| WTP |
-WT_SELF_TEST |
-TABLE |
-PUBLIC |
-XMLTYPE |
-SYNONYM |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:21:13 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:13 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_SELF_TEST |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-10 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Test Data for unit testing of WTPLSQL. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_SELF_TEST_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-ID |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_SELF_TEST_PK |
-WTP |
-WT_SELF_TEST |
-ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/headerBg.jpg b/docs/core/DBDocs/table/WT_SELF_TEST/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/report.css b/docs/core/DBDocs/table/WT_SELF_TEST/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_SELF_TEST/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/report.js b/docs/core/DBDocs/table/WT_SELF_TEST/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_SELF_TEST/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabBg.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabL.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabR.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topTabBg.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topTabL.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_SELF_TEST/topTabR.gif b/docs/core/DBDocs/table/WT_SELF_TEST/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_SELF_TEST/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS.html b/docs/core/DBDocs/table/WT_TESTCASE_STATS.html
deleted file mode 100644
index fdc8e9c..0000000
--- a/docs/core/DBDocs/table/WT_TESTCASE_STATS.html
+++ /dev/null
@@ -1,826 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| TEST_RUN_ID |
-NUMBER(38,0) |
-No |
-null |
-1 |
-Primary (Surrogate) Key for each Test Run. Also the Test Runs Foreign Key. |
-
-
-| TESTCASE |
-VARCHAR2(50 BYTE) |
-No |
-null |
-2 |
-Primary Key (part 2). The testcase name |
-
-
-| TEST_YIELD |
-NUMBER |
-Yes |
-null |
-3 |
-Ratio of successful assertions to total assertions. |
-
-
-| ASSERTS |
-NUMBER |
-Yes |
-null |
-4 |
-Total number of assetions for the testcase. |
-
-
-| PASSES |
-NUMBER |
-Yes |
-null |
-5 |
-Number of passed assertions for the testcase. |
-
-
-| FAILURES |
-NUMBER |
-Yes |
-null |
-6 |
-Number of failed assertions for the testcase. |
-
-
-| ERRORS |
-NUMBER |
-Yes |
-null |
-7 |
-Number of errored assertions for the testcase. |
-
-
-| MIN_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-8 |
-Minimum interval time between assertions in milliseconds for the testcase |
-
-
-| AVG_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-9 |
-Average interval time between assertions in milliseconds for the testcase |
-
-
-| MAX_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-10 |
-Maximum interval time between assertions in milliseconds for the testcase |
-
-
-| TOT_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-11 |
-Total (sum) of interval times between assertions in milliseconds for the testcase |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_TESTCASE_STATS_FK1 |
-Foreign_Key |
-null |
-WTP |
-WT_TEST_RUNS |
-WT_TEST_RUNS_PK |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TESTCASE_STATS_NN1 |
-Check |
-"TEST_RUN_ID" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TESTCASE_STATS_NN2 |
-Check |
-"TESTCASE" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TESTCASE_STATS_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-WT_TESTCASE_STATS_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TESTCASE |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-| TESTCASE |
-2 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| DELETE |
-PUBLIC |
-NO |
-WTP |
-WT_TESTCASE_STATS |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_TESTCASE_STATS |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE BODY |
-WTP |
-WT_TESTCASE_STATS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:21:12 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_TESTCASE_STATS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Test Run data statistics for each testcase in the execution of the WTPLSQL_RUN procedure. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_TESTCASE_STATS_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-TEST_RUN_ID, TESTCASE |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_TESTCASE_STATS_PK |
-WTP |
-WT_TESTCASE_STATS |
-TEST_RUN_ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-WT_TESTCASE_STATS_PK |
-WTP |
-WT_TESTCASE_STATS |
-TESTCASE |
-2 |
-50 |
-50 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg b/docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.css b/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.js b/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_TESTCASE_STATS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabBg.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabL.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabL.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif b/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_TESTCASE_STATS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS.html b/docs/core/DBDocs/table/WT_TEST_RUNS.html
deleted file mode 100644
index 7dd7b30..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUNS.html
+++ /dev/null
@@ -1,1156 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| ID |
-NUMBER(38,0) |
-No |
-null |
-1 |
-Primary (Surrogate) Key for each Test Run |
-
-
-| START_DTM |
-TIMESTAMP(6) |
-No |
-null |
-2 |
-Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 1 |
-
-
-| RUNNER_NAME |
-VARCHAR2(128 BYTE) |
-No |
-null |
-3 |
-Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 2 |
-
-
-| RUNNER_OWNER |
-VARCHAR2(128 BYTE) |
-No |
-null |
-4 |
-Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3 |
-
-
-| DBOUT_OWNER |
-VARCHAR2(128 BYTE) |
-Yes |
-null |
-5 |
-Optional Owner of the Database Object Under Test (DBOUT). |
-
-
-| DBOUT_NAME |
-VARCHAR2(128 BYTE) |
-Yes |
-null |
-6 |
-Optional Name of the Database Object Under Test (DBOUT). |
-
-
-| DBOUT_TYPE |
-VARCHAR2(20 BYTE) |
-Yes |
-null |
-7 |
-Optional Type of the Database Object Under Test (DBOUT). |
-
-
-| TRIGGER_OFFSET |
-NUMBER |
-Yes |
-null |
-8 |
-Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block. |
-
-
-| PROFILER_RUNID |
-NUMBER |
-Yes |
-null |
-9 |
-Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence |
-
-
-| END_DTM |
-TIMESTAMP(6) |
-Yes |
-null |
-10 |
-Date/time (and fractional seconds) this Test Run ended. |
-
-
-| ERROR_MESSAGE |
-VARCHAR2(4000 BYTE) |
-Yes |
-null |
-11 |
-Optional Last error messages from this Test Run. |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_TEST_RUNS_FK1 |
-Foreign_Key |
-null |
-WTP |
-PLSQL_PROFILER_RUNS |
-SYS_C0020883 |
-NO ACTION |
-DISABLED |
-NOT DEFERRABLE |
-NOT VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUNS_NK1 |
-Unique |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-WT_TEST_RUNS_NK1 |
-null |
-null |
-
-
-| WT_TEST_RUNS_NN1 |
-Check |
-"ID" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUNS_NN2 |
-Check |
-"START_DTM" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUNS_NN3 |
-Check |
-"RUNNER_NAME" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUNS_NN4 |
-Check |
-"RUNNER_OWNER" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUNS_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:09:12 |
-null |
-WT_TEST_RUNS_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| PROFILER_RUNID |
-1 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| START_DTM |
-1 |
-
-
-| RUNNER_NAME |
-2 |
-
-
-| RUNNER_OWNER |
-3 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| ID |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| START_DTM |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNNER_NAME |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| RUNNER_OWNER |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| ID |
-1 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| DELETE |
-PUBLIC |
-NO |
-WTP |
-WT_TEST_RUNS |
-
-
-| INSERT |
-PUBLIC |
-NO |
-WTP |
-WT_TEST_RUNS |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_TEST_RUNS |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_RESULT |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| WTP |
-WT_PROFILER |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| PUBLIC |
-WT_TEST_RUNS |
-SYNONYM |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| WTP |
-WTPLSQL |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| WTP |
-WT_RESULT |
-PACKAGE |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE |
-WTP |
-WT_TEST_RUNS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:09:12 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:09:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_TEST_RUNS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Test Run data for each execution of the WTPLSQL_RUN procedure. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_TEST_RUNS_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-ID |
-
-
-| WTP |
-WT_TEST_RUNS_NK1 |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-START_DTM, RUNNER_NAME, RUNNER_OWNER |
-
-
-| WTP |
-WT_TEST_RUNS_IDX1 |
-NONUNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-START_DTM |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_TEST_RUNS_PK |
-WTP |
-WT_TEST_RUNS |
-ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_TEST_RUNS_NK1 |
-WTP |
-WT_TEST_RUNS |
-START_DTM |
-1 |
-11 |
-0 |
-ASC |
-null |
-
-
-| WTP |
-WT_TEST_RUNS_NK1 |
-WTP |
-WT_TEST_RUNS |
-RUNNER_NAME |
-2 |
-128 |
-128 |
-ASC |
-null |
-
-
-| WTP |
-WT_TEST_RUNS_NK1 |
-WTP |
-WT_TEST_RUNS |
-RUNNER_OWNER |
-3 |
-128 |
-128 |
-ASC |
-null |
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_TEST_RUNS_IDX1 |
-WTP |
-WT_TEST_RUNS |
-START_DTM |
-1 |
-11 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg b/docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/report.css b/docs/core/DBDocs/table/WT_TEST_RUNS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUNS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/report.js b/docs/core/DBDocs/table/WT_TEST_RUNS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUNS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabL.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabL.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUNS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS.html b/docs/core/DBDocs/table/WT_TEST_RUN_STATS.html
deleted file mode 100644
index 85a149d..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUN_STATS.html
+++ /dev/null
@@ -1,886 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| TEST_RUN_ID |
-NUMBER(38,0) |
-No |
-null |
-1 |
-Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key. |
-
-
-| TEST_YIELD |
-NUMBER |
-Yes |
-null |
-2 |
-Ratio of successful assertions to total assertions. |
-
-
-| ASSERTS |
-NUMBER |
-Yes |
-null |
-3 |
-Total number of assetions. |
-
-
-| PASSES |
-NUMBER |
-Yes |
-null |
-4 |
-Number of passed assertions. |
-
-
-| FAILURES |
-NUMBER |
-Yes |
-null |
-5 |
-Number of failed assertions. |
-
-
-| ERRORS |
-NUMBER |
-Yes |
-null |
-6 |
-Number of errored assertions. |
-
-
-| TESTCASES |
-NUMBER |
-Yes |
-null |
-7 |
-Total number of test cases. |
-
-
-| MIN_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-8 |
-Minimum interval time between assertions in milliseconds |
-
-
-| AVG_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-9 |
-Average interval time between assertions in milliseconds |
-
-
-| MAX_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-10 |
-Maximum interval time between assertions in milliseconds |
-
-
-| TOT_INTERVAL_MSECS |
-NUMBER |
-Yes |
-null |
-11 |
-Total (Sum) of interval times between assertions in milliseconds |
-
-
-| CODE_COVERAGE |
-NUMBER |
-Yes |
-null |
-12 |
-Ratio of execute source lines to valid executable source lines. |
-
-
-| PROFILED_LINES |
-NUMBER |
-Yes |
-null |
-13 |
-Total number of source lines as counted by DBMS_PROFILER |
-
-
-| EXECUTED_LINES |
-NUMBER |
-Yes |
-null |
-14 |
-Number of source lines executed |
-
-
-| IGNORED_LINES |
-NUMBER |
-Yes |
-null |
-15 |
-Number of source lines ignored as uncountable |
-
-
-| EXCLUDED_LINES |
-NUMBER |
-Yes |
-null |
-16 |
-Number of source lines excluded due to unexplained DBMS_PROFILER metrics |
-
-
-| NOTEXEC_LINES |
-NUMBER |
-Yes |
-null |
-17 |
-Number of source lines not execute |
-
-
-| UNKNOWN_LINES |
-NUMBER |
-Yes |
-null |
-18 |
-Number of source lines that have unexplained DBMS_PROFILER metrics |
-
-
-| MIN_EXECUTED_USECS |
-NUMBER |
-Yes |
-null |
-19 |
-Minumum execution time for a line of source in microseconds |
-
-
-| AVG_EXECUTED_USECS |
-NUMBER |
-Yes |
-null |
-20 |
-Average execution time for a line of source in microseconds |
-
-
-| MAX_EXECUTED_USECS |
-NUMBER |
-Yes |
-null |
-21 |
-Maximum execution time for a line of source in microseconds |
-
-
-| TOT_EXECUTED_USECS |
-NUMBER |
-Yes |
-null |
-22 |
-Total (Sum) of execution times for a line of source in microseconds |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-| WT_TEST_RUN_STATS_FK1 |
-Foreign_Key |
-null |
-WTP |
-WT_TEST_RUNS |
-WT_TEST_RUNS_PK |
-NO ACTION |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUN_STATS_NN1 |
-Check |
-"TEST_RUN_ID" IS NOT NULL |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-null |
-null |
-null |
-
-
-| WT_TEST_RUN_STATS_PK |
-Primary_Key |
-null |
-null |
-null |
-null |
-null |
-ENABLED |
-NOT DEFERRABLE |
-VALIDATED |
-USER NAME |
-null |
-null |
-29-JUN-2018 15:21:12 |
-null |
-WT_TEST_RUN_STATS_PK |
-null |
-null |
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-null |
-
-
-
-
-
-
-
-| COLUMN_NAME |
-COLUMN_POSITION |
-
-
-| TEST_RUN_ID |
-1 |
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| DELETE |
-PUBLIC |
-NO |
-WTP |
-WT_TEST_RUN_STATS |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_TEST_RUN_STATS |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| WTP |
-WT_TEST_RUN_STAT |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUN_STATS |
-TABLE |
-
-
-| WTP |
-WT_TEXT_REPORT |
-PACKAGE BODY |
-WTP |
-WT_TEST_RUN_STATS |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:21:12 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:13 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_TEST_RUN_STATS |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Test Run data statistics for each execution of the WTPLSQL_RUN procedure. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-| WTP |
-WT_TEST_RUN_STATS_PK |
-UNIQUE |
-VALID |
-NORMAL |
-N |
-NO |
-null |
-NO |
-TEST_RUN_ID |
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-TABLE_OWNER |
-TABLE_NAME |
-COLUMN_NAME |
-COLUMN_POSITION |
-COLUMN_LENGTH |
-CHAR_LENGTH |
-DESCEND |
-COLUMN_EXPRESSION |
-
-
-| WTP |
-WT_TEST_RUN_STATS_PK |
-WTP |
-WT_TEST_RUN_STATS |
-TEST_RUN_ID |
-1 |
-22 |
-0 |
-ASC |
-null |
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.css b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.js b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabL.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabL.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif b/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_TEST_RUN_STATS/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION.html b/docs/core/DBDocs/table/WT_VERSION.html
deleted file mode 100644
index 995b3c6..0000000
--- a/docs/core/DBDocs/table/WT_VERSION.html
+++ /dev/null
@@ -1,587 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| COLUMN_NAME |
-DATA_TYPE |
-NULLABLE |
-DATA_DEFAULT |
-COLUMN_ID |
-COMMENTS |
-
-
-| INSTALL_DTM |
-DATE |
-Yes |
-null |
-1 |
-Date/Time the version that was installed/upgraded |
-
-
-| ACTION |
-VARCHAR2(15 BYTE) |
-Yes |
-null |
-2 |
-null |
-
-
-| TEXT |
-VARCHAR2(15 BYTE) |
-Yes |
-null |
-3 |
-Name of the version that was installed/upgraded |
-
-
-
-
-
-
-
-
-| CONSTRAINT_NAME |
-CONSTRAINT_TYPE |
-SEARCH_CONDITION |
-R_OWNER |
-R_TABLE_NAME |
-R_CONSTRAINT_NAME |
-DELETE_RULE |
-STATUS |
-DEFERRABLE |
-VALIDATED |
-GENERATED |
-BAD |
-RELY |
-LAST_CHANGE |
-INDEX_OWNER |
-INDEX_NAME |
-INVALID |
-VIEW_RELATED |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| PRIVILEGE |
-GRANTEE |
-GRANTABLE |
-GRANTOR |
-OBJECT_NAME |
-
-
-| SELECT |
-PUBLIC |
-NO |
-WTP |
-WT_VERSION |
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| LAST_ANALYZED_SINCE |
-null |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| TRIGGER_NAME |
-TRIGGER_TYPE |
-TRIGGER_OWNER |
-TRIGGERING_EVENT |
-STATUS |
-TABLE_NAME |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-| PUBLIC |
-WT_VERSION |
-SYNONYM |
-WTP |
-WT_VERSION |
-TABLE |
-
-
-| WTP |
-WTPLSQL |
-PACKAGE BODY |
-WTP |
-WT_VERSION |
-TABLE |
-
-
-
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-| OWNER |
-NAME |
-TYPE |
-REFERENCED_OWNER |
-REFERENCED_NAME |
-REFERENCED_TYPE |
-
-
-
-
-
-
-
-
-
-
-| NAME |
-VALUE |
-
-
-| CREATED |
-29-JUN-2018 15:12:21 |
-
-
-| LAST_DDL_TIME |
-29-JUN-2018 15:21:12 |
-
-
-| OWNER |
-WTP |
-
-
-| TABLE_NAME |
-WT_VERSION |
-
-
-| TABLESPACE_NAME |
-USERS |
-
-
-| CLUSTER_NAME |
-null |
-
-
-| IOT_NAME |
-null |
-
-
-| STATUS |
-VALID |
-
-
-| PCT_FREE |
-0 |
-
-
-| PCT_USED |
-null |
-
-
-| INI_TRANS |
-1 |
-
-
-| MAX_TRANS |
-255 |
-
-
-| INITIAL_EXTENT |
-65536 |
-
-
-| NEXT_EXTENT |
-1048576 |
-
-
-| MIN_EXTENTS |
-1 |
-
-
-| MAX_EXTENTS |
-2147483645 |
-
-
-| PCT_INCREASE |
-null |
-
-
-| FREELISTS |
-null |
-
-
-| FREELIST_GROUPS |
-null |
-
-
-| LOGGING |
-YES |
-
-
-| BACKED_UP |
-N |
-
-
-| NUM_ROWS |
-null |
-
-
-| BLOCKS |
-null |
-
-
-| EMPTY_BLOCKS |
-null |
-
-
-| AVG_SPACE |
-null |
-
-
-| CHAIN_CNT |
-null |
-
-
-| AVG_ROW_LEN |
-null |
-
-
-| AVG_SPACE_FREELIST_BLOCKS |
-null |
-
-
-| NUM_FREELIST_BLOCKS |
-null |
-
-
-| DEGREE |
-1 |
-
-
-| INSTANCES |
-1 |
-
-
-| CACHE |
-N |
-
-
-| TABLE_LOCK |
-ENABLED |
-
-
-| SAMPLE_SIZE |
-null |
-
-
-| LAST_ANALYZED |
-null |
-
-
-| PARTITIONED |
-NO |
-
-
-| IOT_TYPE |
-null |
-
-
-| OBJECT_ID_TYPE |
-null |
-
-
-| TABLE_TYPE_OWNER |
-null |
-
-
-| TABLE_TYPE |
-null |
-
-
-| TEMPORARY |
-N |
-
-
-| SECONDARY |
-N |
-
-
-| NESTED |
-NO |
-
-
-| BUFFER_POOL |
-DEFAULT |
-
-
-| ROW_MOVEMENT |
-DISABLED |
-
-
-| GLOBAL_STATS |
-NO |
-
-
-| USER_STATS |
-NO |
-
-
-| DURATION |
-null |
-
-
-| SKIP_CORRUPT |
-DISABLED |
-
-
-| MONITORING |
-YES |
-
-
-| CLUSTER_OWNER |
-null |
-
-
-| DEPENDENCIES |
-DISABLED |
-
-
-| COMPRESSION |
-DISABLED |
-
-
-| COMPRESS_FOR |
-null |
-
-
-| DROPPED |
-NO |
-
-
-| COMMENTS |
-Records the installed and upgraded versions. |
-
-
-
-
-
-
-
-
-| PARTITION_NAME |
-LAST_ANALYZED |
-NUM_ROWS |
-BLOCKS |
-SAMPLE_SIZE |
-HIGH_VALUE |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| INDEX_OWNER |
-INDEX_NAME |
-UNIQUENESS |
-STATUS |
-INDEX_TYPE |
-TEMPORARY |
-PARTITIONED |
-FUNCIDX_STATUS |
-JOIN_INDEX |
-COLUMNS |
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/core/DBDocs/table/WT_VERSION/headerBg.jpg b/docs/core/DBDocs/table/WT_VERSION/headerBg.jpg
deleted file mode 100644
index 69df3af..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/headerBg.jpg and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/report.css b/docs/core/DBDocs/table/WT_VERSION/report.css
deleted file mode 100644
index 8a1b233..0000000
--- a/docs/core/DBDocs/table/WT_VERSION/report.css
+++ /dev/null
@@ -1,149 +0,0 @@
-* {
- font-family: Tahoma, Arial, Helvetica, Geneva, sans-serif;
-}
-
-body {
- background-color: #fff;
- margin: 0;
-}
-
-br {
- clear: both
-}
-
-pre {
- font-family : Courier;
-}
-
-/* IMAGES */
-
-div.currentmasterreport img, div.currentchildreport img {
- border: 0;
-}
-
-/* TABLES */
-
-div.currentmasterreport table, div.currentchildreport table {
- border-spacing: 0px;
- empty-cells: show;
-}
-
-div.currentmasterreport table th, div.currentchildreport table th {
- color: #2b7c92;
- white-space: nowrap;
- padding: 2px 8px;
- background-color: #cfe0f1;
- background-image: none;
- color: #2b7c92;
- font-size: 11px;
- letter-spacing: 1px;
- text-decoration: underline;
-}
-
-div.currentmasterreport table td, div.currentchildreport table td {
- background: none;
- border-top: 1px #fff solid;
- border-bottom: 1px #ccc solid;
- font-size: 8pt;
- padding: 3px 9px;
- background-color: #f2f2f5;
- border-collapse: collapse;
-}
-
-div.currentmasterreport table td.currentcell, div.currentchildreport table td.currentcell {
- background-color: rgb(214,214,214);
-}
-
-/* TITLE BANNER */
-
-div.banner {
- background-image: url(headerBg.jpg);
- background-repeat: repeat-x;
- padding: 5px 5px 0 5px;
- margin: 0 0 15px 0;
-}
-
-h2.banner {
- color: #fff;
- font-size: 2em;
-}
-
-small.banner {
- color: #fff;
-}
-
-/* REPORT TABS */
-
-div.currentmaintab, div.currentchildtab {
- background-image: url(topDimTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.maintab, div.childtab {
- background-image: url(topTabL.gif);
- display: block;
- float: left;
- height: 21px;
- padding: 0;
- margin: 0 5px 0 0;
- background-repeat: no-repeat
-}
-
-div.currentmaintab div, div.currentchildtab div {
- background-image: url(topDimTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.maintab div, div.childtab div {
- background-image: url(topTabR.gif);
- background-repeat: no-repeat;
- background-position: top right;
- height: 21px;
- float: left;
- margin: 0;
-}
-
-div.currentmaintab div p, div.currentchildtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topDimTabBg.gif);
- font-weight:bold;
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-div.maintab div p, div.childtab div p {
- margin: 0 8px;
- height: 21px;
- line-height: 21px;
- background-image: url(topTabBg.gif);
- display: block;
- text-decoration: none;
- vertical-align: middle;
- float: left;
- font-size: 9pt;
-}
-
-/* REPORTS */
-
-div.masterreport, div.childreport {
- display:none;
-}
-
-div.currentmasterreport, div.currentchildreport {
- display:inline;
-}
-
diff --git a/docs/core/DBDocs/table/WT_VERSION/report.js b/docs/core/DBDocs/table/WT_VERSION/report.js
deleted file mode 100644
index 1577860..0000000
--- a/docs/core/DBDocs/table/WT_VERSION/report.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Called from the boilerplate html when a new main tab is selected.
- */
-function onSelectMainTab(node, newMainIndex) {
- highlightMainTab(node);
- showMain(newMainIndex);
-}
-
-/*
- * Called from the boilerplate html when a new child tab is selected.
- */
-function onSelectChildTab(node, newChildIndex) {
- highlightChildTab(node);
- showChild(newChildIndex, rowIndex);
-}
-
-/*
- * Called from the report specific code when a new master row is selected.
- */
-function onSelectRowIndex(rowIndex) {
- showChild(childIndex, rowIndex);
-}
-
-/**********************************************************************************************************************
- Implementation code
- ***********************************************************************************************************************/
-
-var mainIndex = 0;
-var childIndex = 0;
-var rowIndex = 0;
-var selectedChildReport;
-
-/*
- * Modifies the UI by highlighting the selected main tab and unhighlighting the rest.
- */
-function highlightMainTab(node) {
- if (node.className != "currentmaintab") {
- var tabNodes = document.getElementById("maintabs").children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentmaintab") {
- tabNode.className = "maintab";
- }
- }
- node.className = "currentmaintab";
- }
-}
-
-/*
- * Modifies the UI by highlighting the selected child tab and unhighlighting the rest.
- */
-function highlightChildTab(node) {
- if (node.className != "currentchildtab") {
- var tabNodes = document.getElementById("ChildTabs." + mainIndex).children;
- for (var t = 0;t < tabNodes.length;t++) {
- var tabNode = tabNodes[t];
- if (tabNode.className == "currentchildtab") {
- tabNode.className = "childtab";
- }
- }
- node.className = "currentchildtab";
- }
-}
-
-/*
- * Modifies the UI by showing the selected main report and hiding the rest.
- */
-function showMain(newMainIndex) {
- if (newMainIndex != mainIndex) {
- var newMainId = "Master." + newMainIndex;
- var mainElements = document.getElementById("masterreports").children;
- for (var m = 0;m < mainElements.length;m++) {
- var mainElement = mainElements[m];
- if (mainElement.id == newMainId) {
- mainElement.children[0].className = "currentmasterreport";
- var childReportElement = document.getElementById("ChildReports." + newMainIndex);
- if (childReportElement != null) {
- var childElements = childReportElement.children;
- for (var c = 0;c < childElements.length;c++) {
- var childElement = childElements[c];
- if (childElement.children[0].className == "currentchildreport") {
- var childReportId = childElement.id;
- var firstDot = childReportId.indexOf(".");
- var secondDot = childReportId.indexOf(".", firstDot + 1);
- var thirdDot = childReportId.indexOf(".", secondDot + 1);
- selectedChildReport = childElement;
- rowIndex = parseInt(childReportId.substring(secondDot + 1, thirdDot));
- childIndex = parseInt(childReportId.substring(firstDot + 1, secondDot));
- }
- }
- }
- mainIndex = newMainIndex;
- }
- else {
- var firstChildElement = mainElement.children[0];
- if (firstChildElement.className == "currentmasterreport") {
- firstChildElement.className = "masterreport";
- }
- }
- }
- }
-}
-
-/*
- * Modifies the UI by showing the selected child report and hiding the rest.
- */
-function showChild(newChildIndex, newRowIndex) {
- if (newRowIndex != rowIndex || newChildIndex != childIndex) {
- if (selectedChildReport == null) {
- selectedChildReport = document.getElementById("ChildReports." + mainIndex).children[0];
- }
- selectedChildReport.children[0].className = "childreport";
- var newChildId = "Child." + newChildIndex + "." + newRowIndex + "." + mainIndex;
- selectedChildReport = document.getElementById(newChildId);
- selectedChildReport.children[0].className = "currentchildreport";
- childIndex = newChildIndex;
- rowIndex = newRowIndex;
- }
-}/**********************************************************************************************************************
- Table report code
-***********************************************************************************************************************/
-
-var table_selectedRows = new Array();
-
-function table_onSelectMasterRow(node, tableNo, newMasterIndex) {
- table_onSelectRow(node, tableNo);
- onSelectRowIndex(newMasterIndex);
-}
-
-function table_onSelectRow(node, tableNo) {
- if (node.className != "currentrow") {
- previousRow = table_selectedRows[tableNo];
- if (previousRow == null) {
- previousRow = node.parentNode.children[1];
- }
- previousRow.className = "";
- var previousCells = previousRow.children;
- for (var pc = 0;pc < previousCells.length;pc++) {
- previousCells[pc].className = "";
- }
- node.className = "currentrow";
- var nodeCells = node.children;
- for (var nc = 0;nc < nodeCells.length;nc++) {
- nodeCells[nc].className = "currentcell";
- }
- table_selectedRows[tableNo] = node;
- }
-}
diff --git a/docs/core/DBDocs/table/WT_VERSION/topDimTabBg.gif b/docs/core/DBDocs/table/WT_VERSION/topDimTabBg.gif
deleted file mode 100644
index dae74c1..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topDimTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/topDimTabL.gif b/docs/core/DBDocs/table/WT_VERSION/topDimTabL.gif
deleted file mode 100644
index def5846..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topDimTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif b/docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif
deleted file mode 100644
index 3233a6e..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topDimTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/topTabBg.gif b/docs/core/DBDocs/table/WT_VERSION/topTabBg.gif
deleted file mode 100644
index f8b692b..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topTabBg.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/topTabL.gif b/docs/core/DBDocs/table/WT_VERSION/topTabL.gif
deleted file mode 100644
index 1b00dc0..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topTabL.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/WT_VERSION/topTabR.gif b/docs/core/DBDocs/table/WT_VERSION/topTabR.gif
deleted file mode 100644
index d24e5eb..0000000
Binary files a/docs/core/DBDocs/table/WT_VERSION/topTabR.gif and /dev/null differ
diff --git a/docs/core/DBDocs/table/index.html b/docs/core/DBDocs/table/index.html
deleted file mode 100644
index 2ab8e9d..0000000
--- a/docs/core/DBDocs/table/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-Tables
-
\ No newline at end of file
diff --git a/docs/core/ER_Diagrams.pdf b/docs/core/ER_Diagrams.pdf
deleted file mode 100644
index 12a4675..0000000
Binary files a/docs/core/ER_Diagrams.pdf and /dev/null differ
diff --git a/docs/core/README.md b/docs/core/README.md
deleted file mode 100644
index 2e981ae..0000000
--- a/docs/core/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# wtPLSQL
-Whitebox Testing Framework for Oracle's PL/SQL Language
-
-### Files and Directories
-
-File Name | Description
------------------------|------------
-DBDocs | SQL Developer DBDocs Files
-Call_Tree_Diagrams.odg | LibreOffice Draw File for Process Call Trees
-Call_Tree_Diagrams.pdf | Process Call Tree (Graph) Diagrams
-ER_Diagrams.pdf | Entity-Relationship Diagrams
diff --git a/docs/demo/Package-Test.htm b/docs/demo/Package-Test.htm
index 966deb2..3b30714 100644
--- a/docs/demo/Package-Test.htm
+++ b/docs/demo/Package-Test.htm
@@ -1,9 +1,9 @@
Demos and Examples
Test a PL/SQL Package
-A majority of wtPLSQL testing is done with the test runner packages. In this example, a test runner package will be created to test the DBMS_OUTPUT package. For brevity, only PUT_LINE and GET_LINE will be tested.
+A majority of wtPLSQL testing is done with a Test Runner package. In this example, we will create a Test Runner package that will test the DBMS_OUTPUT package. The DBMS_OUTPUT package is a part of every Oracle database. For brevity, only PUT_LINE and GET_LINE will be tested in the DBMS_OUTPUT package.
Test Runner Package Specification
-The specification for a test runner package is brutally simple. It only needs one procedure.
+The specification for a Test Runner package is brutally simple. It only needs one procedure. Here, we create a package specification for the Test Runner.
Run this:
create or replace package test_dbms_output authid definer
as
@@ -13,6 +13,7 @@ Test Runner Package Specification
Test Runner Package Body
Create a package body with the needed procedure. Add a call to enable DBMS_OUTPUT for testing. Setup and teardown will be handled later.
+Run this:
create or replace package body test_dbms_output
as
procedure wtplsql_run
@@ -23,7 +24,6 @@ Test Runner Package Body
end test_dbms_output;
/
-Procedures will be added to this package body. These procedures will run the assertions that will test the DBMS_OUTPUT package.
Testing Put Line and Get Line
The new TEST_PUT_GET_LINE procedure will test the PUT_LINE and GET_LINE procedures together. Also, the TEST_PUT_GET_LINE procedure call is added to the WTPLSQL_RUN procedure.
Run this:
@@ -48,30 +48,34 @@ Testing Put Line and Get Line
end test_dbms_output;
/
-Run this:
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_test_run.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+end;
+/
+
+Then, run this:
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 44: 16-Jun-2018 03:45:33 PM
-
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 4 Failed Assertions: 0
- Average Interval msec: 4 Error Assertions: 0
- Maximum Interval msec: 4 Test Yield: 100.00%
- Total Run Time (sec): 0.0
-
- - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 44)
------------------------------------------------------------
- PASS 4ms Test 1. EQ - Expected "Test 1" and got "Test 1"
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 01:21:28 AM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
-A successful test. Notice that the value of the C_TEST1 constant is displayed in the test result details.
-Leaving Something Behind
-In the previous example, everything worked correctly. If a problem occurs during testing, things can be left behind. Here is an example of GET_LINE not working, leaving the value of C_TEST1 in the DBMS_OUTPUT buffer. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call.
+A successful test.
+Catching an Exception
+In the previous example, everything worked correctly. Here is an example of GET_LINE not working. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call.
Run this:
create or replace package body test_dbms_output
as
@@ -103,31 +107,36 @@ Leaving Something Behind
And get this:
Test 1
-
-Notice there was no exception raised. wtPLSQL captured the exception and logged it. Also, the value of C_TEST1 shows in the output. It was left behind in the DBMS_OUTPUT buffer.
-Run this:
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
-
-And get this:
- wtPLSQL 1.1.0 - Run ID 49: 16-Jun-2018 04:18:39 PM
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.0
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 12-Apr-2024 09:49:26 PM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 0
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 0
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 0%
*** Test Runner Error ***
-ORA-20000: Fault insertion exception
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18
+Hook Error in "execute_test_runner", SEQ 20.
+ORA-06512: at "WT_DEMO.TEST_DBMS_OUTPUT", line 10
+ORA-06512: at "WT_DEMO.TEST_DBMS_OUTPUT", line 18
ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 309
+ORA-06512: at "WTP.WT_EXECUTE_TEST_RUNNER", line 11
+ORA-06512: at line 1
+ORA-06512: at "WTP.HOOK", line 41
+----- PL/SQL Call Stack -----
+ object line object
+ handle number name
+0xa28c8178 43 package body WTP.HOOK.RUN
+0x6f239218 503 package body WTP.WTPLSQL.TEST_RUN
+0x9fa74a88 2 anonymous block
+
+ * NOTE: No Data in Test Results Array "core_data.g_results_nt"
+Your results should include the above results, if DBMS_OUTPUT is enabled. There may be addition results due to a different wtPSQL configuration.
+Notice there was no exception raised. wtPLSQL captured the exception and logged it. Also, the value of C_TEST1 shows in the output. It was left behind in the DBMS_OUTPUT buffer.
No assertions were run because of the exception. The exception that was captured appears below the test results summary.
Setup and Teardown
Setup and Teardown procedures are used to prepare for and cleanup from tests. For DBMS_OUTPUT testing, the buffer needs to be preserved before testing starts. After testing is complete, the original buffer contents need to be returned to the buffer.
@@ -181,8 +190,9 @@ Setup and Teardown
test_put_get_line;
teardown;
exception when others then
- l_error_message := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,4000);
+ l_error_message := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,4000);
teardown;
raise_application_error(-20000, l_error_message);
end wtplsql_run;
@@ -190,7 +200,7 @@ Setup and Teardown
end test_dbms_output;
/
-The test runner package is quite large now. To review, the test runner will
+The Test Runner package is quite large now. To review, the Test Runner will
- Capture the current DBMS_OUPUT buffer.
- Run a procedure that adds to the DBMS_OUPUT buffer.
@@ -199,7 +209,7 @@ Setup and Teardown
- Clear the current DBMS_OUPUT buffer.
- Restore the original DBMS_OUPUT buffer.
-In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the test runner completes.
+In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the Test Runner completes.
Run this:
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
@@ -208,33 +218,38 @@ Setup and Teardown
And get this:
This should be preserved.
-
-Excellent! The original DBMS_OUPUT buffer was preserved and the errant C_TEST1 value was removed.
-Run this:
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
-
-And get this:
- wtPLSQL 1.1.0 - Run ID 51: 16-Jun-2018 04:56:39 PM
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.1
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 12:49:43 AM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 0
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 0
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 0%
*** Test Runner Error ***
+Hook Error in "execute_test_runner", SEQ 20.
ORA-20000: ORA-20000: Fault insertion exception
ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21
ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53
+ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 54
ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 309
+ORA-06512: at "WTP.WT_EXECUTE_TEST_RUNNER", line 11
+ORA-06512: at line 1
+ORA-06512: at "WTP.HOOK", line 41
+----- PL/SQL Call Stack -----
+ object line object
+ handle number name
+0x9deb4af8 43 package body WTP.HOOK.RUN
+0x99b16938 503 package body WTP.WTPLSQL.TEST_RUN
+0x7d7d6190 2 anonymous block
+
+ * NOTE: No Data in Test Results Array "core_data.g_results_nt"
+
-The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved.
-These are all the basic tools needed to successfully create and run test runner packages in wtPLSQL.
+The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved.
+These are all the basic tools needed to successfully create and run Test Runner packages in wtPLSQL.
Demos and Examples
diff --git a/docs/demo/Package-Test.md b/docs/demo/Package-Test.md
index b2c2623..2b3b1c4 100644
--- a/docs/demo/Package-Test.md
+++ b/docs/demo/Package-Test.md
@@ -4,11 +4,11 @@
---
-A majority of wtPLSQL testing is done with the test runner packages. In this example, a test runner package will be created to test the DBMS_OUTPUT package. For brevity, only PUT_LINE and GET_LINE will be tested.
+A majority of wtPLSQL testing is done with a Test Runner package. In this example, we will create a Test Runner package that will test the DBMS_OUTPUT package. The DBMS_OUTPUT package is a part of every Oracle database. For brevity, only PUT_LINE and GET_LINE will be tested in the DBMS_OUTPUT package.
## Test Runner Package Specification
-The specification for a test runner package is brutally simple. It only needs one procedure.
+The specification for a Test Runner package is brutally simple. It only needs one procedure. Here, we create a package specification for the Test Runner.
Run this:
@@ -24,6 +24,8 @@ end test_dbms_output;
Create a package body with the needed procedure. Add a call to enable DBMS_OUTPUT for testing. Setup and teardown will be handled later.
+Run this:
+
```
create or replace package body test_dbms_output
as
@@ -36,8 +38,6 @@ end test_dbms_output;
/
```
-Procedures will be added to this package body. These procedures will run the assertions that will test the DBMS_OUTPUT package.
-
## Testing Put Line and Get Line
The new TEST_PUT_GET_LINE procedure will test the PUT_LINE and GET_LINE procedures together. Also, the TEST_PUT_GET_LINE procedure call is added to the WTPLSQL_RUN procedure.
@@ -67,12 +67,22 @@ end test_dbms_output;
/
```
-Run this:
+Run this to setup HOOKS:
+
+```
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_test_run.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+end;
+/
+```
+
+Then, run this:
```
begin
wtplsql.test_run('TEST_DBMS_OUTPUT');
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
end;
/
```
@@ -80,25 +90,22 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 44: 16-Jun-2018 03:45:33 PM
-
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 4 Failed Assertions: 0
- Average Interval msec: 4 Error Assertions: 0
- Maximum Interval msec: 4 Test Yield: 100.00%
- Total Run Time (sec): 0.0
-
- - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 44)
------------------------------------------------------------
- PASS 4ms Test 1. EQ - Expected "Test 1" and got "Test 1"
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 01:21:28 AM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
```
-A successful test. Notice that the value of the C_TEST1 constant is displayed in the test result details.
+A successful test.
-## Leaving Something Behind
+## Catching an Exception
-In the previous example, everything worked correctly. If a problem occurs during testing, things can be left behind. Here is an example of GET_LINE not working, leaving the value of C_TEST1 in the DBMS_OUTPUT buffer. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call.
+In the previous example, everything worked correctly. Here is an example of GET_LINE not working. For testing purposes, an exception will be thrown between the PUT_LINE and GET_LINE call.
Run this:
@@ -139,39 +146,39 @@ And get this:
```
Test 1
-```
-
-Notice there was no exception raised. wtPLSQL captured the exception and logged it. Also, the value of C_TEST1 shows in the output. It was left behind in the DBMS_OUTPUT buffer.
-
-Run this:
-
-```
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
-```
-
-And get this:
-
-```
- wtPLSQL 1.1.0 - Run ID 49: 16-Jun-2018 04:18:39 PM
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.0
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 12-Apr-2024 09:49:26 PM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 0
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 0
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 0%
*** Test Runner Error ***
-ORA-20000: Fault insertion exception
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18
+Hook Error in "execute_test_runner", SEQ 20.
+ORA-06512: at "WT_DEMO.TEST_DBMS_OUTPUT", line 10
+ORA-06512: at "WT_DEMO.TEST_DBMS_OUTPUT", line 18
ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 309
+ORA-06512: at "WTP.WT_EXECUTE_TEST_RUNNER", line 11
+ORA-06512: at line 1
+ORA-06512: at "WTP.HOOK", line 41
+----- PL/SQL Call Stack -----
+ object line object
+ handle number name
+0xa28c8178 43 package body WTP.HOOK.RUN
+0x6f239218 503 package body WTP.WTPLSQL.TEST_RUN
+0x9fa74a88 2 anonymous block
+
+ * NOTE: No Data in Test Results Array "core_data.g_results_nt"
```
+Your results should include the above results, if DBMS_OUTPUT is enabled. There may be addition results due to a different wtPSQL configuration.
+
+Notice there was no exception raised. wtPLSQL captured the exception and logged it. Also, the value of C_TEST1 shows in the output. It was left behind in the DBMS_OUTPUT buffer.
+
No assertions were run because of the exception. The exception that was captured appears below the test results summary.
## Setup and Teardown
@@ -230,8 +237,9 @@ as
test_put_get_line;
teardown;
exception when others then
- l_error_message := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,4000);
+ l_error_message := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,4000);
teardown;
raise_application_error(-20000, l_error_message);
end wtplsql_run;
@@ -240,7 +248,7 @@ end test_dbms_output;
/
```
-The test runner package is quite large now. To review, the test runner will
+The Test Runner package is quite large now. To review, the Test Runner will
* Capture the current DBMS_OUPUT buffer.
* Run a procedure that adds to the DBMS_OUPUT buffer.
* Catch an exception raised by the procedure.
@@ -248,7 +256,7 @@ The test runner package is quite large now. To review, the test runner will
* Clear the current DBMS_OUPUT buffer.
* Restore the original DBMS_OUPUT buffer.
-In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the test runner completes.
+In order to ensure it is restoring the original DBMS_OUPUT buffer, the message "This should be preserved." is added to the buffer. That message should be available after the Test Runner completes.
Run this:
@@ -263,43 +271,41 @@ And get this:
```
This should be preserved.
-```
-
-Excellent! The original DBMS_OUPUT buffer was preserved and the errant C_TEST1 value was removed.
-
-Run this:
-
-```
-begin
- wt_text_report.dbms_out(USER,'TEST_DBMS_OUTPUT',30);
-end;
-/
-```
-
-And get this:
-
-```
- wtPLSQL 1.1.0 - Run ID 51: 16-Jun-2018 04:56:39 PM
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.1
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 12:49:43 AM
+ Test Results for WT_DEMO.TEST_DBMS_OUTPUT
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 0
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 0
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 0%
*** Test Runner Error ***
+Hook Error in "execute_test_runner", SEQ 20.
ORA-20000: ORA-20000: Fault insertion exception
ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21
ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53
+ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 54
ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 309
+ORA-06512: at "WTP.WT_EXECUTE_TEST_RUNNER", line 11
+ORA-06512: at line 1
+ORA-06512: at "WTP.HOOK", line 41
+----- PL/SQL Call Stack -----
+ object line object
+ handle number name
+0x9deb4af8 43 package body WTP.HOOK.RUN
+0x99b16938 503 package body WTP.WTPLSQL.TEST_RUN
+0x7d7d6190 2 anonymous block
+
+ * NOTE: No Data in Test Results Array "core_data.g_results_nt"
+
```
The exception handler preserved the error stack before calling teardown. Also, there is an extra "ORA-20000:" at the front of the error stack displayed, but all the error information is preserved.
-These are all the basic tools needed to successfully create and run test runner packages in wtPLSQL.
+These are all the basic tools needed to successfully create and run Test Runner packages in wtPLSQL.
---
[Demos and Examples](README.md)
diff --git a/docs/demo/README.htm b/docs/demo/README.htm
index 94aebe1..0346d1f 100644
--- a/docs/demo/README.htm
+++ b/docs/demo/README.htm
@@ -1,36 +1,27 @@
Website Home Page
Demonstrations and Examples
-Demonstrations and examples assume successful connection to an Oracle database with wtPLSQL installed. wtPLSQL Installation instructions are available on the wtPLSQL Releases page.
-Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT.
-The Basics
+Demonstrations and examples assume successful connection to an Oracle database with wtPLSQL installed. wtPLSQL Installation instructions are available on the wtPLSQL Releases page.
+Demonstrations and examples requires the Persist add-on. Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_PERSIST_REPORT. This package displays test results using DBMS_OUTPUT.
+User Setup
A login, or database session, is required to interact with the Oracle database. The SQL below will create a user that can run these examples. If you already have a database login, this is not necessary.
-create user wtp_demo identified by wtp_demo
- default tablespace users
- quota unlimited on users
- temporary tablespace temp;
-
-grant create session to wtp_demo;
-grant create type to wtp_demo;
-grant create sequence to wtp_demo;
-grant create table to wtp_demo;
-grant create trigger to wtp_demo;
-grant create view to wtp_demo;
-grant create procedure to wtp_demo;
-
-The simplest check for a wtPLSQL installation is to select the "version from dual".
+To create a database login, run this installer:
+
+- cd to "src/demo"
+- login as SYS or SYSTEM using SQL*Plus
+- Run the "install_sys.sql" script
+
+To confirm a successful install, review the "install_sys.LST" log file.
+Confirm the Installation
+The simplest check for a wtPLSQL installation is to select the "version from dual". If wtPSQL is installed, it will show which add-ons have been installed if any.
Run this:
select wtplsql.show_version from dual;
-And get this:
-SHOW_VERSION
------------------------------------------------------------
-1.1.0
-
-This shows the wtPLSQL version as 1.1.0.
-Another simple test is an ad-hoc assertion. This test requires DBMS_OUTPUT. The results of this test are not recorded.
+If the result is something like "wtpsrc 1.003, wtpsav 1.003", wtPSQL is installed with the Persist (wtpsav) add-on. If the result is ,missing "wtpsav", the Persist add-on has not been installed. For simplicity, the adjustments required to make the demonstrations and exercises work without the Persist add-on are not included.
+Another simple test
+Another simple test is an ad-hoc assertion. The ad-hoc assertion requires DBMS_OUTPUT. The results of the ad-hoc assertions are not recorded by wtPLSQL.
Run this:
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
begin
wt_assert.eq(msg_in => 'Ad-Hoc Test'
@@ -40,18 +31,22 @@ The Basics
/
And get this:
-PASS Ad-Hoc Test. EQ - Expected "1" and got "1"
+Ad-Hoc Test
+ Assertion EQ PASSED.
+ Expected "1" and got "1"
This indicates:
+- the assertion had the message "Ad-Hoc Test"
+- the assertion name is "EQ"
- the assertion passed
-- the assertion had the message "Ad-Hoc Test"
-- the assertion name is "EQ"
- the assertion details which may include the values tested
-Note: This ad-hoc test also demonstrates implicit data type conversion.
+Note: This ad-hoc test also demonstrates implicit data type conversion between number and varchar2.
Create a Test Runner Package
-A test runner package is central to running tests in wtPLSQL. The Test Runner page covers all the basics of creating a test runner package.
+Creating a Test Runner package is central to using the wtPLSQL server. The Test Runner package contains all the assertion API calls used for testing. The package can also update/change wtPSQL settings, like the name of the Database Object Under Test (DBOUT).
+The web page link below includes an exercise that shows how create a Test Runner package. The web page covers all the basics of creating a Test Runner package.
+Create Test Runner Package
Database Object Tests
More interesting examples actually test database objects. Here are some examples.
@@ -61,12 +56,67 @@ Database Object Tests
- Type Test
utPLSQL 2.3 Examples
-wtPLSQL was built with the utPLSQL "ut_assert" API. These examples were created from the original utPLSQL 2.3 examples without modifying the "ut_assert" calls
+wtPLSQL was built with the utPLSQL "ut_assert" API. These examples were created from the original utPLSQL 2.3 examples without modifying the "ut_assert" calls
+Demo Installer
+To save some typing, there are scripts in the "src/demo" folder for the demonstrations and examples:
+
+- Package-Test.sql
+- Table-Test.sql
+- Trigger-Test.sql
+- Type-Test.sql
+- ut_betwnstr.sql
+- ut_calc_secs_between.sql
+- ut_truncit.sql
+- ut_str.sql
+
+Demo Un-Install
+The "uninstall.sql" script provided in the "src/demo" directory drops the demo schema from the database, with cascade.
+To un-install:
+
+- cd to "src/demo"
+- login as SYS or SYSTEM using SQL*Plus
+- Run the "uninstall.sql" script
+
+To confirm a successful un-install, review the "uninstall.LST" log file.
+
+The following applies to files and directories at this location in the documentation repository.
+
+
+
+
+
+
+| DBDocs |
+SQL Developer DBDocs Files |
+
+
+| *.md |
+Markdown files for "github.io" |
+
+
+| *.htm |
+HTML files for local documentation |
+
+
+| md-to-htm.bat |
+MS-Dos Batch File to convert MD to HTML |
+
+
+| md-to-htm.lua |
+Lua script used by Pandoc for MD to HTML |
+
+
+
+To view documentation use the URL "file://README.htm" or Double-click on the README.htm file.
+NOTE: All HTML files are sourced from Markdown files. Modify the Markdown files, then build HTML from the Markdown files using "md-to-htm.bat".
Website Home Page
diff --git a/docs/demo/README.md b/docs/demo/README.md
index 558ad0d..28da1c2 100644
--- a/docs/demo/README.md
+++ b/docs/demo/README.md
@@ -4,30 +4,25 @@
---
-Demonstrations and examples assume successful connection to an [Oracle database](http://www.oracle.com/technetwork/database/database-technologies/express-edition/overview/index.html) with wtPLSQL installed. [wtPLSQL Installation instructions](https://github.com/DDieterich/wtPLSQL/releases) are available on the [wtPLSQL Releases page](https://github.com/DDieterich/wtPLSQL/releases).
+Demonstrations and examples assume successful connection to an [Oracle database](https://www.oracle.com/database/technologies/appdev/xe.html) with wtPLSQL installed. wtPLSQL Installation instructions are available on the [wtPLSQL Releases page](https://github.com/wtPLSQL/wtPLSQL/releases).
-Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_TEXT_REPORT. This package displays test results using DBMS_OUTPUT.
+Demonstrations and examples requires the Persist add-on. Test results from assertions can be queried from a set of wtPLSQL tables. The examples here will use the default reporting package called WT_PERSIST_REPORT. This package displays test results using DBMS_OUTPUT.
-## The Basics
+## User Setup
A login, or database session, is required to interact with the Oracle database. The SQL below will create a user that can run these examples. If you already have a database login, this is not necessary.
-```
-create user wtp_demo identified by wtp_demo
- default tablespace users
- quota unlimited on users
- temporary tablespace temp;
-
-grant create session to wtp_demo;
-grant create type to wtp_demo;
-grant create sequence to wtp_demo;
-grant create table to wtp_demo;
-grant create trigger to wtp_demo;
-grant create view to wtp_demo;
-grant create procedure to wtp_demo;
-```
+To create a database login, run this installer:
+1. cd to "src/demo"
+1. login as SYS or SYSTEM using SQL*Plus
+1. Run the "install_sys.sql" script
+
+To confirm a successful install, review the "install_sys.LST" log file.
+
-The simplest check for a wtPLSQL installation is to select the "version from dual".
+## Confirm the Installation
+
+The simplest check for a wtPLSQL installation is to select the "version from dual". If wtPSQL is installed, it will show which add-ons have been installed if any.
Run this:
@@ -35,22 +30,16 @@ Run this:
select wtplsql.show_version from dual;
```
-And get this:
+If the result is something like "wtpsrc 1.003, wtpsav 1.003", wtPSQL is installed with the Persist (wtpsav) add-on. If the result is ,missing "wtpsav", the Persist add-on has not been installed. For simplicity, the adjustments required to make the demonstrations and exercises work without the Persist add-on are not included.
-```
-SHOW_VERSION
------------------------------------------------------------
-1.1.0
-```
-
-This shows the wtPLSQL version as 1.1.0.
+### Another simple test
-Another simple test is an ad-hoc assertion. This test requires DBMS_OUTPUT. The results of this test are not recorded.
+Another simple test is an ad-hoc assertion. The ad-hoc assertion requires DBMS_OUTPUT. The results of the ad-hoc assertions are not recorded by wtPLSQL.
Run this:
```
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
begin
wt_assert.eq(msg_in => 'Ad-Hoc Test'
@@ -63,20 +52,26 @@ end;
And get this:
```
-PASS Ad-Hoc Test. EQ - Expected "1" and got "1"
+Ad-Hoc Test
+ Assertion EQ PASSED.
+ Expected "1" and got "1"
```
This indicates:
- * the assertion passed
* the assertion had the message "Ad-Hoc Test"
* the assertion name is "EQ"
+ * the assertion passed
* the assertion details which may include the values tested
-Note: This ad-hoc test also demonstrates implicit data type conversion.
+Note: This ad-hoc test also demonstrates implicit data type conversion between number and varchar2.
## Create a Test Runner Package
-A test runner package is central to running tests in wtPLSQL. The [Test Runner](Test-Runner.md) page covers all the basics of creating a test runner package.
+Creating a Test Runner package is central to using the wtPLSQL server. The Test Runner package contains all the assertion API calls used for testing. The package can also update/change wtPSQL settings, like the name of the Database Object Under Test (DBOUT).
+
+The web page link below includes an exercise that shows how create a Test Runner package. The web page covers all the basics of creating a Test Runner package.
+
+[Create Test Runner Package](Test-Runner.md)
## Database Object Tests
More interesting examples actually test database objects. Here are some examples.
@@ -93,5 +88,46 @@ wtPLSQL was built with the utPLSQL "ut_assert" API. These examples were created
* [ut_truncit](ut_truncit.md) - Test a Table Modification Procedure
* [ut_str](ut_str.md) - Test a Simple Function
+## Demo Installer
+To save some typing, there are scripts in the "src/demo" folder for the demonstrations and examples:
+* Package-Test.sql
+* Table-Test.sql
+* Trigger-Test.sql
+* Type-Test.sql
+* ut_betwnstr.sql
+* ut_calc_secs_between.sql
+* ut_truncit.sql
+* ut_str.sql
+
+## Demo Un-Install
+
+The "uninstall.sql" script provided in the "src/demo" directory drops the demo schema from the database, with cascade.
+
+To un-install:
+1. cd to "src/demo"
+1. login as SYS or SYSTEM using SQL*Plus
+1. Run the "uninstall.sql" script
+
+
+To confirm a successful un-install, review the "uninstall.LST" log file.
+
+---
+
+*The following applies to files and directories at this location in the documentation repository.*
+
+File Name | Description
+--------------|------------
+DBDocs | SQL Developer DBDocs Files
+*.md | Markdown files for "github.io"
+*.htm | HTML files for local documentation
+md-to-htm.bat | MS-Dos Batch File to convert MD to HTML
+md-to-htm.lua | Lua script used by Pandoc for MD to HTML
+
+To view documentation use the URL "file://README.htm" or Double-click on the README.htm file.
+
+NOTE: All HTML files are sourced from Markdown files.
+ Modify the Markdown files, then build HTML from the
+ Markdown files using "md-to-htm.bat".
+
---
[Website Home Page](../README.md)
\ No newline at end of file
diff --git a/docs/demo/Table-Test.htm b/docs/demo/Table-Test.htm
index f3698b3..37666c2 100644
--- a/docs/demo/Table-Test.htm
+++ b/docs/demo/Table-Test.htm
@@ -1,7 +1,7 @@
Demos and Examples
Test Table Constraints
-The syntax diagram in Oracle's "Database SQL Language Reference" (11.2) gives the list of constraints this way:
+The syntax diagram in Oracle's "Database SQL Language Reference" (11.2) gives the list of constraints this way:
- Not Null
- Unique (Key)
@@ -9,7 +9,7 @@ Test Table Constraints
- References (Foreign Key)
- Check
-Typical unit testing (or white box testing) does not include the testing of constraints. In large part, these constraints are assumed to work without testing. Confirmation of continued function of these constraints is a reason to test them.
+Typical, these constraints are assumed to work without testing. Here we create a Test Runner to test the constraints on a table.
Table with Constraints
A table with constraints is needed for testing. This table has several constraints
Run this:
@@ -52,40 +52,63 @@ Test Runner
against_this_in => 'TEST1');
rollback;
end t_happy_path_1;
+ procedure t_sad_path_1
+ is
+ begin
+ wt_assert.g_testcase := 'Sad Path 1';
+ wt_assert.raises (
+ msg_in => 'Raise Error',
+ check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')',
+ against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated');
+ end t_sad_path_1;
procedure wtplsql_run is
begin
t_happy_path_1;
+ t_sad_path_1;
end wtplsql_run;
end table_test_pkg;
/
Check the results
+Run this to setup HOOKS:
+begin
+ wtp.wt_test_run.delete_hooks;
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+ update wtp.hooks
+ set run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 30); end;'
+ where hook_name = 'after_test_run'
+ and run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 10); end;';
+ wtp.hook.init;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
- wtplsql.test_run('TRIGGER_TEST_PKG');
- wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
+begin
+ wtplsql.test_run('TABLE_TEST_PKG');
end;
/
And Get This:
- wtPLSQL 1.1.0 - Run ID 70: 23-Jun-2018 07:30:47 PM
-
- Test Results for WTP_DEMO.TABLE_TEST_PKG
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 443 Error Assertions: 0
- Maximum Interval msec: 886 Test Yield: 100.00%
- Total Run Time (sec): 0.9
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 01:14:13 AM
+ Test Results for WT_DEMO.TABLE_TEST_PKG
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 2
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
- - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 70)
------------------------------------------------------------
- ---- Test Case: Happy Path 1
- PASS 886ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
- PASS 0ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
+ WT_DEMO.TABLE_TEST_PKG Test Runner Details
+ --------------------------------------------------------------
+---*** Happy Path 1 ***-------------------------------------------------------
+ PASS .755ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
+ PASS .184ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
+---*** Sad Path 1 ***---------------------------------------------------------
+ PASS 2.27ms Raise Error. RAISES/THROWS - Expected exception "%ORA-02290: check constraint (WT_DEMO.TABLE_TEST_TAB_CK1) violated%". Actual exception raised was "ORA-02290: check constraint (WT_DEMO.TABLE_TEST_TAB_CK1) violated". Exception raised by: "insert into table_test_tab (id, name) values (1, 'Test1')".
This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 2 assertions. All tests passed for a 100% yield. There is no code coverage for the constraints.
-This is not a complete test. More test cases are needed to confirm other constraints and sad path .
+This is not a complete test. More test cases are needed to confirm other constraints and sad path testing.
Demos and Examples
diff --git a/docs/demo/Table-Test.md b/docs/demo/Table-Test.md
index af861bf..8d8679a 100644
--- a/docs/demo/Table-Test.md
+++ b/docs/demo/Table-Test.md
@@ -12,7 +12,7 @@ The syntax diagram in Oracle's "Database SQL Language Reference" (11.2) gives th
* References (Foreign Key)
* Check
-Typical unit testing (or white box testing) does not include the testing of constraints. In large part, these constraints are assumed to work without testing. Confirmation of continued function of these constraints is a reason to test them.
+Typical, these constraints are assumed to work without testing. Here we create a Test Runner to test the constraints on a table.
## Table with Constraints
@@ -71,9 +71,19 @@ as
against_this_in => 'TEST1');
rollback;
end t_happy_path_1;
+ procedure t_sad_path_1
+ is
+ begin
+ wt_assert.g_testcase := 'Sad Path 1';
+ wt_assert.raises (
+ msg_in => 'Raise Error',
+ check_call_in => 'insert into table_test_tab (id, name) values (1, ''Test1'')',
+ against_exc_in => 'ORA-02290: check constraint (WTP_DEMO.TABLE_TEST_TAB_CK1) violated');
+ end t_sad_path_1;
procedure wtplsql_run is
begin
t_happy_path_1;
+ t_sad_path_1;
end wtplsql_run;
end table_test_pkg;
/
@@ -81,14 +91,27 @@ end table_test_pkg;
## Check the results
-Run this:
+Run this to setup HOOKS:
```
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.wt_test_run.delete_hooks;
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.insert_hooks;
+ update wtp.hooks
+ set run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 30); end;'
+ where hook_name = 'after_test_run'
+ and run_string = 'begin wtp.wt_core_report.dbms_out(in_detail_level => 10); end;';
+ wtp.hook.init;
+end;
+/
+```
+Run this:
+
+```
begin
- wtplsql.test_run('TRIGGER_TEST_PKG');
- wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
+ wtplsql.test_run('TABLE_TEST_PKG');
end;
/
```
@@ -96,25 +119,28 @@ end;
And Get This:
```
- wtPLSQL 1.1.0 - Run ID 70: 23-Jun-2018 07:30:47 PM
-
- Test Results for WTP_DEMO.TABLE_TEST_PKG
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 443 Error Assertions: 0
- Maximum Interval msec: 886 Test Yield: 100.00%
- Total Run Time (sec): 0.9
-
- - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 70)
------------------------------------------------------------
- ---- Test Case: Happy Path 1
- PASS 886ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
- PASS 0ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Start Date/Time: 13-Apr-2024 01:14:13 AM
+ Test Results for WT_DEMO.TABLE_TEST_PKG
+ ------------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 2
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ WT_DEMO.TABLE_TEST_PKG Test Runner Details
+ --------------------------------------------------------------
+---*** Happy Path 1 ***-------------------------------------------------------
+ PASS .755ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
+ PASS .184ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
+---*** Sad Path 1 ***---------------------------------------------------------
+ PASS 2.27ms Raise Error. RAISES/THROWS - Expected exception "%ORA-02290: check constraint (WT_DEMO.TABLE_TEST_TAB_CK1) violated%". Actual exception raised was "ORA-02290: check constraint (WT_DEMO.TABLE_TEST_TAB_CK1) violated". Exception raised by: "insert into table_test_tab (id, name) values (1, 'Test1')".
```
This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 2 assertions. All tests passed for a 100% yield. There is no code coverage for the constraints.
-This is not a complete test. More test cases are needed to confirm other constraints and sad path .
+This is not a complete test. More test cases are needed to confirm other constraints and sad path testing.
---
[Demos and Examples](README.md)
diff --git a/docs/demo/Test-Runner.htm b/docs/demo/Test-Runner.htm
index db6f3ec..2f5630e 100644
--- a/docs/demo/Test-Runner.htm
+++ b/docs/demo/Test-Runner.htm
@@ -1,7 +1,7 @@
Demos and Examples
Create a Simple Test Runner Package
-Most all wtPLSQL tests are executed by a test runner package. Test runner packages are written by the tester. Below are examples of very simple test runner packages.
+Most all wtPLSQL tests are executed by a Test Runner package. Test runner packages are written by the tester. Below are examples of very simple Test Runner packages.
Run this:
create or replace package simple_test_runner authid definer
as
@@ -20,63 +20,66 @@ Create a Simple Test Runner Package
end simple_test_runner;
/
-SIMPLE_TEST_RUNNER is a minimal test runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the Demos and Examples page.
+SIMPLE_TEST_RUNNER is a minimal Test Runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the Demos and Examples page.
+The Persist add-on should be installed.
Execute and Display
-To execute the test runner package, run this:
+Run this to setup HOOKS:
begin
- wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
end;
/
-There are no test results because the test results were not sent to DBMS_OUTPUT. The test results were saved in the wtPLSQL tables.
-To view the results, run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+To execute the Test Runner package, run this:
+begin
+ wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 12: 15-Jun-2018 01:45:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 56 Failed Assertions: 0
- Average Interval msec: 56 Error Assertions: 0
- Maximum Interval msec: 56 Test Yield: 100.00%
- Total Run Time (sec): 0.2
-
-This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The interval time shown here is the elapsed time from starting the test runner package until the first assertion was executed. The total run time is the elapsed time from start to finish for the test runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%.
-WT_TEXT_REPORT Display Levels
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 39: 13-Apr-2024 06:07:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 6 Total Assertions: 1
+ Average Elapsed msec: 6 Failed Assertions: 0
+ Maximum Elapsed msec: 6 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
+
+This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The Total Run Time is the elapsed time from start to finish for the Test Runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%.
+WT_PERSIST_REPORT Display Levels
This example shows all result details for the SIMPLE_TEST_RUNNER only.
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+begin
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 12: 15-Jun-2018 01:45:16 PM
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 39: 13-Apr-2024 06:07:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 6 Total Assertions: 1
+ Average Elapsed msec: 6 Failed Assertions: 0
+ Maximum Elapsed msec: 6 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 56 Failed Assertions: 0
- Average Interval msec: 56 Error Assertions: 0
- Maximum Interval msec: 56 Test Yield: 100.00%
- Total Run Time (sec): 0.2
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 12)
------------------------------------------------------------
- PASS 56ms Ad-Hoc Test. EQ - Expected "1" and got "1"
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 39
+ --------------------------------------------------------------
+---*** WT_DEMO.SIMPLE_TEST_RUNNER ***-----------------------------------------
+ PASS 6.17ms Ad-Hoc Test. EQ - Expected "1" and got "1"
-This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a test runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the Reference Page.
-The detailed results shown are the same as the ad-hoc result, with a "56ms" added. The 56 in the detailed results shows the elapsed time between assertions, or elapsed time from test runner package startup to the first assertion.
+This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a Test Runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the Reference Page.
Test Cases
-For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a test runner package.
+For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a Test Runner package.
Run this:
create or replace package body simple_test_runner
as
@@ -99,42 +102,45 @@ Test Cases
end simple_test_runner;
/
-Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a test runner package. The results summary will show the number of test cases. The test results details will group assertions by test case.
+Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a Test Runner package. The results summary will show the number of test cases. The test results details will group assertions by test case.
Run this:
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 43: 16-Jun-2018 07:43:50 AM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 2 Total Assertions: 4
- Minimum Interval msec: 0 Failed Assertions: 1
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 1 Test Yield: 75.00%
- Total Run Time (sec): 0.0
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 40: 13-Apr-2024 06:13:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 4
+ Average Elapsed msec: 0 Failed Assertions: 1
+ Maximum Elapsed msec: 0 Total Testcases: 2
+ Total Run Time (sec): 0.0 Failed Testcases: 1
+ Testcase Yield: 50%
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 43)
------------------------------------------------------------
- ---- Test Case: My Test Case A
- PASS 1ms Ad-Hoc Test1. EQ - Expected "1" and got "1"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "2" and got "2"
- ---- Test Case: My Test Case B
-#FAIL# 0ms Ad-Hoc Test1. EQ - Expected " 4" and got "4"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "5" and got "5"
-
-The Test Results summary shows 2 test cases were found. The Test Results Details show the assertion results grouped by test case. The details also show a failed assertion. It also shows "Ad-Hoc Test2" in "My Test Case B" passed because the TO_NUMBER was used to remove the space character from " 5".
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 40
+ --------------------------------------------------------------
+---*** My Test Case A ***-----------------------------------------------------
+ PASS .38ms Ad-Hoc Test1. EQ - Expected "1" and got "1"
+ PASS .116ms Ad-Hoc Test2. EQ - Expected "2" and got "2"
+---*** My Test Case B ***-----------------------------------------------------
+#FAIL#.048ms Ad-Hoc Test1. EQ - Expected " 4" and got "4"
+ PASS .043ms Ad-Hoc Test2. EQ - Expected "5" and got "5"
+
+The Test Results summary shows 2 test cases were found. The Test Results Details show the assertion results grouped by test case. The details also show a failed assertion. It also shows "Ad-Hoc Test2" in "My Test Case B" passed because the TO_NUMBER was used to remove the space character from " 5".
DBOUT Annotation
The Database Object Under Test (DBOUT) annotation is used to determine which database object to profile. If this annotation identifies accessible source code for a DBOUT, the DBMS_PROFILER package is activated to check code coverage.
Run this:
create or replace package body simple_test_runner
as
- --% WTPLSQL SET DBOUT "SIMPLE_TEST_RUNNER:PACKAGE BODY" %--
procedure wtplsql_run is begin
+ wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
wt_assert.eq(msg_in => 'Ad-Hoc Test'
,check_this_in => 1
,against_this_in => '1');
@@ -142,36 +148,39 @@ DBOUT Annotation
end simple_test_runner;
/
-With the addition of the DBOUT annotation, the profiling information is available for the SIMPLE_TEST_RUNNER package. The DBOUT takes the form of "owner.object_name:object_type". "owner" will default to "USER". "object_name" is required. "object_type" is required if more than one object has that name. Package bodies will always require the ":PACKAGE BODY" because the package specification is always another database object with the same name.
+With the addition of the DBOUT annotation, the profiling information is available for the SIMPLE_TEST_RUNNER package. The DBOUT takes the form of "owner.object_name:object_type". "owner" will default to "USER". "object_name" is required. "object_type" is required if more than one object has that name. Package bodies will always require the ":PACKAGE BODY" because the package specification is always another database object with the same name.
Run this:
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 38: 15-Jun-2018 11:03:52 PM
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 42: 13-Apr-2024 06:19:53 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 186 Failed Assertions: 0
- Average Interval msec: 186 Error Assertions: 0
- Maximum Interval msec: 186 Test Yield: 100.00%
- Total Run Time (sec): 0.2
-
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
+ Code Coverage for PACKAGE BODY WT_DEMO.SIMPLE_TEST_RUNNER
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 4
Excluded Lines: 0 Total Executed Lines: 3
Minimum LineExec usec: 1 Not Executed Lines: 0
- Average LineExec usec: 7 Unknown Lines: 1
- Maximum LineExec usec: 25 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Average LineExec usec: 3 Unknown Lines: 1
+ Maximum LineExec usec: 7 Code Coverage: 100.0%
+ Trigger Source Offset: 0
-This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER test runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed.
+This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER Test Runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed.
Ignore Annotation
-In the previous example, the SIMPLE_TEST_RUNNER package is both the test runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines.
-The function "add2" represents some code that needs to be tested. It is also a private function. Self testing packages can test the private functions in the package.
+In the previous example, the SIMPLE_TEST_RUNNER package is both the Test Runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines.
+The function "add2" represents some code that needs to be tested. It is also a private function. Self testing packages can test the private functions in the package.
Run this:
create or replace package body simple_test_runner
as
@@ -192,57 +201,65 @@ Ignore Annotation
/
The DBOUT annotation has been moved for convenience. It can be placed anywhere in the source.
-The "begin_ignore" and "end_ignore" annotations have been added to the SIMPLE_TEST_RUNNER package. The intent of these annotations is to ignore the source lines for the WTPLSQL_RUN procedure for code coverage calculations.
+The "begin_ignore" and "end_ignore" annotations have been added to the SIMPLE_TEST_RUNNER package. The intent of these annotations is to ignore the source lines for the WTPLSQL_RUN procedure for code coverage calculations.
Run this:
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
And get this:
- wtPLSQL 1.1.0 - Run ID 40: 16-Jun-2018 12:38:49 AM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 1 Total Assertions: 1
- Minimum Interval msec: 111 Failed Assertions: 0
- Average Interval msec: 111 Error Assertions: 0
- Maximum Interval msec: 111 Test Yield: 100.00%
- Total Run Time (sec): 0.1
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 43: 13-Apr-2024 06:21:38 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
- Ignored Lines: 4 Total Profiled Lines: 8
- Excluded Lines: 1 Total Executed Lines: 3
+ Code Coverage for PACKAGE BODY WT_DEMO.SIMPLE_TEST_RUNNER
+ ----------------------------------------------------------------
+ Ignored Lines: 5 Total Profiled Lines: 9
+ Excluded Lines: 0 Total Executed Lines: 3
Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 1 Unknown Lines: 0
- Maximum LineExec usec: 2 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Average LineExec usec: 1 Unknown Lines: 1
+ Maximum LineExec usec: 1 Code Coverage: 100.0%
+ Trigger Source Offset: 0
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 40)
------------------------------------------------------------
- ---- Test Case: My Test Case
- PASS 111ms Ad-Hoc Test. EQ - Expected "5" and got "5"
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 43
+ --------------------------------------------------------------
+---*** My Test Case ***-------------------------------------------------------
+ PASS .436ms Ad-Hoc Test. EQ - Expected "5" and got "5"
- - WTP_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details (Test Run ID 40)
+ WT_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details
+ Test Run ID: 43
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 4 EXCL 0 0 0 0 function add2 (in_val1 number, in_val2 number) return number is
- 7 EXEC 1 2 2 2 l_result := in_val1 + in_val2;
- 8 EXEC 1 0 0 0 return l_result;
- 9 EXEC 1 1 1 1 end add2;
- 10 IGNR 0 2 2 2 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
- 11 IGNR 2 30 1 29 wt_assert.g_testcase := 'My Test Case';
- 12 IGNR 1 11 11 11 wt_assert.eq(msg_in => 'Ad-Hoc Test'
- 15 IGNR 1 0 0 0 end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
-
-This is a very large report from the WT_TEXT_REPORT package. The detail level of 30 displays the full detail of the test runner execution with code coverage.
-Close to the middle of the output, is the "Code Coverage Details" title for the final section. This section contains results from DBMS_PROFILER. Each line of source code is matched with that output. Some interesting points.
+ 3 UNKN 0 1 1 1 function add2 (in_val1 number, in_val2 number) return number is
+ 6 EXEC 1 1 1 1 l_result := in_val1 + in_val2;
+ 7 EXEC 1 0 0 0 return l_result;
+ 8 EXEC 1 1 1 1 end add2;
+ 9 IGNR 0 1 1 1 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
+ 10 IGNR 2 27 0 26 wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
+ 11 IGNR 2 15 0 14 wt_assert.g_testcase := 'My Test Case';
+ 12 IGNR 1 8 0 8 wt_assert.eq(msg_in => 'Ad-Hoc Test'
+ 15 IGNR 1 1 1 1 end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
+
+This is a very large report from the WT_PERSIST_REPORT package. The detail level of 30 displays the full detail of the Test Runner execution with code coverage.
+Close to the middle of the output, is the "Code Coverage Details" title for the final section. This section contains results from DBMS_PROFILER. Each line of source code is matched with that output. Some interesting points.
-- Line 4, is excluded by wtPLSQL because it is not executable
-- Lines 7, 8, and 9 were executed, according to DBMS_OUTPUT.
-- Lines 10, 11, 12, and 15 were ignored as per the annotation.
-- Several other lines are not included because DBMS_OUPUT did not collect any data on them.
+- Line 3, is excluded by wtPLSQL because it is not executable (Unknown)
+- Lines 6, 7, and 8 were executed, according to DBMS_PROFILER.
+- Lines 9, 10, 11, 12, and 15 were ignored as per the annotation.
+- Several other lines are not included because DBMS_PROFILER did not collect any data on them.
Demos and Examples
diff --git a/docs/demo/Test-Runner.md b/docs/demo/Test-Runner.md
index a3b1b28..f181eeb 100644
--- a/docs/demo/Test-Runner.md
+++ b/docs/demo/Test-Runner.md
@@ -3,7 +3,7 @@
# Create a Simple Test Runner Package
---
-Most all wtPLSQL tests are executed by a test runner package. Test runner packages are written by the tester. Below are examples of very simple test runner packages.
+Most all wtPLSQL tests are executed by a Test Runner package. Test runner packages are written by the tester. Below are examples of very simple Test Runner packages.
Run this:
@@ -29,28 +29,29 @@ end simple_test_runner;
/
```
-SIMPLE_TEST_RUNNER is a minimal test runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the [Demos and Examples](README.md) page.
+SIMPLE_TEST_RUNNER is a minimal Test Runner. It is a package that contains the (public) WTPLSQL_RUN procedure and 1 assertion. It does the same assertion as the ad-hoc assertion in the [Demos and Examples](README.md) page.
+
+The Persist add-on should be installed.
## Execute and Display
-To execute the test runner package, run this:
+Run this to setup HOOKS:
```
begin
- wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
end;
/
```
-There are no test results because the test results were not sent to DBMS_OUTPUT. The test results were saved in the wtPLSQL tables.
-
-To view the results, run this:
+To execute the Test Runner package, run this:
```
-set serveroutput on size unlimited format word_wrapped
-
begin
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+ wtplsql.test_run('SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
```
@@ -58,30 +59,30 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 12: 15-Jun-2018 01:45:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 56 Failed Assertions: 0
- Average Interval msec: 56 Error Assertions: 0
- Maximum Interval msec: 56 Test Yield: 100.00%
- Total Run Time (sec): 0.2
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 39: 13-Apr-2024 06:07:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 6 Total Assertions: 1
+ Average Elapsed msec: 6 Failed Assertions: 0
+ Maximum Elapsed msec: 6 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
```
-This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The interval time shown here is the elapsed time from starting the test runner package until the first assertion was executed. The total run time is the elapsed time from start to finish for the test runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%.
+This is the test result summary from the last execution of the SIMPLE_TEST_RUNNER package. The Total Run Time is the elapsed time from start to finish for the Test Runner package. The report confirms that one assertion was executed for SIMPLE_TEST_RUNNER and it passed. All tests passed, so the test yield is 100%.
-## WT_TEXT_REPORT Display Levels
+## WT_PERSIST_REPORT Display Levels
This example shows all result details for the SIMPLE_TEST_RUNNER only.
Run this:
```
-set serveroutput on size unlimited format word_wrapped
-
begin
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
```
@@ -89,27 +90,28 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 12: 15-Jun-2018 01:45:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 56 Failed Assertions: 0
- Average Interval msec: 56 Error Assertions: 0
- Maximum Interval msec: 56 Test Yield: 100.00%
- Total Run Time (sec): 0.2
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 39: 13-Apr-2024 06:07:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 6 Total Assertions: 1
+ Average Elapsed msec: 6 Failed Assertions: 0
+ Maximum Elapsed msec: 6 Total Testcases: 1
+ Total Run Time (sec): 0.0 Failed Testcases: 0
+ Testcase Yield: 100%
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 12)
------------------------------------------------------------
- PASS 56ms Ad-Hoc Test. EQ - Expected "1" and got "1"
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 39
+ --------------------------------------------------------------
+---*** WT_DEMO.SIMPLE_TEST_RUNNER ***-----------------------------------------
+ PASS 6.17ms Ad-Hoc Test. EQ - Expected "1" and got "1"
```
-This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a test runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the [Reference Page](../Reference.md#wt_text_report-detail-levels).
-
-The detailed results shown are the same as the ad-hoc result, with a "56ms" added. The 56 in the detailed results shows the elapsed time between assertions, or elapsed time from test runner package startup to the first assertion.
+This shows the latest test result summary with test results details. A detail level of 30 shows summary and detailed test results for a Test Runner package. In this case, the summary and the detailed results of the EQ assertion are shown. These detail levels are explained in the [Reference Page](../Reference.md#wt_persist_report-detail-levels).
## Test Cases
-For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a test runner package.
+For wtPLSQL, a test case is a collection of assertions. Assertion results can be grouped by test case. There can be zero or more test cases in a Test Runner package.
Run this:
@@ -136,15 +138,16 @@ end simple_test_runner;
/
```
-Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a test runner package. The results summary will show the number of test cases. The test results details will group assertions by test case.
+Setting a value for WT_ASSERT.G_TESTCASE in the SIMPLE_TEST_RUNNER package sets a test case for all following assertions. This value can be set multiple times within a Test Runner package. The results summary will show the number of test cases. The test results details will group assertions by test case.
Run this:
```
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(in_runner_name => 'SIMPLE_TEST_RUNNER'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
```
@@ -152,23 +155,25 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 43: 16-Jun-2018 07:43:50 AM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 2 Total Assertions: 4
- Minimum Interval msec: 0 Failed Assertions: 1
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 1 Test Yield: 75.00%
- Total Run Time (sec): 0.0
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 40: 13-Apr-2024 06:13:21 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 4
+ Average Elapsed msec: 0 Failed Assertions: 1
+ Maximum Elapsed msec: 0 Total Testcases: 2
+ Total Run Time (sec): 0.0 Failed Testcases: 1
+ Testcase Yield: 50%
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 43)
------------------------------------------------------------
- ---- Test Case: My Test Case A
- PASS 1ms Ad-Hoc Test1. EQ - Expected "1" and got "1"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "2" and got "2"
- ---- Test Case: My Test Case B
-#FAIL# 0ms Ad-Hoc Test1. EQ - Expected " 4" and got "4"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "5" and got "5"
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 40
+ --------------------------------------------------------------
+---*** My Test Case A ***-----------------------------------------------------
+ PASS .38ms Ad-Hoc Test1. EQ - Expected "1" and got "1"
+ PASS .116ms Ad-Hoc Test2. EQ - Expected "2" and got "2"
+---*** My Test Case B ***-----------------------------------------------------
+#FAIL#.048ms Ad-Hoc Test1. EQ - Expected " 4" and got "4"
+ PASS .043ms Ad-Hoc Test2. EQ - Expected "5" and got "5"
```
The Test Results summary shows 2 test cases were found. The Test Results Details show the assertion results grouped by test case. The details also show a failed assertion. It also shows "Ad-Hoc Test2" in "My Test Case B" passed because the TO_NUMBER was used to remove the space character from " 5".
@@ -182,8 +187,8 @@ Run this:
```
create or replace package body simple_test_runner
as
- --% WTPLSQL SET DBOUT "SIMPLE_TEST_RUNNER:PACKAGE BODY" %--
procedure wtplsql_run is begin
+ wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
wt_assert.eq(msg_in => 'Ad-Hoc Test'
,check_this_in => 1
,against_this_in => '1');
@@ -199,7 +204,8 @@ Run this:
```
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER');
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER');
end;
/
```
@@ -207,29 +213,31 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 38: 15-Jun-2018 11:03:52 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 186 Failed Assertions: 0
- Average Interval msec: 186 Error Assertions: 0
- Maximum Interval msec: 186 Test Yield: 100.00%
- Total Run Time (sec): 0.2
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 42: 13-Apr-2024 06:19:53 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
+ Code Coverage for PACKAGE BODY WT_DEMO.SIMPLE_TEST_RUNNER
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 4
Excluded Lines: 0 Total Executed Lines: 3
Minimum LineExec usec: 1 Not Executed Lines: 0
- Average LineExec usec: 7 Unknown Lines: 1
- Maximum LineExec usec: 25 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Average LineExec usec: 3 Unknown Lines: 1
+ Maximum LineExec usec: 7 Code Coverage: 100.0%
+ Trigger Source Offset: 0
```
-This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER test runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed.
+This shows the latest test result summary and code coverage summary for the SIMPLE_TEST_RUNNER Test Runner. DBMS_PROFILER found 4 lines of significance in the source code. 3 of those lines were executed. 1 line is unknown or undefined by DBMS_PROFILER. Unknown lines consume execution time, but were not executed.
## Ignore Annotation
-In the previous example, the SIMPLE_TEST_RUNNER package is both the test runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines.
+In the previous example, the SIMPLE_TEST_RUNNER package is both the Test Runner and the Database Object Under Test (DBOUT). In practice, this is a self testing package. Because DBMS_OUTPUT includes all the source lines, there is a need to segregate "testing" source lines from "tested" source lines. The ignore annotation is used to segregate these lines.
The function "add2" represents some code that needs to be tested. It is also a private function. Self testing packages can test the private functions in the package.
@@ -264,7 +272,9 @@ Run this:
```
begin
wtplsql.test_run('SIMPLE_TEST_RUNNER');
- wt_text_report.dbms_out(USER,'SIMPLE_TEST_RUNNER',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'SIMPLE_TEST_RUNNER'
+ ,in_detail_level => 30);
end;
/
```
@@ -272,50 +282,56 @@ end;
And get this:
```
- wtPLSQL 1.1.0 - Run ID 40: 16-Jun-2018 12:38:49 AM
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.SIMPLE_TEST_RUNNER
+ Run ID 43: 13-Apr-2024 06:21:38 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 1
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 1 Total Assertions: 1
- Minimum Interval msec: 111 Failed Assertions: 0
- Average Interval msec: 111 Error Assertions: 0
- Maximum Interval msec: 111 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
- Ignored Lines: 4 Total Profiled Lines: 8
- Excluded Lines: 1 Total Executed Lines: 3
+ Code Coverage for PACKAGE BODY WT_DEMO.SIMPLE_TEST_RUNNER
+ ----------------------------------------------------------------
+ Ignored Lines: 5 Total Profiled Lines: 9
+ Excluded Lines: 0 Total Executed Lines: 3
Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 1 Unknown Lines: 0
- Maximum LineExec usec: 2 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 40)
------------------------------------------------------------
- ---- Test Case: My Test Case
- PASS 111ms Ad-Hoc Test. EQ - Expected "5" and got "5"
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details (Test Run ID 40)
+ Average LineExec usec: 1 Unknown Lines: 1
+ Maximum LineExec usec: 1 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.SIMPLE_TEST_RUNNER Test Result Details
+ Test Run ID: 43
+ --------------------------------------------------------------
+---*** My Test Case ***-------------------------------------------------------
+ PASS .436ms Ad-Hoc Test. EQ - Expected "5" and got "5"
+
+ WT_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details
+ Test Run ID: 43
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 4 EXCL 0 0 0 0 function add2 (in_val1 number, in_val2 number) return number is
- 7 EXEC 1 2 2 2 l_result := in_val1 + in_val2;
- 8 EXEC 1 0 0 0 return l_result;
- 9 EXEC 1 1 1 1 end add2;
- 10 IGNR 0 2 2 2 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
- 11 IGNR 2 30 1 29 wt_assert.g_testcase := 'My Test Case';
- 12 IGNR 1 11 11 11 wt_assert.eq(msg_in => 'Ad-Hoc Test'
- 15 IGNR 1 0 0 0 end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
+ 3 UNKN 0 1 1 1 function add2 (in_val1 number, in_val2 number) return number is
+ 6 EXEC 1 1 1 1 l_result := in_val1 + in_val2;
+ 7 EXEC 1 0 0 0 return l_result;
+ 8 EXEC 1 1 1 1 end add2;
+ 9 IGNR 0 1 1 1 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
+ 10 IGNR 2 27 0 26 wtplsql.g_DBOUT := 'SIMPLE_TEST_RUNNER:PACKAGE BODY';
+ 11 IGNR 2 15 0 14 wt_assert.g_testcase := 'My Test Case';
+ 12 IGNR 1 8 0 8 wt_assert.eq(msg_in => 'Ad-Hoc Test'
+ 15 IGNR 1 1 1 1 end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
```
-This is a very large report from the WT_TEXT_REPORT package. The detail level of 30 displays the full detail of the test runner execution with code coverage.
+This is a very large report from the WT_PERSIST_REPORT package. The detail level of 30 displays the full detail of the Test Runner execution with code coverage.
Close to the middle of the output, is the "Code Coverage Details" title for the final section. This section contains results from DBMS_PROFILER. Each line of source code is matched with that output. Some interesting points.
-* Line 4, is excluded by wtPLSQL because it is not executable
-* Lines 7, 8, and 9 were executed, according to DBMS_OUTPUT.
-* Lines 10, 11, 12, and 15 were ignored as per the annotation.
-* Several other lines are not included because DBMS_OUPUT did not collect any data on them.
+* Line 3, is excluded by wtPLSQL because it is not executable (Unknown)
+* Lines 6, 7, and 8 were executed, according to DBMS_PROFILER.
+* Lines 9, 10, 11, 12, and 15 were ignored as per the annotation.
+* Several other lines are not included because DBMS_PROFILER did not collect any data on them.
---
[Demos and Examples](README.md)
diff --git a/docs/demo/Trigger-Test.htm b/docs/demo/Trigger-Test.htm
index f2d77a6..a36c882 100644
--- a/docs/demo/Trigger-Test.htm
+++ b/docs/demo/Trigger-Test.htm
@@ -3,7 +3,7 @@ Test a Trigger
Triggers
There are many kinds of triggers. All of them use PL/SQL to define actions taken when the trigger is activated.
-The "Database PL/SQL Language Reference" (11.2) groups triggers this way:
+The "Database PL/SQL Language Reference" (11.2) groups triggers this way:
- Simple DML Trigger
- Compound DML Trigger
@@ -196,7 +196,7 @@ Triggers
|
-For brevity, an example is provided for only one of these triggers. Db Role Change
+For brevity, an example is provided for only one of these triggers. DB Role Change
Table with Insert Trigger
Before a trigger an be created, a table must be created. The table will have a surrogate key, a natural key, and audit data.
Run this:
@@ -229,7 +229,7 @@ Table with Insert Trigger
/
Create a Simple Test Runner
-All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
+All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
Run this:
create or replace package trigger_test_pkg authid definer
as
@@ -273,51 +273,67 @@ Create a Simple Test Runner
/
Check the results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
begin
wtplsql.test_run('TRIGGER_TEST_PKG');
- wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => 'WT_DEMO'
+ ,in_runner_name => 'TRIGGER_TEST_PKG'
+ ,in_detail_level => 30);
end;
/
And Get This:
- wtPLSQL 1.1.0 - Run ID 58: 23-Jun-2018 12:04:20 PM
-
- Test Results for WTP_DEMO.TRIGGER_TEST_PKG
- Total Test Cases: 1 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 76 Error Assertions: 0
- Maximum Interval msec: 228 Test Yield: 100.00%
- Total Run Time (sec): 0.2
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.TRIGGER_TEST_PKG
+ Run ID 20: 13-Apr-2024 04:35:58 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 1
+ Total Run Time (sec): 0.3 Failed Testcases: 0
+ Testcase Yield: 100%
- Code Coverage for TRIGGER WTP_DEMO.TRIGGER_TEST_BIR
+ Code Coverage for TRIGGER WT_DEMO.TRIGGER_TEST_BIR
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 5
Excluded Lines: 0 Total Executed Lines: 4
Minimum LineExec usec: 1 Not Executed Lines: 0
- Average LineExec usec: 137 Unknown Lines: 1
- Maximum LineExec usec: 326 Code Coverage: 100.00%
- Trigger Source Offset: 3
+ Average LineExec usec: 52 Unknown Lines: 1
+ Maximum LineExec usec: 197 Code Coverage: 100.0%
+ Trigger Source Offset: 3
- - WTP_DEMO.TRIGGER_TEST_PKG Test Result Details (Test Run ID 58)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 228ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "15"
- PASS 0ms l_rec.name. EQ - Expected "Test1" and got "Test1"
- PASS 0ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "23-JUN-2018 12:04:20"
+ WT_DEMO.TRIGGER_TEST_PKG Test Result Details
+ Test Run ID: 20
+ --------------------------------------------------------------
+---*** Constructor Happy Path 1 ***-------------------------------------------
+ PASS 2.20ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "14"
+ PASS .318ms l_rec.name. EQ - Expected "Test1" and got "Test1"
+ PASS .083ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "13-APR-2024 21:35:58"
- - WTP_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details (Test Run ID 58)
+ WT_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details
+ Test Run ID: 20
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 4 UNKN 0 11 11 11 begin
- 5 EXEC 1 216 216 216 if :new.id is null
- 7 EXEC 1 326 326 326 :new.id := trigger_test_seq.nextval;
+ 4 UNKN 0 1 1 1 begin
+ 5 EXEC 1 3 3 3 if :new.id is null
+ 7 EXEC 1 197 197 197 :new.id := trigger_test_seq.nextval;
9 EXEC 1 4 1 3 :new.created_dtm := sysdate;
10 EXEC 1 2 2 2 end;
-This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines.
+This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines.
This is not a complete test. More test cases are needed to confirm various values are handled correctly when inserted.
Demos and Examples
diff --git a/docs/demo/Trigger-Test.md b/docs/demo/Trigger-Test.md
index bd482fe..e34b770 100644
--- a/docs/demo/Trigger-Test.md
+++ b/docs/demo/Trigger-Test.md
@@ -64,7 +64,7 @@ The "Database PL/SQL Language Reference" (11.2) [groups triggers](https://docs.o
. | . | DB Role Change
For brevity, an example is provided for only one of these triggers.
-Db Role Change
+DB Role Change
## Table with Insert Trigger
Before a trigger an be created, a table must be created. The table will have a surrogate key, a natural key, and audit data.
@@ -105,7 +105,7 @@ end;
## Create a Simple Test Runner
-All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
+All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
Run this:
@@ -159,14 +159,29 @@ end trigger_test_pkg;
## Check the results
+The Persist add-on must be installed.
+
+Run this to setup HOOKS:
+
+```
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+```
+
Run this:
```
-set serveroutput on size unlimited format word_wrapped
+set serveroutput on size unlimited format truncated
begin
wtplsql.test_run('TRIGGER_TEST_PKG');
- wt_text_report.dbms_out(USER,'TRIGGER_TEST_PKG',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => 'WT_DEMO'
+ ,in_runner_name => 'TRIGGER_TEST_PKG'
+ ,in_detail_level => 30);
end;
/
```
@@ -174,42 +189,47 @@ end;
And Get This:
```
- wtPLSQL 1.1.0 - Run ID 58: 23-Jun-2018 12:04:20 PM
-
- Test Results for WTP_DEMO.TRIGGER_TEST_PKG
- Total Test Cases: 1 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 76 Error Assertions: 0
- Maximum Interval msec: 228 Test Yield: 100.00%
- Total Run Time (sec): 0.2
-
- Code Coverage for TRIGGER WTP_DEMO.TRIGGER_TEST_BIR
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.TRIGGER_TEST_PKG
+ Run ID 20: 13-Apr-2024 04:35:58 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 1
+ Total Run Time (sec): 0.3 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for TRIGGER WT_DEMO.TRIGGER_TEST_BIR
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 5
Excluded Lines: 0 Total Executed Lines: 4
Minimum LineExec usec: 1 Not Executed Lines: 0
- Average LineExec usec: 137 Unknown Lines: 1
- Maximum LineExec usec: 326 Code Coverage: 100.00%
- Trigger Source Offset: 3
-
- - WTP_DEMO.TRIGGER_TEST_PKG Test Result Details (Test Run ID 58)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 228ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "15"
- PASS 0ms l_rec.name. EQ - Expected "Test1" and got "Test1"
- PASS 0ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "23-JUN-2018 12:04:20"
-
- - WTP_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details (Test Run ID 58)
+ Average LineExec usec: 52 Unknown Lines: 1
+ Maximum LineExec usec: 197 Code Coverage: 100.0%
+ Trigger Source Offset: 3
+
+ WT_DEMO.TRIGGER_TEST_PKG Test Result Details
+ Test Run ID: 20
+ --------------------------------------------------------------
+---*** Constructor Happy Path 1 ***-------------------------------------------
+ PASS 2.20ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "14"
+ PASS .318ms l_rec.name. EQ - Expected "Test1" and got "Test1"
+ PASS .083ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "13-APR-2024 21:35:58"
+
+ WT_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details
+ Test Run ID: 20
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 4 UNKN 0 11 11 11 begin
- 5 EXEC 1 216 216 216 if :new.id is null
- 7 EXEC 1 326 326 326 :new.id := trigger_test_seq.nextval;
+ 4 UNKN 0 1 1 1 begin
+ 5 EXEC 1 3 3 3 if :new.id is null
+ 7 EXEC 1 197 197 197 :new.id := trigger_test_seq.nextval;
9 EXEC 1 4 1 3 :new.created_dtm := sysdate;
10 EXEC 1 2 2 2 end;
```
-This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines.
+This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case and 3 assertions. All tests passed for a 100% yield. The code coverage for the trigger shows 5 profiles, 4 executed, and a code coverage of 100%. Notice the trigger offset of 3 which aligns the source code with the profiled lines.
This is not a complete test. More test cases are needed to confirm various values are handled correctly when inserted.
diff --git a/docs/demo/Type-Test.htm b/docs/demo/Type-Test.htm
index 8f19f25..c5eb6c2 100644
--- a/docs/demo/Type-Test.htm
+++ b/docs/demo/Type-Test.htm
@@ -56,7 +56,7 @@ Test a PL/SQL Object Type
/
Create a Simple Test Runner
-All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
+All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
Run this:
create or replace package test_simple_object authid definer
as
@@ -94,44 +94,58 @@ Create a Simple Test Runner
/
Check the Results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
+begin
wtplsql.test_run('TEST_SIMPLE_OBJECT');
- wt_text_report.dbms_out(USER,'TEST_SIMPLE_OBJECT',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'TEST_SIMPLE_OBJECT'
+ ,in_detail_level => 30);
end;
/
And Get This:
- wtPLSQL 1.1.0 - Run ID 56: 18-Jun-2018 10:04:32 PM
-
- Test Results for WTP.TEST_SIMPLE_OBJECT
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 8 Failed Assertions: 0
- Average Interval msec: 74 Error Assertions: 0
- Maximum Interval msec: 139 Test Yield: 100.00%
- Total Run Time (sec): 0.1
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.TEST_SIMPLE_OBJECT
+ Run ID 22: 13-Apr-2024 04:50:11 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 2
+ Average Elapsed msec: 2 Failed Assertions: 0
+ Maximum Elapsed msec: 3 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
- Code Coverage for TYPE BODY WTP.SIMPLE_TEST_OBJ_TYPE
+ Code Coverage for TYPE BODY WT_DEMO.SIMPLE_TEST_OBJ_TYPE
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 10
Excluded Lines: 1 Total Executed Lines: 4
Minimum LineExec usec: 0 Not Executed Lines: 4
Average LineExec usec: 1 Unknown Lines: 1
- Maximum LineExec usec: 2 Code Coverage: 50.00%
- Trigger Source Offset: 0
+ Maximum LineExec usec: 2 Code Coverage: 50.0%
+ Trigger Source Offset: 0
- - WTP.TEST_SIMPLE_OBJECT Test Result Details (Test Run ID 56)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 139ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got ""
- PASS 8ms Object OBSERVATIONS. EQ - Expected "0" and got "0"
+ WT_DEMO.TEST_SIMPLE_OBJECT Test Result Details
+ Test Run ID: 22
+ --------------------------------------------------------------
+---*** Constructor Happy Path 1 ***-------------------------------------------
+ PASS 2.83ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got ""
+ PASS .118ms Object OBSERVATIONS. EQ - Expected "0" and got "0"
- - WTP.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details (Test Run ID 56)
+ WT_DEMO.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details
+ Test Run ID: 22
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 2 UNKN 0 2 2 2 CONSTRUCTOR FUNCTION simple_test_obj_type
+ 2 UNKN 0 1 1 1 CONSTRUCTOR FUNCTION simple_test_obj_type
7 EXEC 1 1 1 1 minimum_value := null;
8 EXEC 1 0 0 0 observations := 0;
9 EXEC 1 2 2 2 return;
@@ -142,7 +156,7 @@ Check the Results
19#NOTX# 0 0 0 0 observations := observations + 1;
20 EXCL 0 0 0 0 end add_observation;
-This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included.
+This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included.
Testing Private Object Methods and Self-Testing
An Oracle object type can have private methods. These methods are not available outside the object. They are inherited from a super-type.
Private Object Methods on StackOverFlow
diff --git a/docs/demo/Type-Test.md b/docs/demo/Type-Test.md
index 610d934..b411460 100644
--- a/docs/demo/Type-Test.md
+++ b/docs/demo/Type-Test.md
@@ -67,7 +67,7 @@ end;
## Create a Simple Test Runner
-All test runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
+All Test Runners are written as a PL/SQL package. A simple package is created first. A DBOUT is also identified.
Run this:
@@ -112,14 +112,27 @@ end test_simple_object;
## Check the Results
-Run this:
+The Persist add-on must be installed.
+
+Run this to setup HOOKS:
```
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+```
+Run this:
+
+```
begin
wtplsql.test_run('TEST_SIMPLE_OBJECT');
- wt_text_report.dbms_out(USER,'TEST_SIMPLE_OBJECT',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'TEST_SIMPLE_OBJECT'
+ ,in_detail_level => 30);
end;
/
```
@@ -127,34 +140,39 @@ end;
And Get This:
```
- wtPLSQL 1.1.0 - Run ID 56: 18-Jun-2018 10:04:32 PM
-
- Test Results for WTP.TEST_SIMPLE_OBJECT
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 8 Failed Assertions: 0
- Average Interval msec: 74 Error Assertions: 0
- Maximum Interval msec: 139 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for TYPE BODY WTP.SIMPLE_TEST_OBJ_TYPE
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.TEST_SIMPLE_OBJECT
+ Run ID 22: 13-Apr-2024 04:50:11 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 2
+ Average Elapsed msec: 2 Failed Assertions: 0
+ Maximum Elapsed msec: 3 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for TYPE BODY WT_DEMO.SIMPLE_TEST_OBJ_TYPE
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 10
Excluded Lines: 1 Total Executed Lines: 4
Minimum LineExec usec: 0 Not Executed Lines: 4
Average LineExec usec: 1 Unknown Lines: 1
- Maximum LineExec usec: 2 Code Coverage: 50.00%
- Trigger Source Offset: 0
-
- - WTP.TEST_SIMPLE_OBJECT Test Result Details (Test Run ID 56)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 139ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got ""
- PASS 8ms Object OBSERVATIONS. EQ - Expected "0" and got "0"
-
- - WTP.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details (Test Run ID 56)
+ Maximum LineExec usec: 2 Code Coverage: 50.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.TEST_SIMPLE_OBJECT Test Result Details
+ Test Run ID: 22
+ --------------------------------------------------------------
+---*** Constructor Happy Path 1 ***-------------------------------------------
+ PASS 2.83ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got ""
+ PASS .118ms Object OBSERVATIONS. EQ - Expected "0" and got "0"
+
+ WT_DEMO.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details
+ Test Run ID: 22
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 2 UNKN 0 2 2 2 CONSTRUCTOR FUNCTION simple_test_obj_type
+ 2 UNKN 0 1 1 1 CONSTRUCTOR FUNCTION simple_test_obj_type
7 EXEC 1 1 1 1 minimum_value := null;
8 EXEC 1 0 0 0 observations := 0;
9 EXEC 1 2 2 2 return;
@@ -166,7 +184,7 @@ Source TotTime MinTime MaxTime
20 EXCL 0 0 0 0 end add_observation;
```
-This is report level 30, the most detailed level of reporting. Starting from the top, we find the test runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included.
+This is report level 30, the most detailed level of reporting. Starting from the top, we find the Test Runner executed 1 test case, 2 assertions, and no failed assertions, which resulted in 100% yield (all tests passed). The next section shows the type body tested had 10 lines profiled, 4 were executed, and 4 were not executed, which resulted in a code coverage of 50%. Additional testing is required to achieve 100% code coverage. For brevity, this additional testing will not be included.
## Testing Private Object Methods and Self-Testing
diff --git a/docs/demo/md-to-htm.lua b/docs/demo/md-to-htm.lua
index dbaa04e..cf11419 100644
--- a/docs/demo/md-to-htm.lua
+++ b/docs/demo/md-to-htm.lua
@@ -1,4 +1,4 @@
-# md-to-htm.lua
+-- md-to-htm.lua
-- Adapted from answer by JW https://stackoverflow.com/users/4321/jw
-- at https://stackoverflow.com/questions/40993488
function Link(el)
diff --git a/docs/demo/md-to-htm.sh b/docs/demo/md-to-htm.sh
new file mode 100644
index 0000000..40809cb
--- /dev/null
+++ b/docs/demo/md-to-htm.sh
@@ -0,0 +1,10 @@
+
+# pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %1.htm %1.md
+
+ls *.md | while read FILE
+do
+ # /%md - Match pattern at end of expansion
+ # /htm - Replace match with "htm"
+ #echo "${FILE/%md/htm}" "${FILE}"
+ pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o "${FILE/%md/htm}" "${FILE}"
+done
diff --git a/docs/demo/ut_betwnstr.htm b/docs/demo/ut_betwnstr.htm
index 9cab479..d3ffc2a 100644
--- a/docs/demo/ut_betwnstr.htm
+++ b/docs/demo/ut_betwnstr.htm
@@ -2,9 +2,9 @@
utPLSQL 2.3 ut_betwnstr Example
Original Example
-The original "ut_betwnstr" example is in the utPLSQL documentation. The PL/SQL source for the function that will be tested is in Step 2. The PL/SQL source for the package specification and body of the utPLSQL test package are in Step 3.
+The original "ut_betwnstr" example is in the utPLSQL documentation. The PL/SQL source for the function that will be tested is in Step 2. The PL/SQL source for the package specification and body of the utPLSQL test package are in Step 3.
Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
CREATE OR REPLACE PACKAGE ut_betwnstr
IS
@@ -93,41 +93,65 @@ Test Package Conversion
END ut_betwnstr;
/
-It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data.
+It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data.
Check the Results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
+begin
wtplsql.test_run('UT_BETWNSTR');
- wt_text_report.dbms_out(USER,'UT_BETWNSTR',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_BETWNSTR'
+ ,in_detail_level => 30);
end;
/
And Get This:
- Code Coverage for FUNCTION WTP_DEMO.BETWNSTR
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_BETWNSTR
+ Run ID 45: 13-Apr-2024 06:39:29 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 5
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 1 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for FUNCTION WT_DEMO.BETWNSTR
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
Minimum LineExec usec: 0 Not Executed Lines: 0
Average LineExec usec: 2 Unknown Lines: 1
- Maximum LineExec usec: 12 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Maximum LineExec usec: 12 Code Coverage: 100.0%
+ Trigger Source Offset: 0
- - WTP_DEMO.UT_BETWNSTR Test Result Details (Test Run ID 78)
------------------------------------------------------------
- PASS 155ms Typical valid usage. EQ - Expected "cde" and got "cde"
- PASS 0ms NULL start. ISNULL - Expected NULL and got ""
- PASS 0ms NULL end. ISNULL - Expected NULL and got ""
- PASS 0ms End smaller than start. ISNULL - Expected NULL and got ""
- PASS 0ms End larger than string length. EQ - Expected "cdefg" and got "cdefg"
+ WT_DEMO.UT_BETWNSTR Test Result Details
+ Test Run ID: 45
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_BETWNSTR ***------------------------------------------------
+ PASS .749ms Typical valid usage. EQ - Expected "cde" and got "cde"
+ PASS .19ms NULL start. ISNULL - Expected NULL and got ""
+ PASS .061ms NULL end. ISNULL - Expected NULL and got ""
+ PASS .049ms End smaller than start. ISNULL - Expected NULL and got ""
+ PASS .045ms End larger than string length. EQ - Expected "cdefg" and got "cdefg"
- - WTP_DEMO.BETWNSTR FUNCTION Code Coverage Details (Test Run ID 78)
+ WT_DEMO.BETWNSTR FUNCTION Code Coverage Details
+ Test Run ID: 45
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 5 1 2 function betwnstr
- 8 EXEC 5 19 1 12 return (
- 15 EXEC 5 1 0 1 end;
+ 1 UNKN 0 3 0 1 FUNCTION betwnStr (
+ 9 EXEC 5 19 1 12 RETURN (
+ 16 EXEC 5 1 0 0 END;
Demos and Examples
diff --git a/docs/demo/ut_betwnstr.md b/docs/demo/ut_betwnstr.md
index d02db89..e2b0d5e 100644
--- a/docs/demo/ut_betwnstr.md
+++ b/docs/demo/ut_betwnstr.md
@@ -10,7 +10,7 @@ The [original "ut_betwnstr" example](https://utplsql.org/utPLSQL/v2.3.1/fourstep
## Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
@@ -107,19 +107,32 @@ END ut_betwnstr;
/
```
-It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data.
+It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data.
## Check the Results
-Run this:
+The Persist add-on must be installed.
+
+Run this to setup HOOKS:
```
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+```
+
+Run this:
+```
begin
wtplsql.test_run('UT_BETWNSTR');
- wt_text_report.dbms_out(USER,'UT_BETWNSTR',30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_BETWNSTR'
+ ,in_detail_level => 30);
end;
/
```
@@ -127,29 +140,44 @@ end;
And Get This:
```
- Code Coverage for FUNCTION WTP_DEMO.BETWNSTR
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_BETWNSTR
+ Run ID 45: 13-Apr-2024 06:39:29 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 5
+ Average Elapsed msec: 0 Failed Assertions: 0
+ Maximum Elapsed msec: 1 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for FUNCTION WT_DEMO.BETWNSTR
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
Minimum LineExec usec: 0 Not Executed Lines: 0
Average LineExec usec: 2 Unknown Lines: 1
- Maximum LineExec usec: 12 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_BETWNSTR Test Result Details (Test Run ID 78)
------------------------------------------------------------
- PASS 155ms Typical valid usage. EQ - Expected "cde" and got "cde"
- PASS 0ms NULL start. ISNULL - Expected NULL and got ""
- PASS 0ms NULL end. ISNULL - Expected NULL and got ""
- PASS 0ms End smaller than start. ISNULL - Expected NULL and got ""
- PASS 0ms End larger than string length. EQ - Expected "cdefg" and got "cdefg"
-
- - WTP_DEMO.BETWNSTR FUNCTION Code Coverage Details (Test Run ID 78)
+ Maximum LineExec usec: 12 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.UT_BETWNSTR Test Result Details
+ Test Run ID: 45
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_BETWNSTR ***------------------------------------------------
+ PASS .749ms Typical valid usage. EQ - Expected "cde" and got "cde"
+ PASS .19ms NULL start. ISNULL - Expected NULL and got ""
+ PASS .061ms NULL end. ISNULL - Expected NULL and got ""
+ PASS .049ms End smaller than start. ISNULL - Expected NULL and got ""
+ PASS .045ms End larger than string length. EQ - Expected "cdefg" and got "cdefg"
+
+ WT_DEMO.BETWNSTR FUNCTION Code Coverage Details
+ Test Run ID: 45
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 5 1 2 function betwnstr
- 8 EXEC 5 19 1 12 return (
- 15 EXEC 5 1 0 1 end;
+ 1 UNKN 0 3 0 1 FUNCTION betwnStr (
+ 9 EXEC 5 19 1 12 RETURN (
+ 16 EXEC 5 1 0 0 END;
```
---
diff --git a/docs/demo/ut_calc_secs_between.htm b/docs/demo/ut_calc_secs_between.htm
index f2b3e61..644a8cf 100644
--- a/docs/demo/ut_calc_secs_between.htm
+++ b/docs/demo/ut_calc_secs_between.htm
@@ -2,9 +2,9 @@
utPLSQL 2.3 ut_ut_calc_secs_between Example
Original Example
-The original "ut_ut_calc_secs_between" example is in the utPLSQL documentation. The PL/SQL source for the procedure that will be tested is under the section "Test Success Through Parameters". The PL/SQL source for the package specification and body of the utPLSQL test package are in the same section.
+The original "ut_ut_calc_secs_between" example is in the utPLSQL documentation. The PL/SQL source for the procedure that will be tested is under the section "Test Success Through Parameters". The PL/SQL source for the package specification and body of the utPLSQL test package are in the same section.
Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
CREATE OR REPLACE PACKAGE ut_calc_secs_between
IS
@@ -79,39 +79,62 @@ Test Package Conversion
END ut_calc_secs_between;
/
-It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data.
+It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data.
Check the Results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
+begin
wtplsql.test_run('UT_CALC_SECS_BETWEEN');
- wt_text_report.dbms_out(in_runner_name => 'UT_CALC_SECS_BETWEEN'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_CALC_SECS_BETWEEN'
+ ,in_detail_level => 30);
end;
/
And Get This:
- Code Coverage for PROCEDURE WTP_DEMO.CALC_SECS_BETWEEN
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_CALC_SECS_BETWEEN
+ Run ID 48: 13-Apr-2024 06:44:27 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 2
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PROCEDURE WT_DEMO.CALC_SECS_BETWEEN
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 1 Not Executed Lines: 0
+ Minimum LineExec usec: 0 Not Executed Lines: 0
Average LineExec usec: 2 Unknown Lines: 1
- Maximum LineExec usec: 8 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Maximum LineExec usec: 6 Code Coverage: 100.0%
+ Trigger Source Offset: 0
- - WTP_DEMO.UT_CALC_SECS_BETWEEN Test Result Details (Test Run ID 80)
------------------------------------------------------------
- PASS 103ms Same dates. EQ - Expected "0" and got "0"
- PASS 0ms Exactly one day. EQ - Expected "86400" and got "86400"
+ WT_DEMO.UT_CALC_SECS_BETWEEN Test Result Details
+ Test Run ID: 48
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_CALC_SECS_BETWEEN ***---------------------------------------
+ PASS .499ms Same dates. EQ - Expected "0" and got "0"
+ PASS .095ms Exactly one day. EQ - Expected "86400" and got "86400"
- - WTP_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details (Test Run ID 80)
+ WT_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details
+ Test Run ID: 48
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 2 0 2 PROCEDURE calc_secs_between (
- 10 EXEC 2 9 1 8 secs := (date2 - date1) * 24 * 60 * 60;
- 11 EXEC 2 1 1 1 END;
+ 1 UNKN 0 1 0 1 PROCEDURE calc_secs_between (
+ 10 EXEC 2 8 1 6 secs := (date2 - date1) * 24 * 60 * 60;
+ 11 EXEC 2 0 0 0 END;
Demos and Examples
diff --git a/docs/demo/ut_calc_secs_between.md b/docs/demo/ut_calc_secs_between.md
index ac1f708..d4f8fe7 100644
--- a/docs/demo/ut_calc_secs_between.md
+++ b/docs/demo/ut_calc_secs_between.md
@@ -10,7 +10,7 @@ The [original "ut_ut_calc_secs_between" example](https://utplsql.org/utPLSQL/v2.
## Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
@@ -93,20 +93,32 @@ END ut_calc_secs_between;
/
```
-It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a test runner package. The SET DBOUT annotation was also added to gather code coverage data.
+It is not necessary to keep the ut_setup and ut_teardown procedures. These were kept to indicate how to incorporate those procedures into a Test Runner package. The SET DBOUT annotation was also added to gather code coverage data.
## Check the Results
-Run this:
+The Persist add-on must be installed.
+
+Run this to setup HOOKS:
```
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+```
+Run this:
+
+```
begin
wtplsql.test_run('UT_CALC_SECS_BETWEEN');
- wt_text_report.dbms_out(in_runner_name => 'UT_CALC_SECS_BETWEEN'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_CALC_SECS_BETWEEN'
+ ,in_detail_level => 30);
end;
/
```
@@ -114,26 +126,41 @@ end;
And Get This:
```
- Code Coverage for PROCEDURE WTP_DEMO.CALC_SECS_BETWEEN
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_CALC_SECS_BETWEEN
+ Run ID 48: 13-Apr-2024 06:44:27 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 2
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 0 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PROCEDURE WT_DEMO.CALC_SECS_BETWEEN
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 1 Not Executed Lines: 0
+ Minimum LineExec usec: 0 Not Executed Lines: 0
Average LineExec usec: 2 Unknown Lines: 1
- Maximum LineExec usec: 8 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_CALC_SECS_BETWEEN Test Result Details (Test Run ID 80)
------------------------------------------------------------
- PASS 103ms Same dates. EQ - Expected "0" and got "0"
- PASS 0ms Exactly one day. EQ - Expected "86400" and got "86400"
-
- - WTP_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details (Test Run ID 80)
+ Maximum LineExec usec: 6 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.UT_CALC_SECS_BETWEEN Test Result Details
+ Test Run ID: 48
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_CALC_SECS_BETWEEN ***---------------------------------------
+ PASS .499ms Same dates. EQ - Expected "0" and got "0"
+ PASS .095ms Exactly one day. EQ - Expected "86400" and got "86400"
+
+ WT_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details
+ Test Run ID: 48
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 2 0 2 PROCEDURE calc_secs_between (
- 10 EXEC 2 9 1 8 secs := (date2 - date1) * 24 * 60 * 60;
- 11 EXEC 2 1 1 1 END;
+ 1 UNKN 0 1 0 1 PROCEDURE calc_secs_between (
+ 10 EXEC 2 8 1 6 secs := (date2 - date1) * 24 * 60 * 60;
+ 11 EXEC 2 0 0 0 END;
```
---
diff --git a/docs/demo/ut_str.htm b/docs/demo/ut_str.htm
index c017cc6..987733d 100644
--- a/docs/demo/ut_str.htm
+++ b/docs/demo/ut_str.htm
@@ -2,9 +2,9 @@
utPLSQL 2.3 ut_str Example
Original Example
-The original "ut_str" example is in the utPLSQL documentation. The PL/SQL source for the package to be tested is somewhat elusive. It is not on the website, but in the "examples" source in a files called "str.pks" and "str.pkb". This example is the unique case of a self-testing package in utPLSQL, which is also discussed in the Put Test Code in Same Package web page. Since it is a self-testing package, all the source is included in this web page.
+The original "ut_str" example is in the utPLSQL documentation. The PL/SQL source for the package to be tested is somewhat elusive. It is not on the website, but in the "examples" source in a files called "str.pks" and "str.pkb". This example is the unique case of a self-testing package in utPLSQL, which is also discussed in the Put Test Code in Same Package web page. Since it is a self-testing package, all the source is included in this web page.
Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
/* Formatted on 2001/11/19 15:11 (Formatter Plus v4.5.2) */
CREATE OR REPLACE PACKAGE str
@@ -122,9 +122,9 @@ Test Package Conversion
);
END;
- --% WTPLSQL SET DBOUT "STR:PACKAGE BODY" %--
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'STR:PACKAGE BODY';
ut_setup;
ut_betwn;
ut_teardown;
@@ -133,74 +133,89 @@ Test Package Conversion
END str;
/
-Mid-way down the package body is the annotation "WTPLSQL_begin_ignore_lines". This annotation defines the source lines that will not be included in the code coverage metrics. The SET DBOUT annotation was also added to gather code coverage data.
+Mid-way down the package body is the annotation "WTPLSQL_begin_ignore_lines". This annotation defines the source lines that will not be included in the code coverage metrics. The SET DBOUT annotation was also added to gather code coverage data.
Check the Results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
+begin
wtplsql.test_run('STR');
- wt_text_report.dbms_out(in_runner_name => 'STR'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'STR'
+ ,in_detail_level => 30);
end;
/
And Get This:
- wtPLSQL 1.1.0 - Run ID 82: 25-Jun-2018 10:08:46 PM
-
- Test Results for WTP_DEMO.STR
- Total Test Cases: 0 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 30 Error Assertions: 0
- Maximum Interval msec: 89 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for PACKAGE BODY WTP_DEMO.STR
- Ignored Lines: 14 Total Profiled Lines: 25
- Excluded Lines: 1 Total Executed Lines: 4
- Minimum LineExec usec: 0 Not Executed Lines: 5
- Average LineExec usec: 0 Unknown Lines: 1
- Maximum LineExec usec: 5 Code Coverage: 44.40%
- Trigger Source Offset: 0
-
- - WTP_DEMO.STR Test Result Details (Test Run ID 82)
------------------------------------------------------------
- PASS 89ms Typical Valid Usage. EQ - Expected "is is" and got "is is"
- PASS 0ms Test Negative Start. EQ - Expected "ing" and got "ing"
- PASS 0ms Start bigger than end. ISNULL - Expected NULL and got ""
-
- - WTP_DEMO.STR PACKAGE BODY Code Coverage Details (Test Run ID 82)
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.STR
+ Run ID 50: 13-Apr-2024 06:52:06 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WT_DEMO.STR
+ ----------------------------------------------------------------
+ Ignored Lines: 15 Total Profiled Lines: 26
+ Excluded Lines: 2 Total Executed Lines: 4
+ Minimum LineExec usec: 0 Not Executed Lines: 4
+ Average LineExec usec: 1 Unknown Lines: 1
+ Maximum LineExec usec: 5 Code Coverage: 50.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.STR Test Result Details
+ Test Run ID: 50
+ --------------------------------------------------------------
+---*** WT_DEMO.STR ***--------------------------------------------------------
+ PASS 2.18ms Typical Valid Usage. EQ - Expected "is is" and got "is is"
+ PASS .091ms Test Negative Start. EQ - Expected "ing" and got "ing"
+ PASS .044ms Start bigger than end. ISNULL - Expected NULL and got ""
+
+ WT_DEMO.STR PACKAGE BODY Code Coverage Details
+ Test Run ID: 50
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 3 UNKN 0 2 1 1 FUNCTION betwn (
- 10 EXEC 3 1 0 1 l_start PLS_INTEGER := start_in;
+ 3 UNKN 0 1 0 1 FUNCTION betwn (
+ 10 EXEC 3 0 0 0 l_start PLS_INTEGER := start_in;
12 EXEC 3 1 0 1 IF l_start = 0
14#NOTX# 0 0 0 0 l_start := 1;
- 17 EXEC 3 7 0 5 RETURN (SUBSTR (
- 25 EXEC 3 1 1 1 END;
+ 17 EXEC 3 6 0 5 RETURN (SUBSTR (
+ 25 EXEC 3 1 0 0 END;
27 EXCL 0 0 0 0 FUNCTION betwn2 (
36#NOTX# 0 0 0 0 IF end_in < 0
38#NOTX# 0 0 0 0 RETURN betwn (string_in, start_in, end_in);
40#NOTX# 0 0 0 0 RETURN (SUBSTR (
- 51#NOTX# 0 0 0 0 END;
+ 51 EXCL 0 0 0 0 END;
55 IGNR 0 0 0 0 PROCEDURE ut_setup
58 IGNR 1 1 1 1 NULL;
61 IGNR 0 0 0 0 PROCEDURE ut_teardown
64 IGNR 1 0 0 0 NULL;
68 IGNR 0 3 3 3 PROCEDURE ut_betwn
- 71 IGNR 1 18 18 18 utassert.eq (
- 76 IGNR 1 1 1 1 utassert.eq (
- 81 IGNR 1 1 1 1 utassert.isnull (
+ 71 IGNR 1 23 0 23 utassert.eq (
+ 76 IGNR 1 1 0 1 utassert.eq (
+ 81 IGNR 1 1 0 1 utassert.isnull (
85 IGNR 1 0 0 0 END;
- 88 IGNR 0 1 1 1 PROCEDURE wtplsql_run IS
+ 87 IGNR 0 1 1 1 PROCEDURE wtplsql_run IS
+ 89 IGNR 2 29 1 27 wtplsql.g_DBOUT := 'STR:PACKAGE BODY';
90 IGNR 1 0 0 0 ut_setup;
91 IGNR 1 0 0 0 ut_betwn;
- 92 IGNR 1 0 0 0 ut_teardown;
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 93 IGNR 1 0 0 0 END wtplsql_run;
+ 92 IGNR 1 0 0 0 ut_teardown;
+ 93 IGNR 1 1 1 1 END wtplsql_run;
Demos and Examples
diff --git a/docs/demo/ut_str.md b/docs/demo/ut_str.md
index 87de66b..939b1b5 100644
--- a/docs/demo/ut_str.md
+++ b/docs/demo/ut_str.md
@@ -10,7 +10,7 @@ The [original "ut_str" example](https://utplsql.org/utPLSQL/v2.3.1/testfunc.html
## Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a Test Runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
@@ -135,9 +135,9 @@ IS
);
END;
- --% WTPLSQL SET DBOUT "STR:PACKAGE BODY" %--
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'STR:PACKAGE BODY';
ut_setup;
ut_betwn;
ut_teardown;
@@ -152,15 +152,27 @@ Mid-way down the package body is the annotation "WTPLSQL_begin_ignore_lines". T
## Check the Results
-Run this:
+The Persist add-on must be installed.
+
+Run this to setup HOOKS:
```
-set serveroutput on size unlimited format word_wrapped
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+```
+Run this:
+
+```
begin
wtplsql.test_run('STR');
- wt_text_report.dbms_out(in_runner_name => 'STR'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'STR'
+ ,in_detail_level => 30);
end;
/
```
@@ -168,61 +180,68 @@ end;
And Get This:
```
- wtPLSQL 1.1.0 - Run ID 82: 25-Jun-2018 10:08:46 PM
-
- Test Results for WTP_DEMO.STR
- Total Test Cases: 0 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 30 Error Assertions: 0
- Maximum Interval msec: 89 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for PACKAGE BODY WTP_DEMO.STR
- Ignored Lines: 14 Total Profiled Lines: 25
- Excluded Lines: 1 Total Executed Lines: 4
- Minimum LineExec usec: 0 Not Executed Lines: 5
- Average LineExec usec: 0 Unknown Lines: 1
- Maximum LineExec usec: 5 Code Coverage: 44.40%
- Trigger Source Offset: 0
-
- - WTP_DEMO.STR Test Result Details (Test Run ID 82)
------------------------------------------------------------
- PASS 89ms Typical Valid Usage. EQ - Expected "is is" and got "is is"
- PASS 0ms Test Negative Start. EQ - Expected "ing" and got "ing"
- PASS 0ms Start bigger than end. ISNULL - Expected NULL and got ""
-
- - WTP_DEMO.STR PACKAGE BODY Code Coverage Details (Test Run ID 82)
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.STR
+ Run ID 50: 13-Apr-2024 06:52:06 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 0 Total Assertions: 3
+ Average Elapsed msec: 1 Failed Assertions: 0
+ Maximum Elapsed msec: 2 Total Testcases: 1
+ Total Run Time (sec): 0.2 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PACKAGE BODY WT_DEMO.STR
+ ----------------------------------------------------------------
+ Ignored Lines: 15 Total Profiled Lines: 26
+ Excluded Lines: 2 Total Executed Lines: 4
+ Minimum LineExec usec: 0 Not Executed Lines: 4
+ Average LineExec usec: 1 Unknown Lines: 1
+ Maximum LineExec usec: 5 Code Coverage: 50.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.STR Test Result Details
+ Test Run ID: 50
+ --------------------------------------------------------------
+---*** WT_DEMO.STR ***--------------------------------------------------------
+ PASS 2.18ms Typical Valid Usage. EQ - Expected "is is" and got "is is"
+ PASS .091ms Test Negative Start. EQ - Expected "ing" and got "ing"
+ PASS .044ms Start bigger than end. ISNULL - Expected NULL and got ""
+
+ WT_DEMO.STR PACKAGE BODY Code Coverage Details
+ Test Run ID: 50
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 3 UNKN 0 2 1 1 FUNCTION betwn (
- 10 EXEC 3 1 0 1 l_start PLS_INTEGER := start_in;
+ 3 UNKN 0 1 0 1 FUNCTION betwn (
+ 10 EXEC 3 0 0 0 l_start PLS_INTEGER := start_in;
12 EXEC 3 1 0 1 IF l_start = 0
14#NOTX# 0 0 0 0 l_start := 1;
- 17 EXEC 3 7 0 5 RETURN (SUBSTR (
- 25 EXEC 3 1 1 1 END;
+ 17 EXEC 3 6 0 5 RETURN (SUBSTR (
+ 25 EXEC 3 1 0 0 END;
27 EXCL 0 0 0 0 FUNCTION betwn2 (
36#NOTX# 0 0 0 0 IF end_in < 0
38#NOTX# 0 0 0 0 RETURN betwn (string_in, start_in, end_in);
40#NOTX# 0 0 0 0 RETURN (SUBSTR (
- 51#NOTX# 0 0 0 0 END;
+ 51 EXCL 0 0 0 0 END;
55 IGNR 0 0 0 0 PROCEDURE ut_setup
58 IGNR 1 1 1 1 NULL;
61 IGNR 0 0 0 0 PROCEDURE ut_teardown
64 IGNR 1 0 0 0 NULL;
68 IGNR 0 3 3 3 PROCEDURE ut_betwn
- 71 IGNR 1 18 18 18 utassert.eq (
- 76 IGNR 1 1 1 1 utassert.eq (
- 81 IGNR 1 1 1 1 utassert.isnull (
+ 71 IGNR 1 23 0 23 utassert.eq (
+ 76 IGNR 1 1 0 1 utassert.eq (
+ 81 IGNR 1 1 0 1 utassert.isnull (
85 IGNR 1 0 0 0 END;
- 88 IGNR 0 1 1 1 PROCEDURE wtplsql_run IS
+ 87 IGNR 0 1 1 1 PROCEDURE wtplsql_run IS
+ 89 IGNR 2 29 1 27 wtplsql.g_DBOUT := 'STR:PACKAGE BODY';
90 IGNR 1 0 0 0 ut_setup;
91 IGNR 1 0 0 0 ut_betwn;
- 92 IGNR 1 0 0 0 ut_teardown;
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 93 IGNR 1 0 0 0 END wtplsql_run;
+ 92 IGNR 1 0 0 0 ut_teardown;
+ 93 IGNR 1 1 1 1 END wtplsql_run;
```
---
diff --git a/docs/demo/ut_truncit.htm b/docs/demo/ut_truncit.htm
index dd70942..f56d400 100644
--- a/docs/demo/ut_truncit.htm
+++ b/docs/demo/ut_truncit.htm
@@ -2,9 +2,9 @@
utPLSQL 2.3 ut_truncit Example
Original Example
-The original "ut_truncit" example is in the utPLSQL documentation. The PL/SQL source for the function that will be tested is in the "Test Success by Analyzing Impact" section. There is an additional function "tabcount" that is also needed. The PL/SQL source for the package specification and body of the utPLSQL test package are in the same section.
+The original "ut_truncit" example is in the utPLSQL documentation. The PL/SQL source for the function that will be tested is in the "Test Success by Analyzing Impact" section. There is an additional function "tabcount" that is also needed. The PL/SQL source for the package specification and body of the utPLSQL test package are in the same section.
Test Package Conversion
-Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
+Conversion of this test package into a test runner package requires the addition of the "wtPLSQL_run" procedure in the package specification.
Run this:
CREATE OR REPLACE PACKAGE ut_truncit
IS
@@ -52,10 +52,9 @@ Test Package Conversion
);
END ut_TRUNCIT;
- --% WTPLSQL SET DBOUT "TRUNCIT:PROCEDURE" %--
-
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'TRUNCIT:PROCEDURE';
ut_setup;
ut_TRUNCIT;
ut_teardown;
@@ -65,44 +64,58 @@ Test Package Conversion
The SET DBOUT annotation was also added to gather code coverage data.
Check the Results
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
+
Run this:
-set serveroutput on size unlimited format word_wrapped
-
-begin
+begin
wtplsql.test_run('UT_TRUNCIT');
- wt_text_report.dbms_out(in_runner_name => 'UT_TRUNCIT'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_TRUNCIT'
+ ,in_detail_level => 30);
end;
/
And Get This:
- wtPLSQL 1.1.0 - Run ID 81: 25-Jun-2018 09:48:39 PM
-
- Test Results for WTP_DEMO.UT_TRUNCIT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 331 Failed Assertions: 0
- Average Interval msec: 331 Error Assertions: 0
- Maximum Interval msec: 331 Test Yield: 100.00%
- Total Run Time (sec): 0.4
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_TRUNCIT
+ Run ID 49: 13-Apr-2024 06:48:15 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 559 Total Assertions: 1
+ Average Elapsed msec: 559 Failed Assertions: 0
+ Maximum Elapsed msec: 559 Total Testcases: 1
+ Total Run Time (sec): 1.0 Failed Testcases: 0
+ Testcase Yield: 100%
- Code Coverage for PROCEDURE WTP_DEMO.TRUNCIT
+ Code Coverage for PROCEDURE WT_DEMO.TRUNCIT
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
Minimum LineExec usec: 2 Not Executed Lines: 0
- Average LineExec usec: 15714 Unknown Lines: 1
- Maximum LineExec usec: 31423 Code Coverage: 100.00%
- Trigger Source Offset: 0
+ Average LineExec usec: 16393 Unknown Lines: 1
+ Maximum LineExec usec: 32778 Code Coverage: 100.0%
+ Trigger Source Offset: 0
- - WTP_DEMO.UT_TRUNCIT Test Result Details (Test Run ID 81)
------------------------------------------------------------
- PASS 331ms Test of TRUNCIT. EQ - Expected "0" and got "0"
+ WT_DEMO.UT_TRUNCIT Test Result Details
+ Test Run ID: 49
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_TRUNCIT ***-------------------------------------------------
+ PASS 559.ms Test of TRUNCIT. EQ - Expected "0" and got "0"
- - WTP_DEMO.TRUNCIT PROCEDURE Code Coverage Details (Test Run ID 81)
+ WT_DEMO.TRUNCIT PROCEDURE Code Coverage Details
+ Test Run ID: 49
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 3 3 3 PROCEDURE truncit (
- 7 EXEC 1 31426 3 31423 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
+ 1 UNKN 0 1 1 1 PROCEDURE truncit (
+ 7 EXEC 1 32784 6 32778 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
8 EXEC 1 2 2 2 END;
diff --git a/docs/demo/ut_truncit.md b/docs/demo/ut_truncit.md
index e4a0d35..638a7b0 100644
--- a/docs/demo/ut_truncit.md
+++ b/docs/demo/ut_truncit.md
@@ -65,10 +65,9 @@ IS
);
END ut_TRUNCIT;
- --% WTPLSQL SET DBOUT "TRUNCIT:PROCEDURE" %--
-
PROCEDURE wtplsql_run IS
BEGIN
+ wtplsql.g_DBOUT := 'TRUNCIT:PROCEDURE';
ut_setup;
ut_TRUNCIT;
ut_teardown;
@@ -82,15 +81,27 @@ The SET DBOUT annotation was also added to gather code coverage data.
## Check the Results
-Run this:
+The Persist add-on must be installed.
+Run this to setup HOOKS:
+
+```
+begin
+ wtp.junit_core_report.delete_hooks;
+ wtp.wt_core_report.delete_hooks;
+ wtp.wt_test_run.insert_hooks;
+end;
+/
```
-set serveroutput on size unlimited format word_wrapped
+Run this:
+
+```
begin
wtplsql.test_run('UT_TRUNCIT');
- wt_text_report.dbms_out(in_runner_name => 'UT_TRUNCIT'
- ,in_detail_level => 30);
+ wtp.wt_persist_report.dbms_out(in_runner_owner => USER
+ ,in_runner_name => 'UT_TRUNCIT'
+ ,in_detail_level => 30);
end;
/
```
@@ -98,33 +109,39 @@ end;
And Get This:
```
- wtPLSQL 1.1.0 - Run ID 81: 25-Jun-2018 09:48:39 PM
-
- Test Results for WTP_DEMO.UT_TRUNCIT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 331 Failed Assertions: 0
- Average Interval msec: 331 Error Assertions: 0
- Maximum Interval msec: 331 Test Yield: 100.00%
- Total Run Time (sec): 0.4
-
- Code Coverage for PROCEDURE WTP_DEMO.TRUNCIT
+ wtPLSQL wtpsrc 1.003, wtptst 1.003, wtpsav 1.003, wtpgrb 1.003
+ Test Results for WT_DEMO.UT_TRUNCIT
+ Run ID 49: 13-Apr-2024 06:48:15 PM
+ --------------------------------------------------------------
+ Minimum Elapsed msec: 559 Total Assertions: 1
+ Average Elapsed msec: 559 Failed Assertions: 0
+ Maximum Elapsed msec: 559 Total Testcases: 1
+ Total Run Time (sec): 1.0 Failed Testcases: 0
+ Testcase Yield: 100%
+
+ Code Coverage for PROCEDURE WT_DEMO.TRUNCIT
+ ----------------------------------------------------------------
Ignored Lines: 0 Total Profiled Lines: 3
Excluded Lines: 0 Total Executed Lines: 2
Minimum LineExec usec: 2 Not Executed Lines: 0
- Average LineExec usec: 15714 Unknown Lines: 1
- Maximum LineExec usec: 31423 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_TRUNCIT Test Result Details (Test Run ID 81)
------------------------------------------------------------
- PASS 331ms Test of TRUNCIT. EQ - Expected "0" and got "0"
-
- - WTP_DEMO.TRUNCIT PROCEDURE Code Coverage Details (Test Run ID 81)
+ Average LineExec usec: 16393 Unknown Lines: 1
+ Maximum LineExec usec: 32778 Code Coverage: 100.0%
+ Trigger Source Offset: 0
+
+ WT_DEMO.UT_TRUNCIT Test Result Details
+ Test Run ID: 49
+ --------------------------------------------------------------
+---*** WT_DEMO.UT_TRUNCIT ***-------------------------------------------------
+ PASS 559.ms Test of TRUNCIT. EQ - Expected "0" and got "0"
+
+ WT_DEMO.TRUNCIT PROCEDURE Code Coverage Details
+ Test Run ID: 49
+ ----------------------------------------------------------------
Source TotTime MinTime MaxTime
Line Stat Occurs (usec) (usec) (usec) Text
------ ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 3 3 3 PROCEDURE truncit (
- 7 EXEC 1 31426 3 31423 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
+ 1 UNKN 0 1 1 1 PROCEDURE truncit (
+ 7 EXEC 1 32784 6 32778 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
8 EXEC 1 2 2 2 END;
```
diff --git a/docs/design/.gitignore b/docs/design/.gitignore
new file mode 100644
index 0000000..e60e2d0
--- /dev/null
+++ b/docs/design/.gitignore
@@ -0,0 +1,37 @@
+**/*.localz
+**/*.local
+**/*.git
+**/*.DS_Store
+**/.DS_Store
+**/.do_pool/**
+**/.do_pool
+**/*#JDEVADF_*
+**/*~
+**/*.scc
+**/*.mv.*
+**/*.unmkelem.*
+**/*.sync.*
+**/*.rename.*
+**/*.unbranch.*
+**/*.unco.*
+**/*.saved.*
+**/*.client_contrib
+**/.svn/**
+**/.data/**
+**/*.cdi
+**/*.bak
+**/*.generated.java
+**/*.ignore
+**/*.labellog.emd
+**/.*.cs
+**/.fullsource_nt
+**/.fullsource
+**/.depprod_nt
+**/.depprod
+**/.ade_path
+**/.ade_path/**
+**/*.contrib*
+**/*.keep
+**/*.rvi
+**/.#*
+**/CVS/**
diff --git a/docs/design/Core_Call_Tree_Diagrams.odg b/docs/design/Core_Call_Tree_Diagrams.odg
new file mode 100644
index 0000000..63962bc
Binary files /dev/null and b/docs/design/Core_Call_Tree_Diagrams.odg differ
diff --git a/docs/design/Core_Call_Tree_Diagrams.pdf b/docs/design/Core_Call_Tree_Diagrams.pdf
new file mode 100644
index 0000000..e3797b3
Binary files /dev/null and b/docs/design/Core_Call_Tree_Diagrams.pdf differ
diff --git a/docs/design/Core_ER_Diagrams.pdf b/docs/design/Core_ER_Diagrams.pdf
new file mode 100644
index 0000000..f832ce6
Binary files /dev/null and b/docs/design/Core_ER_Diagrams.pdf differ
diff --git a/docs/design/Main.dmd b/docs/design/Main.dmd
new file mode 100644
index 0000000..f96b399
--- /dev/null
+++ b/docs/design/Main.dmd
@@ -0,0 +1,8 @@
+
+
+duane
+2024-04-10 19:07:12 UTC
+Main
+false
+1A482270-CB2D-848A-4777-3E87E273D611
+
diff --git a/docs/design/Main/businessinfo/Business Information.xml b/docs/design/Main/businessinfo/Business Information.xml
new file mode 100644
index 0000000..a94888d
--- /dev/null
+++ b/docs/design/Main/businessinfo/Business Information.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+
diff --git a/docs/design/Main/datatypes/DataTypes.xml b/docs/design/Main/datatypes/DataTypes.xml
new file mode 100644
index 0000000..76eb9ca
--- /dev/null
+++ b/docs/design/Main/datatypes/DataTypes.xml
@@ -0,0 +1,15 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+array_ref_
+array_
+10
+ARRAY
+_Array
+inst_
+ref_
+true
+
diff --git a/docs/design/Main/datatypes/structuredtype/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml b/docs/design/Main/datatypes/structuredtype/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml
new file mode 100644
index 0000000..456c1f1
--- /dev/null
+++ b/docs/design/Main/datatypes/structuredtype/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml
@@ -0,0 +1,10 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+true
+false
+true
+
diff --git a/docs/design/Main/datatypes/structuredtype/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml b/docs/design/Main/datatypes/structuredtype/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml
new file mode 100644
index 0000000..673ceec
--- /dev/null
+++ b/docs/design/Main/datatypes/structuredtype/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml
@@ -0,0 +1,10 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+true
+false
+true
+
diff --git a/docs/design/Main/datatypes/subviews/B34C9F55-09DA-A48A-CB4D-0F616681557E.xml b/docs/design/Main/datatypes/subviews/B34C9F55-09DA-A48A-CB4D-0F616681557E.xml
new file mode 100644
index 0000000..8b46680
--- /dev/null
+++ b/docs/design/Main/datatypes/subviews/B34C9F55-09DA-A48A-CB4D-0F616681557E.xml
@@ -0,0 +1,26 @@
+
+
+duane
+duane
+2024-04-10 19:07:13 UTC
+false
+true
+false
+true
+false
+false
+false
+-1
+false
+1
+
+
+false
+
+
+
+false
+
+
+
+
diff --git a/docs/design/Main/dl_settings.xml b/docs/design/Main/dl_settings.xml
new file mode 100644
index 0000000..b73a92f
--- /dev/null
+++ b/docs/design/Main/dl_settings.xml
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/design/Main/logical/Logical.xml b/docs/design/Main/logical/Logical.xml
new file mode 100644
index 0000000..1ba97f8
--- /dev/null
+++ b/docs/design/Main/logical/Logical.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+
diff --git a/docs/design/Main/logical/subviews/C2C82868-4699-F91B-EE4D-2F5B8F7B9637.xml b/docs/design/Main/logical/subviews/C2C82868-4699-F91B-EE4D-2F5B8F7B9637.xml
new file mode 100644
index 0000000..d88e32e
--- /dev/null
+++ b/docs/design/Main/logical/subviews/C2C82868-4699-F91B-EE4D-2F5B8F7B9637.xml
@@ -0,0 +1,16 @@
+
+
+duane
+duane
+2024-04-10 19:19:58 UTC
+false
+true
+false
+false
+false
+false
+false
+-1
+false
+1
+
diff --git a/docs/design/Main/mapping/DeletedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml b/docs/design/Main/mapping/DeletedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml
new file mode 100644
index 0000000..dfe3074
--- /dev/null
+++ b/docs/design/Main/mapping/DeletedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docs/design/Main/mapping/ExtendedMap.xml b/docs/design/Main/mapping/ExtendedMap.xml
new file mode 100644
index 0000000..6efc9ae
--- /dev/null
+++ b/docs/design/Main/mapping/ExtendedMap.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docs/design/Main/mapping/ExtendedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml b/docs/design/Main/mapping/ExtendedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml
new file mode 100644
index 0000000..856e51f
--- /dev/null
+++ b/docs/design/Main/mapping/ExtendedMap_RMA1ED17DA-3950-8B0F-4711-FD6A141ADE1D.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docs/design/Main/pm/Process Model.xml b/docs/design/Main/pm/Process Model.xml
new file mode 100644
index 0000000..539be98
--- /dev/null
+++ b/docs/design/Main/pm/Process Model.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:07:13 UTC
+Main
+false
+
diff --git a/docs/design/Main/rdbms/Main_RDBMSSites.xml b/docs/design/Main/rdbms/Main_RDBMSSites.xml
new file mode 100644
index 0000000..75d8ebd
--- /dev/null
+++ b/docs/design/Main/rdbms/Main_RDBMSSites.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D.xml
new file mode 100644
index 0000000..5e9a7de
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D.xml
@@ -0,0 +1,15 @@
+
+
+duane
+2024-04-10 19:07:51 UTC
+Main
+false
+01F6E6D1-21D0-CFBD-ABDD-3988D1813575
+
+
+wtp@DEVPDB_localhost
+wtp
+1
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/062A2B52-09F4-207B-850E-2E04AA065FE2.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/062A2B52-09F4-207B-850E-2E04AA065FE2.xml
new file mode 100644
index 0000000..469ccbe
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/062A2B52-09F4-207B-850E-2E04AA065FE2.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNS_FK2
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TEST_RUNNERS
+NO ACTION
+C619958B-4EFE-7A79-1530-39139BD2978B
+D7E1D9CC-76E4-D542-2C43-D56913973E95
+D7E1D9CC-76E4-D542-2C43-D56913973E95
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/344E365C-34FA-ABD1-6F89-4E7A3DB91B28.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/344E365C-34FA-ABD1-6F89-4E7A3DB91B28.xml
new file mode 100644
index 0000000..037da21
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/344E365C-34FA-ABD1-6F89-4E7A3DB91B28.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_RESULTS_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TEST_RUNS
+NO ACTION
+9636F0E1-B48A-756B-7277-A09DA3C8A191
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/45A573B2-CD43-F1F9-77A0-8B668F99BA02.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/45A573B2-CD43-F1F9-77A0-8B668F99BA02.xml
new file mode 100644
index 0000000..53e66e6
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/45A573B2-CD43-F1F9-77A0-8B668F99BA02.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+PLSQL_PROFILER_UNITS_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.PLSQL_PROFILER_RUNS
+NO ACTION
+AD852798-2151-9B8D-72B3-69C9049EC985
+5A049952-A879-06D7-F379-105EAD71A713
+5A049952-A879-06D7-F379-105EAD71A713
+true
+RUNID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/4656750F-5BBB-BB3F-2A88-EC3E120DC0C9.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/4656750F-5BBB-BB3F-2A88-EC3E120DC0C9.xml
new file mode 100644
index 0000000..e93888a
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/4656750F-5BBB-BB3F-2A88-EC3E120DC0C9.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNS_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_DBOUTS
+NO ACTION
+DA7F3AD5-D951-192B-23AE-A1549FB69116
+EEFF3F3D-7BFE-D1B4-82CE-FAD11C3F8E40
+EEFF3F3D-7BFE-D1B4-82CE-FAD11C3F8E40
+false
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/8CBEA3FE-045F-4598-E7EC-F8E6810F56A7.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/8CBEA3FE-045F-4598-E7EC-F8E6810F56A7.xml
new file mode 100644
index 0000000..07749df
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/8CBEA3FE-045F-4598-E7EC-F8E6810F56A7.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_PROFILES_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TEST_RUNS
+NO ACTION
+9636F0E1-B48A-756B-7277-A09DA3C8A191
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/A82B8171-DCB9-A30B-1B7E-CD8971A17F0E.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/A82B8171-DCB9-A30B-1B7E-CD8971A17F0E.xml
new file mode 100644
index 0000000..69f6f8a
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/A82B8171-DCB9-A30B-1B7E-CD8971A17F0E.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_DBOUT_RUNS_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TEST_RUNS
+NO ACTION
+9636F0E1-B48A-756B-7277-A09DA3C8A191
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/B2E2CA36-09C3-2527-1A40-542A657E6BB9.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/B2E2CA36-09C3-2527-1A40-542A657E6BB9.xml
new file mode 100644
index 0000000..fb3c874
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/B2E2CA36-09C3-2527-1A40-542A657E6BB9.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASE_RUNS_FK2
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TESTCASES
+NO ACTION
+75C40BBC-950A-B117-05CF-FF327E9C0952
+77F4B4E9-7DA5-C427-B6CB-B8503E836FBB
+77F4B4E9-7DA5-C427-B6CB-B8503E836FBB
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/D6679904-5DCC-D682-B6CD-9D2C8772FCEC.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/D6679904-5DCC-D682-B6CD-9D2C8772FCEC.xml
new file mode 100644
index 0000000..7c8b5e1
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/D6679904-5DCC-D682-B6CD-9D2C8772FCEC.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+PLSQL_PROFILER_DATA_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.PLSQL_PROFILER_UNITS
+NO ACTION
+1DEC1727-6653-3CF8-958B-90000528613A
+0EFE6D0A-CD65-AFA0-6C17-06DEE85092BC
+0EFE6D0A-CD65-AFA0-6C17-06DEE85092BC
+true
+RUNID,UNIT_NUMBER
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/DC4188A2-3A69-F618-2B93-07D1466CF0CB.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/DC4188A2-3A69-F618-2B93-07D1466CF0CB.xml
new file mode 100644
index 0000000..c227bf1
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/DC4188A2-3A69-F618-2B93-07D1466CF0CB.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASE_RUNS_FK1
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TEST_RUNS
+NO ACTION
+9636F0E1-B48A-756B-7277-A09DA3C8A191
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+134E95C8-D278-1B3C-D6F9-16362A405CBF
+true
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/EE8549AC-49EC-FBF1-CC57-656F46EF48B0.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/EE8549AC-49EC-FBF1-CC57-656F46EF48B0.xml
new file mode 100644
index 0000000..e125807
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/foreignkey/seg_0/EE8549AC-49EC-FBF1-CC57-656F46EF48B0.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_RESULTS_FK2
+duane
+2024-04-10 19:09:26 UTC
+Main
+WTP.WT_TESTCASES
+NO ACTION
+75C40BBC-950A-B117-05CF-FF327E9C0952
+77F4B4E9-7DA5-C427-B6CB-B8503E836FBB
+77F4B4E9-7DA5-C427-B6CB-B8503E836FBB
+false
+ID
+true
+false
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/01F6E6D1-3988D1813575.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/01F6E6D1-3988D1813575.xml
new file mode 100644
index 0000000..bb7734d
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/01F6E6D1-3988D1813575.xml
@@ -0,0 +1,6 @@
+
+
+duane
+2024-04-10 19:08:09 UTC
+Main
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0608C335-E0E6-0D10-0FA3-562FF256376C.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0608C335-E0E6-0D10-0FA3-562FF256376C.xml
new file mode 100644
index 0000000..c2d3358
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0608C335-E0E6-0D10-0FA3-562FF256376C.xml
@@ -0,0 +1,271 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASE
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_TESTCASE
+ authid definer
+as
+
+ -- Return a Testcase Surrogate Key.
+ -- Return NULL if the Testcase does not exist.
+ function get_id
+ (in_testcase in varchar2)
+ return number;
+
+ -- Return a Testcase Surrogate Key.
+ -- Add the Testcase if it does not exist.
+ function dim_id
+ (in_testcase in varchar2)
+ return number;
+
+ -- Delete all records with no child records
+ procedure delete_records;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_testcase;
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASE
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_TESTCASE
+as
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_TESTCASE CONSTANT varchar2(50) := 'WT_TESTCASE_FOR_TESTING_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_testcase in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id
+ from wt_testcases
+ where testcase = in_testcase;
+ return l_id;
+exception when NO_DATA_FOUND
+then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_TESTCASE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_testcases (id, testcase)
+ values (wt_testcases_seq.nextval, C_TESTCASE)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_TESTCASE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_testcase in varchar2)
+ return number
+is
+ pragma AUTONOMOUS_TRANSACTION;
+ rec wt_testcases%ROWTYPE;
+begin
+ if in_testcase is NULL
+ then
+ return NULL;
+ end if;
+ rec.id := get_id (in_testcase);
+ if rec.id is null
+ then
+ rec.id := wt_testcases_seq.nextval;
+ rec.testcase := in_testcase;
+ insert into wt_testcases values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_TESTCASE);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_TESTCASE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure delete_records
+is
+begin
+ delete from wt_testcases
+ where id in (
+ select id from wt_testcases
+ MINUS
+ select distinct testcase_id ID from wt_results
+ MINUS
+ select distinct testcase_id ID from wt_testcase_runs);
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_testcases (id, testcase)
+ values (wt_testcases_seq.nextval, C_TESTCASE);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TESTCASE:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_testcase;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0BE8DADB-1C62-A689-AFC7-E019ACC9401C.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0BE8DADB-1C62-A689-AFC7-E019ACC9401C.xml
new file mode 100644
index 0000000..53853cb
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/0BE8DADB-1C62-A689-AFC7-E019ACC9401C.xml
@@ -0,0 +1,710 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WTPLSQL
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WTPLSQL
+ authid definer
+as
+
+ C_RUNNER_ENTRY_POINT constant varchar2(30) := 'WTPLSQL_RUN';
+
+ function get_runner_entry_point
+ return varchar2 deterministic;
+
+ function show_version
+ return varchar2;
+
+ -- Database Object Under Test.
+ -- Modify as required
+ g_DBOUT varchar2(128);
+
+ -- Run a single test runner in the current schema
+ -- Returns after test runner is complete
+ procedure test_run
+ (in_package_name in varchar2);
+
+ -- Run all test runners in the current schema
+ -- Returns after all test runners are complete
+ procedure test_all;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ -- begin
+ -- dbms_utility.compile_schema('WTP',TRUE,FALSE);
+ -- end;
+ -- /
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wtplsql;
+
+wtp@DEVPDB_localhost
+WTP
+WTPLSQL
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WTPLSQL
+as
+
+ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+ $THEN
+ TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400);
+ test_all_aa test_all_aa_type;
+ wtplsql_skip_test boolean := FALSE;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+------------------------------------------------------------
+-- This procedure is separated for internal WTPLSQL testing
+procedure check_runner
+is
+ l_package_check number;
+begin
+ -- These RAISEs can be captured because the Test Runs Record is set.
+ -- Check for NULL Runner Name
+ if core_data.g_run_rec.test_runner_name is null
+ then
+ raise_application_error (-20001, 'TEST_RUNNER_NAME is null');
+ end if;
+ -- Check for Valid Runner Name
+ select count(*) into l_package_check
+ from wt_qual_test_runners_vw
+ where owner = core_data.g_run_rec.test_runner_owner
+ and package_name = core_data.g_run_rec.test_runner_name;
+ if l_package_check = 0
+ then
+ raise_application_error (-20002, 'TEST_RUNNER_NAME Procedure "' ||
+ core_data.g_run_rec.test_runner_name ||
+ '.' || C_RUNNER_ENTRY_POINT ||
+ '" is not valid' );
+ end if;
+end check_runner;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_check_runner
+ is
+ l_run_recSAVE core_data.run_rec_type;
+ l_msg_in varchar2(4000);
+ l_err_in varchar2(4000);
+ -------------------------------------- WTPLSQL Testing --
+ procedure l_test_sqlerrm is begin
+ -- Restore the core_data.g_run_rec
+ core_data.g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => l_msg_in
+ ,check_this_in => SQLERRM
+ ,against_this_in => l_err_in);
+ end l_test_sqlerrm;
+ begin
+ -- Save CORE_DATA data
+ l_run_recSAVE := core_data.g_run_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Happy Path 1';
+ wt_assert.eq
+ (msg_in => 'Confirm TEST_RUNNER_OWNER'
+ ,check_this_in => core_data.g_run_rec.test_runner_owner
+ ,against_this_in => USER);
+ core_data.g_run_rec.test_runner_name := 'WTPLSQL';
+ l_msg_in := 'Valid TEST_RUNNER_NAME';
+ l_err_in := 'ORA-0000: normal, successful completion';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ l_test_sqlerrm;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1';
+ core_data.g_run_rec.test_runner_name := '';
+ l_msg_in := 'Null TEST_RUNNER_NAME';
+ l_err_in := 'ORA-20001: TEST_RUNNER_NAME is null';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ -- This test is expected to throw an error
+ l_test_sqlerrm;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2';
+ core_data.g_run_rec.test_runner_name := 'BOGUS';
+ l_msg_in := 'Invalid TEST_RUNNER_NAME';
+ l_err_in := 'ORA-20002: TEST_RUNNER_NAME Procedure "BOGUS.' ||
+ C_RUNNER_ENTRY_POINT || '" is not valid';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ l_test_sqlerrm;
+ end;
+ end t_check_runner;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure check_dbout
+is
+ --
+ -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
+ -- Within a namespace, no two objects can have the same name. The following
+ -- schema objects share one namespace:
+ -- -) Packages
+ -- -) Private synonyms
+ -- -) Sequences
+ -- -) Stand-alone procedures
+ -- -) Stand-alone stored functions
+ -- -) User-defined operators
+ -- -) User-defined types
+ -- -) Tables
+ -- -) Views
+ -- Each of the following schema objects has its own namespace:
+ -- -) Clusters
+ -- -) Constraints
+ -- -) Database triggers
+ -- -) Dimensions
+ -- -) Indexes
+ -- -) Materialized views (When you create a materialized view, the database
+ -- creates an internal table of the same name. This table has the same
+ -- namespace as the other tables in the schema. Therefore, a schema
+ -- cannot contain a table and a materialized view of the same name.)
+ -- -) Private database links
+ -- Because tables and sequences are in the same namespace, a table and a
+ -- sequence in the same schema cannot have the same name. However, tables
+ -- and indexes are in different namespaces. Therefore, a table and an index
+ -- in the same schema can have the same name.
+ -- Each schema in the database has its own namespaces for the objects it
+ -- contains. This means, for example, that two tables in different schemas
+ -- are in different namespaces and can have the same name.
+ -- Results are unknown if a Database Object Under Test has the same name in
+ -- different namespaces.
+ --
+ l_dot_pos number;
+ l_cln_pos number;
+begin
+ if g_DBOUT is null
+ then
+ return;
+ end if;
+ l_dot_pos := instr(g_DBOUT,'.');
+ l_cln_pos := instr(g_DBOUT,':');
+ begin
+ with q_main as (
+ select obj.owner
+ ,obj.object_name
+ ,obj.object_type
+ from dba_objects obj
+ where obj.owner = core_data.g_run_rec.test_runner_owner
+ and ( ( -- No separators were given, assume USER is the owner.
+ -- No object type was given. This could throw TOO_MANY_ROWS.
+ l_dot_pos = 0
+ and l_cln_pos = 0
+ and obj.object_name = g_DBOUT )
+ OR ( -- No object owner was given, assume USER is the owner.
+ l_dot_pos = 0
+ and l_cln_pos != 0
+ and obj.object_name = substr(g_DBOUT, 1, l_cln_pos-1)
+ and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) )
+ UNION ALL
+ select obj.owner
+ ,obj.object_name
+ ,obj.object_type
+ from dba_objects obj
+ where ( -- No object type was given. This could throw TOO_MANY_ROWS.
+ l_dot_pos != 0
+ and l_cln_pos = 0
+ and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1)
+ and obj.object_name = substr(g_DBOUT, l_dot_pos+1, 512) )
+ OR ( -- All separators were given
+ l_dot_pos != 0
+ and l_cln_pos != 0
+ and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1)
+ and obj.object_name = substr(g_DBOUT, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
+ and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) )
+ )
+ select owner
+ ,object_name
+ ,object_type
+ into core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type
+ from q_main;
+ exception
+ when NO_DATA_FOUND
+ then
+ core_data.run_error('Unable to find database object "' ||
+ g_DBOUT || '".' );
+ return;
+ when TOO_MANY_ROWS
+ then
+ -- The SELECT INTO will load some values into these variables
+ -- when TOO_MANY_ROWS are selected.
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.run_error('Found too many database objects "' ||
+ g_DBOUT || '".' );
+ return;
+ when OTHERS
+ then
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.run_error('Error finding database object: ' || SQLERRM);
+ return;
+ end;
+ --
+end check_dbout;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_check_dbout
+ is
+ l_run_recSAVE core_data.run_rec_type;
+ l_run_recTEST core_data.run_rec_type;
+ procedure clear_run_rec is begin
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.g_run_rec.error_message := '';
+ end clear_run_rec;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := '';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'SYS.DUAL';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => 'SYS');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'DUAL');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'TABLE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WTPLSQL:PACKAGE BODY';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => USER);
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'WTPLSQL');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'PACKAGE BODY');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 4';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WT_EXECUTE_TEST_RUNNER';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => USER);
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'WT_EXECUTE_TEST_RUNNER');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'PROCEDURE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'someone.bogus:thingy';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ wt_assert.isnotnull(
+ msg_in => 'l_run_recTEST.error_message',
+ check_this_in => l_run_recTEST.error_message);
+ wt_assert.eqqueryvalue (
+ msg_in => 'l_run_recTEST.error_message',
+ check_query_in => 'select 1 from dual where ''' ||
+ l_run_recTEST.error_message ||
+ ''' like ''%Unable to find database object "' ||
+ g_DBOUT || '".%''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WTPLSQL';
+ check_dbout;
+ g_DBOUT := '';
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ wt_assert.eqqueryvalue (
+ msg_in => 'l_run_recTEST.error_message',
+ check_query_in => 'select 1 from dual where ''' ||
+ l_run_recTEST.error_message ||
+ ''' like ''%Found too many database objects "WTPLSQL".%''',
+ against_value_in => 1);
+ end t_check_dbout;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_runner_entry_point
+ return varchar2
+is
+begin
+ return C_RUNNER_ENTRY_POINT;
+end get_runner_entry_point;
+
+------------------------------------------------------------
+function show_version
+ return varchar2
+is
+ ret_str varchar2(4000);
+begin
+ for buff in (
+ select component, version
+ from wt_version t1
+ where (component, install_tstmp) in (
+ select t2.component, max(t2.install_tstmp)
+ from wt_version t2
+ group by t2.component)
+ and action != 'REMOVE'
+ order by install_tstmp )
+ loop
+ ret_str := ret_str || buff.component || ' ' ||
+ trim(to_char(buff.version,'9999.099')) || ', ';
+ end loop;
+ return substr(ret_str, 1, length(ret_str)-2);
+exception when NO_DATA_FOUND
+then
+ return '';
+end show_version;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_show_version
+ is
+ existing_version varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Setup';
+ existing_version := show_version;
+ wt_assert.isnotnull (
+ msg_in => 'Saved Original Version',
+ check_this_in => existing_version);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 1';
+ insert into wt_version (component, version, action)
+ values ('TESTING', 1.01, 'INSTALL');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => regexp_like(show_version, 'TESTING 1[.]010'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 2';
+ insert into wt_version (component, version, action)
+ values ('TESTING', 1.02, 'UPDATE');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => regexp_like(show_version, 'TESTING 1[.]020'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 3';
+ insert into wt_version (component, version, action)
+ values ('TESTING', 1.02, 'REMOVE');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => not regexp_like(show_version, 'TESTING'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Teardown';
+ rollback;
+ delete from wt_version where component = 'TESTING';
+ wt_assert.eq (
+ msg_in => 'Records Deleted',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 0);
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Return to Existing Version',
+ check_this_in => show_version,
+ against_this_in => existing_version);
+ end t_show_version;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure test_run
+ (in_package_name in varchar2)
+is
+begin
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if wtplsql_skip_test then
+ test_all_aa(in_package_name) := 'X';
+ return; -- Avoid running the TEST_RUN procedure for some self-tests
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ -- Primary Initialize
+ core_data.init1(in_package_name);
+ g_DBOUT := '';
+ wt_assert.reset_globals;
+ -- Reset the Test Runs Record before checking anything
+ check_runner;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('before_test_run');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ -- Secondary Initialize
+ core_data.init2;
+ g_DBOUT := '';
+ --
+ hook.run('execute_test_runner');
+ --
+ -- Primary Finalize
+ wt_assert.g_testcase := '';
+ check_dbout;
+ core_data.final1;
+ g_DBOUT := '';
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_test_run');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end test_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_run
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test Run Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test Run',
+ check_this_in => 'Too complicated because testing occurs while the this procedure is actively running.');
+ end t_test_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure test_all
+is
+ TYPE runners_nt_type is table of varchar2(128);
+ l_runners_nt runners_nt_type;
+begin
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('before_test_all');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ select object_name
+ bulk collect into l_runners_nt
+ from user_procedures t1
+ where procedure_name = C_RUNNER_ENTRY_POINT
+ and object_type = 'PACKAGE'
+ group by object_name
+ order by object_name;
+ for i in 1 .. l_runners_nt.COUNT
+ loop
+ test_run(l_runners_nt(i));
+ end loop;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_test_all');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end test_all;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'TEST_ALL Happy Path';
+ test_all_aa.DELETE;
+ wtplsql_skip_test := TRUE;
+ -- TEST_ALL will populate the test_all_aa array
+ wtplsql.test_all;
+ wtplsql_skip_test := FALSE;
+ -- This package should be in the test_all_aa array
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.this (
+ msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')',
+ check_this_in => test_all_aa.EXISTS( 'WTPLSQL' ));
+ end t_test_all;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ -- Can't set wtplsql.g_DBOUT because it is used for Unit Testing
+ --wtplsql.g_DBOUT := 'WTPLSQL:PACKAGE BODY';
+ t_check_runner;
+ t_check_dbout;
+ t_show_version;
+ t_test_run;
+ t_test_all;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wtplsql;
+
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_WTPLSQL
+duane
+2024-04-10 19:09:28 UTC
+Main
+WTPLSQL
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+0BE8DADB-1C62-A689-AFC7-E019ACC9401C
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WTPLSQL
+duane
+2024-04-10 19:09:28 UTC
+Main
+WTPLSQL
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+0BE8DADB-1C62-A689-AFC7-E019ACC9401C
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/2C1448A2-A5F9-8AC2-F875-8DCAE7C46665.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/2C1448A2-A5F9-8AC2-F875-8DCAE7C46665.xml
new file mode 100644
index 0000000..5f52271
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/2C1448A2-A5F9-8AC2-F875-8DCAE7C46665.xml
@@ -0,0 +1,569 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_JOB
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_JOB
+ authid definer
+as
+
+ -- Database Links are Required to
+ -- Run Jobs as Different Owners
+ procedure create_db_link
+ (in_schema_name in varchar2
+ ,in_password in varchar2);
+ procedure drop_db_link
+ (in_schema_name in varchar2);
+
+ -- Waits for all test runners to complete
+ procedure wait_for_all_tests
+ (in_timeout_seconds in number default 3600
+ ,in_check_interval_seconds in number default 60);
+
+ -- Run a test runner in a different schema
+ -- Returns before the test runner is complete
+ procedure test_run
+ (in_schema_name in varchar2
+ ,in_runner_name in varchar2);
+
+ -- Run all test runners in a different schema
+ -- Returns before all test runners are complete
+ procedure test_all
+ (in_schema_name in varchar2);
+
+ -- Run all test runners in all schema in sequence
+ -- Returns before all test runners are complete
+ procedure test_all_sequential;
+
+ -- Run all test runners in all schema in parallel
+ -- Returns before all test runners are complete
+ procedure test_all_parallel;
+
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_job;
+
+wtp@DEVPDB_localhost
+WTP
+WT_JOB
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_JOB
+as
+
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ g_current_user varchar2(30);
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+----------------------
+-- Private Procedures
+----------------------
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+
+ procedure tl_compile_db_object
+ (in_ptype in varchar2
+ ,in_pname in varchar2
+ ,in_source in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ l_errtxt varchar2(32000) := '';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ -- Wrap in_source to complete the DDL statement
+ l_sql_txt := 'create ' || in_ptype ||
+ ' ' || in_pname ||
+ ' as ' || in_source ;
+ wt_assert.raises
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ for buff in (select * from user_errors
+ where attribute = 'ERROR'
+ and name = in_pname
+ and type = in_ptype
+ order by sequence)
+ loop
+ l_errtxt := l_errtxt || buff.line || ', ' ||
+ buff.position || ': ' || buff.text || CHR(10);
+ end loop;
+ wt_assert.isnull
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname ||
+ ' Error'
+ ,check_this_in => l_errtxt);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.objexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_compile_db_object;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_drop_db_object
+ (in_ptype in varchar2,
+ in_pname in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
+ wt_assert.raises
+ (msg_in => 'drop ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ wt_assert.objnotexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_drop_db_object;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure create_db_link
+ (in_schema_name in varchar2
+ ,in_password in varchar2)
+is
+ connect_string varchar2(2000);
+begin
+ select '//' || 'localhost' ||
+ ':' || 1521 ||
+ '/' || global_name
+ into connect_string
+ from global_name;
+ execute immediate
+ 'create database link ' || in_schema_name ||
+ ' connect to ' || in_schema_name ||
+ ' identified by ' || in_password ||
+ ' using ''' || connect_string || '''';
+end create_db_link;
+
+
+------------------------------------------------------------
+procedure drop_db_link
+ (in_schema_name in varchar2)
+is
+begin
+ execute immediate
+ 'drop database link ' || in_schema_name;
+exception when OTHERS then
+ if SQLERRM != 'ORA-02024: database link not found'
+ then
+ ------%WTPLSQL_begin_ignore_lines%------
+ -- Can't Test This
+ raise;
+ -------%WTPLSQL_end_ignore_lines%-------
+ end if;
+end drop_db_link;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_create_drop_db_link
+ is
+ num_rows number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Create and Drop DB Link';
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links before testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 0);
+ wt_assert.raises (
+ msg_in => 'Create the Database Link',
+ check_call_in => 'begin wt_job.create_db_link(''' ||
+ g_current_user || ''',''' ||
+ upper(g_current_user) || '''); end;',
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links during testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 1);
+ select count(*)
+ into num_rows
+ from wt_self_test;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Rows from WT_SELF_TEST@' || g_current_user,
+ check_query_in => 'select count(*) from WT_SELF_TEST@' || g_current_user,
+ against_value_in => num_rows);
+ -------------------------------------- WTPLSQL Testing --
+ rollback;
+ wt_assert.raises (
+ msg_in => 'Close the Database Link',
+ check_call_in => 'alter session close database link ' ||
+ g_current_user,
+ against_exc_in => '');
+ wt_assert.raises (
+ msg_in => 'Drop the Database Link',
+ check_call_in => 'begin wt_job.drop_db_link(''' ||
+ g_current_user || '''); end;',
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.objnotexists (
+ msg_in => g_current_user || ' Database Link',
+ obj_owner_in => g_current_user,
+ obj_name_in => g_current_user,
+ obj_type_in => 'DATABASE LINK');
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links after testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Drop Nonexistent DB Link';
+ wt_assert.raises (
+ msg_in => 'Drop BOGUS Database Link',
+ check_call_in => 'begin wt_job.drop_db_link(''BOGUS''); end;',
+ against_exc_in => '');
+ end t_create_drop_db_link;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Waits for all test runners to complete
+procedure wait_for_all_tests
+ (in_timeout_seconds in number default 3600
+ ,in_check_interval_seconds in number default 60)
+is
+ num_jobs number := 0;
+ max_intervals pls_integer;
+begin
+ max_intervals := nvl(in_timeout_seconds,3600) /
+ nvl(in_check_interval_seconds,60);
+ for i in 1 .. max_intervals
+ loop
+ select count(*) into num_jobs
+ from user_scheduler_running_jobs;
+ exit when num_jobs = 0;
+ dbms_lock.sleep(in_check_interval_seconds);
+ end loop;
+ if num_jobs > 0
+ then
+ raise_application_error(-20000, 'WAIT_FOR_ALL_TESTS timeout, ' ||
+ num_jobs || ' jobs still running');
+ end if;
+end wait_for_all_tests;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_wait_for_all_tests
+ is
+ procedure launch_job (in_timeout in number) is
+ plsql_block varchar2(32000);
+ begin
+ plsql_block :=
+ 'declare' || CHR(10) ||
+ ' l_msg varchar2(2000);' || CHR(10) ||
+ ' l_stat integer;' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' dbms_alert.register' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || '''' || CHR(10) ||
+ ' ,cleanup => TRUE);' || CHR(10) ||
+ ' dbms_alert.waitone' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || '''' || CHR(10) ||
+ ' ,message => l_msg' || CHR(10) ||
+ ' ,status => l_stat' || CHR(10) ||
+ ' ,timeout => ' || in_timeout || ');' || CHR(10) ||
+ ' dbms_alert.remove' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || ''');' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => 'WT_JOB_WAIT_UT_' || in_timeout
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block
+ ,enabled => TRUE);
+ dbms_lock.sleep(1); -- Must give job a chance to startup
+ exception when others then
+ wt_assert.isnotnull (
+ msg_in => 't_wait_for_all_tests: "launch_job" Error',
+ check_this_in => SQLERRM);
+ end launch_job;
+ procedure stop_jobs is
+ begin
+ for buff in (select name from sys.DBMS_ALERT_INFO)
+ loop
+ dbms_alert.signal(name => buff.name
+ ,message => 'STOP');
+ end loop;
+ dbms_lock.sleep(1); -- Must give job a chance to process signal
+ dbms_alert.removeall; -- Not sure why this is necessary
+ for buff in (select job_name from user_scheduler_running_jobs)
+ loop
+ dbms_scheduler.stop_job(job_name => buff.job_name
+ ,force => TRUE
+ ,commit_semantics => 'STOP_ON_FIRST_ERROR');
+ end loop;
+ exception when others then
+ wt_assert.isnotnull (
+ msg_in => 't_wait_for_all_tests: "launch_job" Error',
+ check_this_in => SQLERRM);
+ end stop_jobs;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Wait for All Tests Happy Path';
+ launch_job(1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 1);
+ wt_assert.raises(msg_in => 'Wait for All Tests Expected Exception'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(in_timeout_seconds => 1' ||
+ ', in_check_interval_seconds => 0.5); end;'
+ ,against_exc_in => cast (NULL as number));
+ stop_jobs;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Wait for All Tests Timeout';
+ launch_job(10);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 1);
+ wt_assert.raises(msg_in => 'Wait for All Tests Expected Exception'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(in_timeout_seconds => 1' ||
+ ', in_check_interval_seconds => 0.5); end;'
+ ,against_exc_in => -20000);
+ stop_jobs;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 0);
+ end t_wait_for_all_tests;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run a test runner in a different schema
+-- Returns before the test runner is complete
+procedure test_run
+ (in_schema_name in varchar2
+ ,in_runner_name in varchar2)
+is
+ plsql_block varchar2(32000);
+begin
+ plsql_block :=
+ 'begin' || CHR(10) ||
+ ' wtplsql.test_run@' || in_schema_name ||
+ '(' || in_runner_name || ');' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => substr('WT_TEST_RUN$' || in_schema_name ||
+ '$' || in_runner_name
+ ,1,30)
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block
+ ,enabled => TRUE);
+end test_run;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_run_and_wait_for_job
+ is
+ num_rows number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Run and Wait for Job';
+ tl_compile_db_object ('PACKAGE', 'WT_RUN_AND_WAIT_TEST','
+ procedure wtplsql_run;
+ end WT_RUN_AND_WAIT_TEST;');
+ tl_compile_db_object ('PACKAGE BODY', 'WT_RUN_AND_WAIT_TEST','
+ procedure wtplsql_run is
+ begin
+ wt_assert.isnotnull (
+ msg_in => ''Test1'',
+ check_this_in => ''Test1'');
+ end wtplsql_run;
+ end WT_RUN_AND_WAIT_TEST;');
+ select count(*) into num_rows
+ from wt_test_runs_vw
+ where test_runner_owner = g_current_user
+ and test_runner_name = 'WT_RUN_AND_WAIT_TEST';
+ wt_assert.isnotnull (
+ msg_in => 'Number of Test Runs Before',
+ check_this_in => num_rows);
+ wt_assert.raises
+ (msg_in => 'wt_job.test_run'
+ ,check_call_in => 'begin wt_job.test_run(''' || g_current_user ||
+ ''', ''WT_RUN_AND_WAIT_TEST''); end;'
+ ,against_exc_in => '');
+
+ wt_assert.raises
+ (msg_in => 'wait_for_all_tests'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(2,0.5); end;'
+ ,against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from wt_test_runs_vw
+ where test_runner_id = wt_test_runner.get_id(''' ||
+ g_current_user ||
+ ''', ''WT_RUN_AND_WAIT_TEST'')',
+ against_value_in => num_rows);
+ tl_drop_db_object('PACKAGE', 'WT_RUN_AND_WAIT_TEST');
+ end t_run_and_wait_for_job;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in a different schema
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- OR or highly modified testing. Skipping Unit Test
+procedure test_all ------%WTPLSQL_begin_ignore_lines%------
+ (in_schema_name in varchar2)
+is
+ plsql_block varchar2(32000);
+begin
+ if in_schema_name is null
+ then
+ raise_application_error(-20000, 'in_schema_name must not be null');
+ end if;
+ plsql_block :=
+ 'begin' || CHR(10) ||
+ ' wtplsql.test_all@' || in_schema_name || ';' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => substr('WT_TEST_ALL$' || in_schema_name
+ ,1,128)
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block);
+end test_all; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in all schema in sequence
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- OR or highly modified testing. Skipping Unit Test
+procedure test_all_sequential ------%WTPLSQL_begin_ignore_lines%------
+is
+ plsql_block varchar2(32000);
+begin
+ plsql_block := 'begin' || CHR(10);
+ for buff in (
+ select owner
+ from wt_qual_test_runners_vw
+ group by owner)
+ loop
+ plsql_block := plsql_block ||
+ ' wtplsql.test_all@' || buff.owner || ';' || CHR(10);
+ end loop;
+ plsql_block := plsql_block ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => 'WT_TEST_ALL_SEQUENTIAL'
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block);
+end test_all_sequential; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all_sequential
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Sequential Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All Sequential',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all_sequential;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in all schema in parallel
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- or highly modified testing. Skipping Unit Test
+procedure test_all_parallel ------%WTPLSQL_begin_ignore_lines%------
+is
+begin
+ for buff in (
+ select owner
+ from wt_qual_test_runners_vw
+ group by owner)
+ loop
+ test_all(buff.owner);
+ end loop;
+end test_all_parallel; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all_parallel
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Parallel Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All Parallel',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all_parallel;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'WT_JOB:PACKAGE BODY';
+ select username into g_current_user from user_users;
+ -------------------------------------- WTPLSQL Testing --
+ t_create_drop_db_link;
+ t_wait_for_all_tests;
+ t_run_and_wait_for_job;
+ t_test_all;
+ t_test_all_sequential;
+ t_test_all_parallel;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_job;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/4E67ABAA-5705-70EF-C5BD-1EB1A0556FEB.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/4E67ABAA-5705-70EF-C5BD-1EB1A0556FEB.xml
new file mode 100644
index 0000000..b144607
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/4E67ABAA-5705-70EF-C5BD-1EB1A0556FEB.xml
@@ -0,0 +1,375 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_PERSIST_REPORT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_PERSIST_REPORT authid definer
+as
+
+ -- To report a Test Runner result details:
+ -- begin
+ -- wt_persist_report.dbms_out('RUNNER_OWNER', 'RUNNER', 30);
+ -- end;
+ -- /
+
+-- "in_detail_level" settings for DBMS_OUT procedure:
+-- * Less than 10 (including null) - No Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * 10 to 19 - Minimal Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * Failed assertion result details.
+-- * Profiled source lines that were "not executed".
+-- * 20 to 29 - Partial Full Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * All assertion result details.
+-- * Profiled source lines that were "not executed".
+-- * 30 or more - Full Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * All assertion result details.
+-- * All profiled source lines.
+
+ procedure dbms_out
+ (in_runner_owner in varchar2 default USER
+ ,in_runner_name in varchar2 default null
+ ,in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE);
+
+end wt_persist_report;
+
+wtp@DEVPDB_localhost
+WTP
+WT_PERSIST_REPORT
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_PERSIST_REPORT
+as
+
+ g_test_runs_rec wt_test_runs_vw%ROWTYPE;
+ g_dbout_runs_rec wt_dbout_runs_vw%ROWTYPE;
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+------------------------------------------------------------
+procedure p
+ (in_text in varchar2)
+is
+begin
+ dbms_output.put_line(in_text);
+end p;
+
+------------------------------------------------------------
+procedure summary_out
+is
+ asrt_cnt number;
+ asrt_fail number;
+ runner_sec number;
+ tc_cnt number;
+ tc_fail number;
+ tc_yield_pct number;
+ asrt_min_msec number;
+ asrt_max_msec number;
+ asrt_tot_msec number;
+ asrt_avg_msec number;
+ --
+ ignored_lines number;
+ profiled_lines number;
+ excluded_lines number;
+ executed_lines number;
+ notexec_lines number;
+ unknown_lines number;
+ coverage_pct number;
+ trigger_offset number;
+ exec_min_usec number;
+ exec_avg_usec number;
+ exec_max_usec number;
+begin
+ p('');
+ p(' wtPLSQL ' || wtplsql.show_version);
+ p(' Test Results for ' || g_test_runs_rec.test_runner_owner ||
+ '.' || g_test_runs_rec.test_runner_name );
+ p(' Run ID ' || g_test_runs_rec.test_run_id ||
+ ': ' || to_char(g_test_runs_rec.start_dtm
+ ,wt_core_report.g_date_format));
+ p(' --------------------------------------------------------------');
+ --
+ asrt_cnt := nvl(g_test_runs_rec.asrt_cnt ,0);
+ asrt_fail := nvl(g_test_runs_rec.asrt_fail ,0);
+ runner_sec := nvl(g_test_runs_rec.runner_sec ,0);
+ tc_cnt := nvl(g_test_runs_rec.tc_cnt ,0);
+ tc_fail := nvl(g_test_runs_rec.tc_fail ,0);
+ tc_yield_pct := nvl(g_test_runs_rec.tc_yield_pct ,0);
+ asrt_min_msec := nvl(g_test_runs_rec.asrt_min_msec,0);
+ asrt_max_msec := nvl(g_test_runs_rec.asrt_max_msec,0);
+ asrt_tot_msec := nvl(g_test_runs_rec.asrt_tot_msec,0);
+ asrt_avg_msec := nvl(g_test_runs_rec.asrt_avg_msec,0);
+ --
+ p(' Minimum Elapsed msec: ' || to_char(asrt_min_msec,'9999999') ||
+ ' Total Assertions: ' || to_char(asrt_cnt ,'9999999') );
+ p(' Average Elapsed msec: ' || to_char(asrt_avg_msec,'9999999') ||
+ ' Failed Assertions: ' || to_char(asrt_fail ,'9999999') );
+ p(' Maximum Elapsed msec: ' || to_char(asrt_max_msec,'9999999') ||
+ ' Total Testcases: ' || to_char(tc_cnt ,'9999999') );
+ p(' Total Run Time (sec): ' || to_char(runner_sec ,'99990.9') ||
+ ' Failed Testcases: ' || to_char(tc_fail ,'9999999') );
+ p(' ' || ' ' ||
+ ' Testcase Yield: ' || to_char(tc_yield_pct ,'9999999') || '%');
+ --
+ if g_dbout_runs_rec.dbout_name is not null
+ AND g_dbout_runs_rec.profiler_runid is null
+ then
+ p('');
+ p(' Note: ' || g_dbout_runs_rec.dbout_type || ' ' ||
+ g_dbout_runs_rec.dbout_owner || '.' ||
+ g_dbout_runs_rec.dbout_name || ' was not profiled.');
+ end if;
+ --
+ if g_test_runs_rec.error_message is not null
+ then
+ p('');
+ p(' *** Test Runner Error ***');
+ p(g_test_runs_rec.error_message);
+ end if;
+ ----------------------------------------
+ if g_dbout_runs_rec.profiler_runid is null
+ then
+ return;
+ end if;
+ p('');
+ p(' Code Coverage for ' || g_dbout_runs_rec.dbout_type ||
+ ' ' || g_dbout_runs_rec.dbout_owner ||
+ '.' || g_dbout_runs_rec.dbout_name );
+ p(' ----------------------------------------------------------------');
+ --
+ ignored_lines := nvl(g_dbout_runs_rec.ignored_lines, 0);
+ profiled_lines := nvl(g_dbout_runs_rec.profiled_lines, 0);
+ excluded_lines := nvl(g_dbout_runs_rec.excluded_lines, 0);
+ executed_lines := nvl(g_dbout_runs_rec.executed_lines, 0);
+ notexec_lines := nvl(g_dbout_runs_rec.notexec_lines, 0);
+ unknown_lines := nvl(g_dbout_runs_rec.unknown_lines, 0);
+ coverage_pct := nvl(g_dbout_runs_rec.coverage_pct, 0);
+ trigger_offset := nvl(g_dbout_runs_rec.trigger_offset, 0);
+ exec_min_usec := nvl(g_dbout_runs_rec.exec_min_usec, 0);
+ exec_avg_usec := nvl(g_dbout_runs_rec.exec_avg_usec, 0);
+ exec_max_usec := nvl(g_dbout_runs_rec.exec_max_usec, 0);
+ --
+ p(' Ignored Lines: ' || to_char(ignored_lines, '9999999') ||
+ ' Total Profiled Lines: ' || to_char(profiled_lines, '9999999') );
+ p(' Excluded Lines: ' || to_char(excluded_lines, '9999999') ||
+ ' Total Executed Lines: ' || to_char(executed_lines, '9999999') );
+ p(' Minimum LineExec usec: ' || to_char(exec_min_usec, '9999999') ||
+ ' Not Executed Lines: ' || to_char(notexec_lines, '9999999') );
+ p(' Average LineExec usec: ' || to_char(exec_avg_usec, '9999999') ||
+ ' Unknown Lines: ' || to_char(unknown_lines, '9999999') );
+ p(' Maximum LineExec usec: ' || to_char(exec_max_usec, '9999999') ||
+ ' Code Coverage: ' || to_char(coverage_pct, '99990.9') || '%');
+ p(' Trigger Source Offset: ' || to_char(trigger_offset, '9999999') ||
+ ' ' || ' ' );
+end summary_out;
+
+------------------------------------------------------------
+procedure results_out
+ (in_show_pass in boolean)
+is
+ l_rec core_data.results_rec_type;
+ l_show_pass_txt varchar2(1);
+ old_testcase core_data.long_name;
+ show_header boolean := TRUE;
+begin
+ if in_show_pass
+ then
+ l_show_pass_txt := 'Y';
+ else
+ l_show_pass_txt := 'N';
+ end if;
+ for buff in (
+ select * from wt_results_vw
+ where test_run_id = g_test_runs_rec.test_run_id
+ and ( l_show_pass_txt = 'Y'
+ or status != 'PASS')
+ order by result_seq )
+ loop
+ -- Load l_rec
+ l_rec.assertion := buff.assertion;
+ l_rec.pass := (buff.status = 'PASS');
+ l_rec.details := buff.details;
+ l_rec.testcase := buff.testcase;
+ l_rec.message := buff.message;
+ l_rec.interval_msec := buff.interval_msec;
+ -- Remove Consecutive Testcases
+ if l_rec.testcase = old_testcase
+ then
+ l_rec.testcase := '';
+ else
+ old_testcase := l_rec.testcase;
+ end if;
+ -- Display header if needed
+ if show_header
+ then
+ p('');
+ p(' ' || g_test_runs_rec.test_runner_owner ||
+ '.' || g_test_runs_rec.test_runner_name ||
+ ' Test Result Details' );
+ p(' Test Run ID: ' ||
+ g_test_runs_rec.test_run_id );
+ p(' --------------------------------------------------------------');
+ show_header := FALSE;
+ end if;
+ -- Display the result
+ p(wt_core_report.format_test_result(l_rec));
+ end loop;
+end results_out;
+
+------------------------------------------------------------
+procedure profile_out
+ (in_show_aux in boolean)
+is
+ l_header_txt CONSTANT varchar2(2000) :=
+ 'Source TotTime MinTime MaxTime ' || chr(10) ||
+ ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) ||
+ '------ ---- ------ --------- ------- --------- ------------';
+ l_show_aux_txt varchar2(1);
+ header_shown boolean;
+ procedure l_show_header is begin
+ p('');
+ p(' ' || g_dbout_runs_rec.dbout_owner ||
+ '.' || g_dbout_runs_rec.dbout_name ||
+ ' ' || g_dbout_runs_rec.dbout_type ||
+ ' Code Coverage Details' );
+ p(' Test Run ID: ' ||
+ g_test_runs_rec.test_run_id );
+ p(' ----------------------------------------------------------------');
+ end l_show_header;
+begin
+ if g_dbout_runs_rec.profiler_runid is null
+ then
+ return;
+ end if;
+ if in_show_aux
+ then
+ l_show_aux_txt := 'Y';
+ else
+ l_show_aux_txt := 'N';
+ end if;
+ header_shown := FALSE;
+ for buff in (
+ select line
+ ,status
+ ,exec_cnt
+ ,exec_tot_usec
+ ,exec_min_usec
+ ,exec_max_usec
+ ,text
+ ,rownum
+ from wt_profiles
+ where test_run_id = g_dbout_runs_rec.test_run_id
+ and ( l_show_aux_txt = 'Y'
+ or status not in ('EXEC','IGNR','UNKN','EXCL'))
+ order by line )
+ loop
+ if not header_shown
+ then
+ l_show_header;
+ p(l_header_txt);
+ header_shown := TRUE;
+ end if;
+ if mod(buff.rownum,25) = 0
+ then
+ p(l_header_txt);
+ end if;
+ p(to_char(buff.line,'99999') ||
+ case buff.status when 'NOTX' then '#NOTX#'
+ else ' ' || rpad(buff.status,4) || ' '
+ end ||
+ to_char(buff.exec_cnt,'99999') || ' ' ||
+ to_char(buff.exec_tot_usec,'99999999') || ' ' ||
+ to_char(buff.exec_min_usec,'999999') || ' ' ||
+ to_char(buff.exec_max_usec,'99999999') || ' ' ||
+ replace(buff.text,CHR(10),'') );
+ end loop;
+end profile_out;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure dbms_out
+ (in_runner_owner in varchar2 default USER
+ ,in_runner_name in varchar2 default null
+ ,in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE)
+is
+
+ g_dbout_runs_recNULL wt_dbout_runs_vw%ROWTYPE;
+
+begin
+
+ for buff in (
+ -- MAX(t2.start_dtm) is a fail-safe if IS_LAST_RUN is not set.
+ select * from wt_test_runs_vw
+ where ( test_runner_name, start_dtm) in
+ (select t2.test_runner_name, max(t2.start_dtm)
+ from wt_test_runs_vw t2
+ where ( ( in_runner_name is not null
+ and in_runner_name = t2.test_runner_name)
+ OR in_runner_name is null )
+ and t2.test_runner_owner = in_runner_owner
+ group by t2.test_runner_name )
+ order by start_dtm, test_runner_name )
+ loop
+
+ -- Load Test Run Record
+ g_test_runs_rec := buff;
+
+ -- Load the DBOUT Record
+ begin
+ select * into g_dbout_runs_rec
+ from wt_dbout_runs_vw
+ where test_run_id = buff.test_run_id;
+ exception when NO_DATA_FOUND
+ then
+ g_dbout_runs_rec := g_dbout_runs_recNULL;
+ end;
+
+ -- Setup Display Order
+ if in_summary_last
+ then
+ if in_detail_level >= 10
+ then
+ profile_out(in_detail_level >= 30);
+ results_out(in_detail_level >= 20);
+ end if;
+ summary_out;
+ else
+ summary_out;
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ profile_out(in_detail_level >= 30);
+ end if;
+ end if;
+
+ p('');
+
+ end loop;
+
+end dbms_out;
+
+
+end wt_persist_report;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/584DC665-5066-BA52-661B-86F3D5791A47.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/584DC665-5066-BA52-661B-86F3D5791A47.xml
new file mode 100644
index 0000000..896b7f3
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/584DC665-5066-BA52-661B-86F3D5791A47.xml
@@ -0,0 +1,1101 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUN
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_TEST_RUN
+ authid definer
+as
+
+ C_LAST_RUN_FLAG constant varchar2(1) := 'Y';
+
+ function get_last_run_flag
+ return varchar2 deterministic;
+
+ function set_last_run
+ (in_test_runner_id in number)
+ return number;
+ procedure set_last_run
+ (in_test_runner_id in number);
+
+ g_keep_num_recs number := 20;
+
+ procedure initialize;
+
+ procedure finalize1;
+
+ function finalize2
+ return number;
+ procedure finalize2;
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_test_run;
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUN
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_TEST_RUN
+as
+
+ g_test_runs_rec wt_test_runs%ROWTYPE;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING_1234ABCD';
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_test_runs
+ (in_test_run_id in NUMBER
+ ,in_runner_name in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into wt_test_runs' ||
+ ' (id, start_dtm, test_runner_id)' ||
+ ' values (' || in_test_run_id || ', sysdate, ' ||
+ wt_test_runner.dim_id(C_OWNER
+ ,C_NAME) || ')';
+ wt_assert.raises (
+ msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 1);
+ commit;
+ end tl_insert_test_runs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_test_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_test_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_test_runs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure set_g_test_runs_rec
+is
+ g_test_runs_recNULL wt_test_runs%ROWTYPE;
+begin
+ g_test_runs_rec := g_test_runs_recNULL;
+ g_test_runs_rec.id := wt_test_runs_seq.nextval;
+ g_test_runs_rec.test_runner_id := wt_test_runner.dim_id
+ (core_data.g_run_rec.test_runner_owner
+ ,core_data.g_run_rec.test_runner_name);
+ g_test_runs_rec.start_dtm := core_data.g_run_rec.start_dtm;
+ g_test_runs_rec.end_dtm := core_data.g_run_rec.end_dtm;
+ g_test_runs_rec.runner_sec := core_data.g_run_rec.runner_sec;
+ g_test_runs_rec.error_message := core_data.g_run_rec.error_message;
+ g_test_runs_rec.tc_cnt := core_data.g_run_rec.tc_cnt;
+ g_test_runs_rec.tc_fail := core_data.g_run_rec.tc_fail;
+ if g_test_runs_rec.tc_cnt != 0
+ then
+ g_test_runs_rec.tc_yield_pct := round( 100 *
+ ( g_test_runs_rec.tc_cnt -
+ g_test_runs_rec.tc_fail ) /
+ g_test_runs_rec.tc_cnt , 2);
+ end if;
+ g_test_runs_rec.asrt_fst_dtm := core_data.g_run_rec.asrt_fst_dtm;
+ g_test_runs_rec.asrt_lst_dtm := core_data.g_run_rec.asrt_lst_dtm;
+ g_test_runs_rec.asrt_cnt := core_data.g_run_rec.asrt_cnt;
+ g_test_runs_rec.asrt_fail := core_data.g_run_rec.asrt_fail;
+ g_test_runs_rec.asrt_min_msec := core_data.g_run_rec.asrt_min_msec;
+ g_test_runs_rec.asrt_max_msec := core_data.g_run_rec.asrt_max_msec;
+ g_test_runs_rec.asrt_tot_msec := core_data.g_run_rec.asrt_tot_msec;
+ g_test_runs_rec.dbout_id := wt_dbout.dim_id
+ (core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ if nvl(g_test_runs_rec.asrt_cnt,0) != 0
+ then
+ g_test_runs_rec.asrt_yield_pct := round(100 * ( g_test_runs_rec.asrt_cnt -
+ g_test_runs_rec.asrt_fail ) /
+ g_test_runs_rec.asrt_cnt , 2);
+ g_test_runs_rec.asrt_avg_msec := round(g_test_runs_rec.asrt_tot_msec /
+ g_test_runs_rec.asrt_cnt , 2);
+ end if;
+end set_g_test_runs_rec;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_g_test_runs_rec
+ is
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_tr_recSAVE wt_test_runs%ROWTYPE;
+ l_tr_recTEST wt_test_runs%ROWTYPE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Set g_test_run_rec Happy Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_tr_recSAVE := g_test_runs_rec;
+ -------------------------------------- WTPLSQL Testing --
+ core_data.g_run_rec.test_runner_owner := C_OWNER;
+ core_data.g_run_rec.test_runner_name := C_NAME;
+ core_data.g_run_rec.tc_cnt := 2;
+ core_data.g_run_rec.tc_fail := 1;
+ core_data.g_run_rec.dbout_owner := C_OWNER;
+ core_data.g_run_rec.dbout_name := C_NAME;
+ core_data.g_run_rec.dbout_type := 'TYPE';
+ core_data.g_run_rec.asrt_cnt := 10;
+ core_data.g_run_rec.asrt_fail := 5;
+ core_data.g_run_rec.asrt_tot_msec := 100;
+ -------------------------------------- WTPLSQL Testing --
+ set_g_test_runs_rec;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_tr_recTEST := g_test_runs_rec;
+ g_test_runs_rec := l_tr_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.id',
+ check_this_in => l_tr_recTEST.id);
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.test_runner_id',
+ check_this_in => l_tr_recTEST.test_runner_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.dbout_id',
+ check_this_in => l_tr_recTEST.dbout_id);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_cnt',
+ check_this_in => l_tr_recTEST.tc_cnt,
+ against_this_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_fail',
+ check_this_in => l_tr_recTEST.tc_fail,
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_cnt',
+ check_this_in => l_tr_recTEST.asrt_cnt,
+ against_this_in => 10);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_fail',
+ check_this_in => l_tr_recTEST.asrt_fail,
+ against_this_in => 5);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_tot_msec',
+ check_this_in => l_tr_recTEST.asrt_tot_msec,
+ against_this_in => 100);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_yield_pct',
+ check_this_in => l_tr_recTEST.tc_yield_pct,
+ against_this_in => 50);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_fail',
+ check_this_in => l_tr_recTEST.tc_fail,
+ against_this_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_yield_pct',
+ check_this_in => l_tr_recTEST.asrt_yield_pct,
+ against_this_in => 50);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_avg_msec',
+ check_this_in => l_tr_recTEST.asrt_avg_msec,
+ against_this_in => 10);
+ end t_set_g_test_runs_rec;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Use the CLEAR_LAST_RUN procedure to clear the LAST_RUN_FLAG
+-- flag before running this procedure.
+function clear_last_run
+ (in_test_runner_id in number)
+ return number
+as
+begin
+ update wt_test_runs
+ set is_last_run = NULL
+ where test_runner_id = in_test_runner_id
+ and is_last_run = C_LAST_RUN_FLAG;
+ return SQL%ROWCOUNT;
+end clear_last_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_clear_last_run
+ is
+ l_sql_txt varchar2(4000);
+ l_sqlerrm varchar2(32000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Clear Last Run Happy Path 1';
+ tl_insert_test_runs(-1, 'Clear Last Run Testing');
+ l_sql_txt := 'update wt_test_runs' ||
+ ' set is_last_run = ''' || C_LAST_RUN_FLAG ||
+ ''' where id = -1';
+ wt_assert.raises (
+ msg_in => 'Update wt_test_runs (-1)',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (-1) Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -1' ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME))',
+ check_this_in => clear_last_run(wt_test_runner.get_id(C_OWNER,C_NAME)),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME) Exception)',
+ check_this_in => SQLERRM);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME)) Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -1' ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ tl_delete_test_runs(-1);
+ end t_clear_last_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+------------------------------------------------------------
+procedure insert_test_run
+is
+ junk number;
+begin
+ if g_test_runs_rec.id is null
+ then
+ return;
+ end if;
+ junk := clear_last_run(in_test_runner_id => g_test_runs_rec.test_runner_id);
+ g_test_runs_rec.is_last_run := C_LAST_RUN_FLAG;
+ insert into wt_test_runs values g_test_runs_rec;
+ commit;
+end insert_test_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_insert_test_run
+ is
+ -------------------------------------- WTPLSQL Testing --
+ TYPE l_dbmsout_buff_type is table of varchar2(32767);
+ l_dbmsout_buff l_dbmsout_buff_type;
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ l_dbmsout_line varchar2(32767);
+ l_dbmsout_stat number;
+ l_num_recs number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1';
+ wt_assert.eqqueryvalue (
+ msg_in => 'Records Before Insert',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -2',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec := g_test_runs_rec;
+ g_test_runs_rec.id := -2;
+ g_test_runs_rec.test_runner_id := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ g_test_runs_rec.start_dtm := systimestamp;
+ insert_test_run;
+ g_test_runs_rec := l_test_runs_rec;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -2',
+ against_value_in => 1);
+ tl_delete_test_runs(-2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2';
+ select count(*) into l_num_recs from wt_test_runs;
+ l_test_runs_rec := g_test_runs_rec;
+ g_test_runs_rec.id := null;
+ insert_test_run;
+ g_test_runs_rec := l_test_runs_rec;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Before and After Record Count',
+ check_query_in => 'select count(*) from wt_test_runs',
+ against_value_in => l_num_recs);
+ end t_insert_test_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_runs
+ (in_test_runner_id in number)
+ return number
+is
+ num_recs number := 0;
+begin
+ for buff in (
+ with q1 as (select start_dtm, id from wt_test_runs
+ where test_runner_id = in_test_runner_id
+ order by start_dtm desc, id desc)
+ ,q2 as (select rownum rnum, start_dtm, id from q1)
+ select start_dtm, id from q2
+ where rnum > g_keep_num_recs)
+ loop
+ num_recs := num_recs + wt_profile.delete_run_id(buff.id);
+ num_recs := num_recs + wt_result.delete_run_id(buff.id);
+ num_recs := num_recs + delete_run_id(buff.id);
+ end loop;
+ return num_recs;
+end delete_runs;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_runs
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Setup';
+ -- DELETE_RECORDS has already run when we arrive here.
+ -- Cleanup from previous test
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1';
+ for i in 1 .. g_keep_num_recs + 1
+ loop
+ insert into wt_test_runs
+ (id, start_dtm, test_runner_id)
+ values
+ (0-i, sysdate-100-i, l_tr_id);
+ end loop;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Check Added ' || g_keep_num_recs || ' records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => g_keep_num_recs + 1);
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_runs(' || l_tr_id || ')',
+ check_this_in => delete_runs(l_tr_id),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_runs(' || l_tr_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Check number of records reduced',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => g_keep_num_recs);
+ delete from wt_test_runs
+ where id between 0-g_keep_num_recs and 0-1;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_runs(-9995)',
+ check_this_in => delete_runs(-9995),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_runs(-9995) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ end t_delete_runs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+-- Setting "g_test_runs_rec" to NULL is trivial.
+-- Other initializers already tested. NOT UNIT TESTING!
+procedure initialize
+is
+ l_test_runs_recNULL wt_test_runs%ROWTYPE;
+begin ------%WTPLSQL_begin_ignore_lines%------
+ g_test_runs_rec := l_test_runs_recNULL;
+ wt_result.initialize;
+ wt_profile.initialize; -- Clear, Check, and Set Profiler Runid
+end initialize; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Initialization Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Initialization',
+ check_this_in => 'Setting "g_test_runs_rec" to NULL is trivial. Other initializers already tested');
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Not Testing Finalization
+-- All components already tested
+procedure finalize1
+is
+ junk number;
+begin ------%WTPLSQL_begin_ignore_lines%------
+ set_g_test_runs_rec;
+ junk := delete_runs(g_test_runs_rec.test_runner_id);
+ insert_test_run; -- With COMMIT
+ wt_result.finalize(g_test_runs_rec.id); -- With COMMIT
+ wt_profile.finalize(g_test_runs_rec.id); -- With COMMIT
+end finalize1; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize1
+ is
+ -- To Unit Test, need to save/set/restore these variables/structures/tables
+ -- For set_g_test_runs_rec
+ -- -) core_data.g_run_rec;
+ -- -) g_test_runs_rec
+ -- For delete_runs: wt_test_runs Table
+ -- For insert_test_run: g_test_runs_rec
+ -- For wt_result.finalize
+ -- -) core_data.results_rec_type
+ -- -) core_data.g_results_nt
+ -- -) wt_results Table
+ -- -) wt_testcase_runs Table
+ -- -) wt_test_runs Table
+ -- For wt_profile.finalize
+ -- -) core_data.g_run_rec
+ -- -) wt_profile.g_rec
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalization1 Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Finalization1',
+ check_this_in => 'All components already tested');
+ end t_finalize1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function finalize2
+ return number
+is
+ ret_num number;
+begin
+ -- Update any additional errors
+ -- This will cause a chained row in WT_TEST_RUNS
+ update wt_test_runs
+ set error_message = g_test_runs_rec.error_message
+ where id = g_test_runs_rec.id
+ and ( ( error_message is null
+ and g_test_runs_rec.error_message is not null )
+ or (error_message != g_test_runs_rec.error_message) );
+ ret_num := SQL%ROWCOUNT;
+ commit;
+ return ret_num;
+end finalize2;
+
+procedure finalize2
+is
+ -- Procedure Overload for finalize2
+ junk number;
+begin
+ junk := finalize2;
+end finalize2;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize2
+ is
+ runner_id wt_test_runners.id%TYPE := -99;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalization2 Testing';
+ wt_assert.isnull (
+ msg_in => 'Confirm g_test_runs_rec.error_message NULL',
+ check_this_in => g_test_runs_rec.error_message);
+ wt_assert.isnull (
+ msg_in => 'Confirm g_test_runs_rec.id is NULL',
+ check_this_in => g_test_runs_rec.id);
+ g_test_runs_rec.id := -99;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into wt_test_runners (ID, OWNER, NAME)
+ values (runner_id, 'Finalization2 Testing', 'Finalization2 Testing');
+ wt_assert.eq (
+ msg_in => 'Setup WT_TEST_RUNNERS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Setup WT_TEST_RUNNERS Record for finalize2 Test Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into wt_test_runs (ID, TEST_RUNNER_ID, START_DTM)
+ values (g_test_runs_rec.id, runner_id, sysdate);
+ wt_assert.eq (
+ msg_in => 'Setup WT_TEST_RUNS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Setup WT_TEST_RUNS Record for finalize2 Test Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ g_test_runs_rec.error_message := 'This is Test Message 1 for Finalization2 Testing';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run finalize2',
+ check_this_in => finalize2,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run finalize2 Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Confirm wt_test_runs.error_message updated',
+ check_query_in => 'select error_message from wt_test_runs' ||
+ ' where id = ' || g_test_runs_rec.id,
+ against_value_in => g_test_runs_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ g_test_runs_rec.error_message := 'This is Test Message 2 for Finalization2 Testing';
+ wt_assert.raises (
+ msg_in => 'Run wt_test_runs.error_message to clear message',
+ check_call_in => 'begin wt_test_run.finalize2; end;',
+ against_exc_in => cast (NULL as number));
+ wt_assert.eqqueryvalue (
+ msg_in => 'Confirm wt_test_runs.error_message cleared',
+ check_query_in => 'select error_message from wt_test_runs' ||
+ ' where id = ' || g_test_runs_rec.id,
+ against_value_in => g_test_runs_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ delete from wt_test_runs where ID = g_test_runs_rec.id;
+ wt_assert.eq (
+ msg_in => 'Delete WT_TEST_RUNS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Delete WT_TEST_RUNS Record for finalize2 Test Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ delete from wt_test_runners where ID = runner_id;
+ wt_assert.eq (
+ msg_in => 'Delete WT_TEST_RUNNERS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Delete WT_TEST_RUNNERS Record for finalize2 Test Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ commit;
+ g_test_runs_rec.id := NULL;
+ end t_finalize2;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function get_last_run_flag
+ return varchar2
+is
+begin
+ return C_LAST_RUN_FLAG;
+end get_last_run_flag;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_last_run_flag
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Get Last Run Flag Testing';
+ wt_assert.eq (
+ msg_in => 'Test 01',
+ check_this_in => get_last_run_flag,
+ against_this_in => C_LAST_RUN_FLAG);
+ end t_get_last_run_flag;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Use the SET_LAST_RUN procedure to set the LAST_RUN flag
+-- after running this procedure.
+function set_last_run
+ (in_test_runner_id in number)
+ return number
+as
+ num_rows number;
+ num_clear number;
+begin
+ if in_test_runner_id is null
+ then
+ return 0;
+ end if;
+ select count(is_last_run)
+ into num_rows
+ from wt_test_runs
+ where test_runner_id = in_test_runner_id
+ and is_last_run = C_LAST_RUN_FLAG;
+ if num_rows = 1
+ then
+ -- Abort if a LAST_RUN_FLAG is already set
+ return -1;
+ end if;
+ if num_rows > 1
+ then
+ -- Clear out previous Flags
+ num_clear := clear_last_run(in_test_runner_id);
+ end if;
+ --Update the latest as the LAST_RUN
+ update wt_test_runs
+ set is_last_run = C_LAST_RUN_FLAG
+ where test_runner_id = in_test_runner_id
+ and start_dtm = (
+ select max(tr.start_dtm)
+ from wt_test_runs tr
+ where tr.test_runner_id = in_test_runner_id);
+ return SQL%ROWCOUNT;
+end set_last_run;
+
+------------------------------------------------------------
+-- Procedure Overload
+procedure set_last_run
+ (in_test_runner_id in number)
+as
+ junk number;
+begin
+ junk := set_last_run(in_test_runner_id);
+end set_last_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_last_run
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Setup';
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-11, l_tr_id, C_LAST_RUN_FLAG, sysdate);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-12, l_tr_id, C_LAST_RUN_FLAG, sysdate-1);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 2);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Sad Path: Too Many C_LAST_RUN_FLAG Set';
+ begin
+ wt_assert.eq (
+ msg_in => 'Too many C_LAST_RUN_FLAG is set for ' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => -1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Test Run ID of Last Run',
+ check_query_in => 'select id from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => -11);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Happy Path 1';
+ delete from wt_test_runs where id = -11;
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.raises (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_call_in => 'begin wt_test_run.set_last_run(' || l_tr_id || '); end;',
+ against_exc_in => cast(NULL as number));
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Test Run ID of Last Run',
+ check_query_in => 'select id from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => -12);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'C_LAST_RUN_FLAG is already set for ' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => -1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Happy Path 2';
+ delete from wt_test_runs where id = -12;
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(NULL)',
+ check_this_in => set_last_run(NULL),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(NULL) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(-99)',
+ check_this_in => set_last_run(-99),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(-99) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ end t_set_last_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ l_test_runner_id number;
+ ret_num number;
+begin
+ begin
+ select test_runner_id
+ into l_test_runner_id
+ from wt_test_runs
+ where id = in_test_run_id;
+ exception when NO_DATA_FOUND then
+ return 0;
+ end;
+ delete from wt_test_runs where id = in_test_run_id;
+ ret_num := SQL%ROWCOUNT;
+ set_last_run(l_test_runner_id);
+ return ret_num;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Setup';
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Happy Path 1';
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-9, l_tr_id, '', sysdate-3);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-10, l_tr_id, '', sysdate-2);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-11, l_tr_id, C_LAST_RUN_FLAG, sysdate-1);
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After Insert',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 3);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-11)',
+ check_this_in => delete_run_id(-11),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-11) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 2);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-10)',
+ check_this_in => delete_run_id(-10),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-10) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After 2nd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records, 2nd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-9)',
+ check_this_in => delete_run_id(-9),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-9) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After 3rd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Sad Path 1';
+ -- Should run without error
+ wt_assert.raises(
+ msg_in => 'Delete Run ID(-9995)',
+ check_call_in => 'declare junk number; begin junk := wt_test_run.delete_run_id(-9995); end;',
+ against_exc_in => '');
+ end t_delete_run_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Hooks are active during Unit Testing
+-- Unable to Unit Test this
+procedure insert_hooks
+is
+begin ------%WTPLSQL_begin_ignore_lines%------
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_run', 30, 'begin wt_test_run.initialize; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 30, 'begin wt_test_run.finalize1; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 70, 'begin wt_test_run.finalize2; end;');
+ commit;
+ hook.init;
+end insert_hooks; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Hooks are active during Unit Testing
+-- Unable to Unit Test this
+procedure delete_hooks
+is
+begin ------%WTPLSQL_begin_ignore_lines%------
+ delete from hooks where run_string like '% wt_test_run.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "wt_test_run" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TEST_RUN:PACKAGE BODY';
+ t_set_g_test_runs_rec;
+ t_clear_last_run;
+ t_insert_test_run;
+ t_delete_runs;
+ t_initialize;
+ t_finalize1;
+ t_finalize2;
+ t_get_last_run_flag;
+ t_set_last_run;
+ t_delete_run_id;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_test_run;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/678B0BFB-EF32-C534-B075-F0B5F2416CA1.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/678B0BFB-EF32-C534-B075-F0B5F2416CA1.xml
new file mode 100644
index 0000000..286b4f6
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/678B0BFB-EF32-C534-B075-F0B5F2416CA1.xml
@@ -0,0 +1,336 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_CORE_REPORT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_CORE_REPORT
+ authid definer
+as
+
+ -- To report the latest Test Runner results:
+ -- begin
+ -- wt_core_report.dbms_out(30, TRUE);
+ -- end;
+ -- /
+
+ -- Turn this off to allow output across multiple lines of text
+ g_single_line_output boolean := TRUE;
+
+ -- DATE data type format for Report Header
+ g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
+
+ -- True While Processing a TEST_ALL
+ g_in_process boolean := FALSE;
+ TYPE vc_aa_type is table of varchar2(4000) index by pls_integer;
+ vc_aa vc_aa_type;
+
+ procedure dbms_out
+ (in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE);
+ -- "in_detail_level" settings for DBMS_OUT procedure:
+ -- * Less than 10 (including null) - No Detail
+ -- * Assertion results summary.
+ -- * 10 to 19 - Minimal Detail
+ -- * Assertion results summary.
+ -- * Failed assertion result details.
+ -- * 20 or more - Full Detail
+ -- * Assertion results summary.
+ -- * All assertion result details.
+
+ procedure before_test_all;
+ procedure after_test_all;
+
+ function format_test_result
+ (in_rec in core_data.results_rec_type)
+ return varchar2;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+end wt_core_report;
+
+wtp@DEVPDB_localhost
+WTP
+WT_CORE_REPORT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_CORE_REPORT
+as
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+------------------------------------------------------------
+procedure p
+ (in_text in varchar2)
+is
+begin
+ if g_in_process
+ then
+ vc_aa(vc_aa.COUNT + 1) := in_text;
+ else
+ dbms_output.put_line(in_text);
+ end if;
+end p;
+
+------------------------------------------------------------
+procedure summary_out
+is
+ asrt_cnt number;
+ asrt_fail number;
+ run_sec number;
+ tc_cnt number;
+ tc_fail number;
+ tc_yield number;
+ min_msec number;
+ max_msec number;
+ tot_msec number;
+ avg_msec number;
+begin
+ p('');
+ --
+ p(' wtPLSQL ' || wtplsql.show_version);
+ p(' Start Date/Time: ' ||
+ to_char(core_data.g_run_rec.start_dtm, g_date_format));
+ p(' Test Results for ' || core_data.g_run_rec.test_runner_owner ||
+ '.' || core_data.g_run_rec.test_runner_name );
+ ----------------------------------------
+ if core_data.g_run_rec.dbout_name is not null
+ then
+ p(' Database Object Under Test is ' || core_data.g_run_rec.dbout_type ||
+ ' ' || core_data.g_run_rec.dbout_owner ||
+ '.' || core_data.g_run_rec.dbout_name );
+ end if;
+ p(' ------------------------------------------------------------------');
+ --
+ asrt_cnt := nvl(core_data.g_run_rec.asrt_cnt ,0);
+ asrt_fail := nvl(core_data.g_run_rec.asrt_fail ,0);
+ run_sec := nvl(core_data.g_run_rec.runner_sec ,0);
+ tc_cnt := nvl(core_data.g_run_rec.tc_cnt ,0);
+ tc_fail := nvl(core_data.g_run_rec.tc_fail ,0);
+ min_msec := nvl(core_data.g_run_rec.asrt_min_msec,0);
+ max_msec := nvl(core_data.g_run_rec.asrt_max_msec,0);
+ tot_msec := nvl(core_data.g_run_rec.asrt_tot_msec,0);
+ case nvl(asrt_cnt,0)
+ when 0 then avg_msec := 0;
+ else avg_msec := nvl(tot_msec/asrt_cnt,0);
+ end case;
+ case nvl(tc_cnt,0)
+ when 0 then tc_yield := 0;
+ else tc_yield := nvl(100*(1-(tc_fail/tc_cnt)),0);
+ end case;
+ --
+ p(' Minimum Elapsed msec: ' || to_char(min_msec ,'999999999') ||
+ ' Total Assertions: ' || to_char(asrt_cnt ,'999999999') );
+ p(' Average Elapsed msec: ' || to_char(avg_msec ,'999999999') ||
+ ' Failed Assertions: ' || to_char(asrt_fail,'999999999') );
+ p(' Maximum Elapsed msec: ' || to_char(max_msec ,'999999999') ||
+ ' Total Testcases: ' || to_char(tc_cnt ,'999999999') );
+ p(' Total Run Time (sec): ' || to_char(run_sec ,'9999990.9') ||
+ ' Failed Testcases: ' || to_char(tc_fail ,'999999999') );
+ p(' ' || ' ' ||
+ ' Testcase Yield: ' || to_char(tc_yield ,'999999999') || '%');
+ --
+ if core_data.g_run_rec.error_message is not null
+ then
+ p('');
+ p(' *** Test Runner Error ***');
+ p(core_data.g_run_rec.error_message);
+ end if;
+ --
+end summary_out;
+
+------------------------------------------------------------
+procedure results_out
+ (in_show_pass in boolean)
+is
+ l_rec core_data.results_rec_type;
+ old_testcase core_data.long_name;
+ show_header boolean := TRUE;
+begin
+ -- Check Test Results Array
+ if NOT core_data.g_results_nt.EXISTS(1)
+ then
+ p(' * NOTE: No Data in Test Results Array "core_data.g_results_nt"');
+ return;
+ end if;
+ -- Loop through all results
+ for i in 1 .. core_data.g_results_nt.COUNT
+ loop
+ -- Determine if this should be displayed
+ if core_data.g_results_nt.EXISTS(i)
+ AND ( in_show_pass
+ OR NOT core_data.g_results_nt(i).pass)
+ then
+ l_rec := core_data.g_results_nt(i);
+ -- Remove Consecutive Testcases
+ if l_rec.testcase = old_testcase
+ then
+ l_rec.testcase := '';
+ else
+ old_testcase := l_rec.testcase;
+ end if;
+ -- Display header if needed
+ if show_header
+ then
+ p('');
+ p(' ' || core_data.g_run_rec.test_runner_owner ||
+ '.' || core_data.g_run_rec.test_runner_name ||
+ ' Test Runner Details' );
+ p(' --------------------------------------------------------------');
+ show_header := FALSE;
+ end if;
+ -- Display the result
+ p(format_test_result(l_rec));
+ end if;
+ end loop;
+ --
+end results_out;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure dbms_out
+ (in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE)
+is
+begin
+ -- Setup Display Order
+ if in_summary_last
+ then
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ end if;
+ summary_out;
+ else
+ summary_out;
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ end if;
+ end if;
+ p('');
+end dbms_out;
+
+
+------------------------------------------------------------
+procedure before_test_all
+is
+begin
+ vc_aa.DELETE;
+ g_in_process := TRUE;
+end before_test_all;
+
+
+------------------------------------------------------------
+procedure after_test_all
+is
+begin
+ for i in 1 .. vc_aa.COUNT
+ loop
+ dbms_output.put_line(vc_aa(i));
+ end loop;
+ g_in_process := FALSE;
+end after_test_all;
+
+
+------------------------------------------------------------
+function format_test_result
+ (in_rec in core_data.results_rec_type)
+ return varchar2
+is
+ l_out_str varchar2(32000) := '';
+begin
+ if in_rec.testcase is not null
+ then
+ l_out_str := rpad('---*** ' || in_rec.testcase ||
+ ' ***---'
+ ,80,'-') || CHR(10);
+ end if;
+ if in_rec.pass
+ then
+ l_out_str := l_out_str || ' PASS ';
+ else
+ l_out_str := l_out_str || '#FAIL#';
+ end if;
+ if in_rec.interval_msec is not null
+ then
+ l_out_str := l_out_str || lpad(in_rec.interval_msec,4) || 'ms ';
+ end if;
+ if in_rec.message is not null
+ then
+ l_out_str := l_out_str || in_rec.message || '. ';
+ end if;
+ l_out_str := l_out_str || in_rec.assertion || ' - ';
+ if g_single_line_output
+ then
+ l_out_str := l_out_str || replace(replace(in_rec.details
+ ,CHR(13),'\r')
+ ,CHR(10),'\n');
+ else
+ l_out_str := l_out_str || in_rec.details;
+ end if;
+ return l_out_str;
+end format_test_result;
+
+
+------------------------------------------------------------
+procedure insert_hooks
+is
+begin
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_all', 20, 'begin wt_core_report.before_test_all; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 20, 'begin wt_core_report.dbms_out(in_detail_level => 10); end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_all', 20, 'begin wt_core_report.after_test_all; end;');
+ commit;
+ hook.init;
+end insert_hooks;
+
+
+------------------------------------------------------------
+procedure delete_hooks
+is
+begin
+ delete from hooks where run_string like '% wt_core_report.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "wt_core_report" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks;
+
+
+end wt_core_report;
+
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_CORE_REPORT
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_CORE_REPORT
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+678B0BFB-EF32-C534-B075-F0B5F2416CA1
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/6BF93178-7AA9-E959-B170-BBAC0E3D6E98.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/6BF93178-7AA9-E959-B170-BBAC0E3D6E98.xml
new file mode 100644
index 0000000..8915828
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/6BF93178-7AA9-E959-B170-BBAC0E3D6E98.xml
@@ -0,0 +1,377 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_RESULT
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_RESULT
+ authid definer
+as
+
+ procedure initialize;
+
+ procedure finalize
+ (in_test_run_id in number);
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_result;
+
+wtp@DEVPDB_localhost
+WTP
+WT_RESULT
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_RESULT
+as
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure initialize
+is
+begin
+ return;
+end initialize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Initialize Happy Path';
+ wt_assert.raises (
+ msg_in => 'Empty Execution, nothing to do',
+ check_call_in => 'begin wt_result.initialize; end;',
+ against_exc_in => '');
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Because this procedure is called to cleanup after errors,
+-- it must be able to run multiple times without causing damage.
+procedure finalize
+ (in_test_run_id in number)
+is
+ l_results_rec wt_results%ROWTYPE;
+ l_results_recNULL wt_results%ROWTYPE;
+ l_testcase_runs_recNULL wt_testcase_runs%ROWTYPE;
+ l_testcase_runs_rec wt_testcase_runs%ROWTYPE;
+ testcase core_data.long_name;
+begin
+ if in_test_run_id IS NULL
+ then
+ return;
+ end if;
+ for i in 1 .. core_data.g_results_nt.COUNT
+ loop
+ l_results_rec := l_results_recNULL;
+ l_results_rec.TEST_RUN_ID := in_test_run_id;
+ l_results_rec.RESULT_SEQ := i;
+ l_results_rec.TESTCASE_ID := wt_testcase.dim_id
+ (core_data.g_results_nt(i).TESTCASE);
+ l_results_rec.EXECUTED_DTM := core_data.g_results_nt(i).EXECUTED_DTM;
+ l_results_rec.INTERVAL_MSEC := core_data.g_results_nt(i).INTERVAL_MSEC;
+ l_results_rec.ASSERTION := core_data.g_results_nt(i).ASSERTION;
+ if core_data.g_results_nt(i).PASS
+ then
+ l_results_rec.STATUS := 'PASS';
+ else
+ l_results_rec.STATUS := 'FAIL';
+ end if;
+ l_results_rec.MESSAGE := core_data.g_results_nt(i).MESSAGE;
+ l_results_rec.DETAILS := core_data.g_results_nt(i).DETAILS;
+ insert into wt_results values l_results_rec;
+ end loop;
+ commit;
+ -- Testcases
+ if core_data.g_tcases_aa.COUNT > 0
+ then
+ testcase := core_data.g_tcases_aa.FIRST;
+ loop
+ l_testcase_runs_rec := l_testcase_runs_recNULL;
+ l_testcase_runs_rec.test_run_id := in_test_run_id;
+ l_testcase_runs_rec.testcase_id := wt_testcase.dim_id(testcase);
+ l_testcase_runs_rec.asrt_cnt := core_data.g_tcases_aa(testcase).asrt_cnt;
+ l_testcase_runs_rec.asrt_fail := core_data.g_tcases_aa(testcase).asrt_fail;
+ l_testcase_runs_rec.asrt_min_msec := core_data.g_tcases_aa(testcase).asrt_min_msec;
+ l_testcase_runs_rec.asrt_max_msec := core_data.g_tcases_aa(testcase).asrt_max_msec;
+ l_testcase_runs_rec.asrt_tot_msec := core_data.g_tcases_aa(testcase).asrt_tot_msec;
+ --
+ l_testcase_runs_rec.asrt_pass := l_testcase_runs_rec.asrt_cnt -
+ l_testcase_runs_rec.asrt_fail;
+ if l_testcase_runs_rec.asrt_cnt > 0 then
+ l_testcase_runs_rec.asrt_yield_pct := l_testcase_runs_rec.asrt_pass /
+ l_testcase_runs_rec.asrt_cnt;
+ l_testcase_runs_rec.asrt_avg_msec := l_testcase_runs_rec.asrt_tot_msec /
+ l_testcase_runs_rec.asrt_cnt;
+ end if;
+ --
+ insert into wt_testcase_runs values l_testcase_runs_rec;
+ exit when testcase = core_data.g_tcases_aa.LAST;
+ testcase := core_data.g_tcases_aa.NEXT(testcase);
+ end loop;
+ commit;
+ end if;
+end finalize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize
+ is
+ -------------------------------------- WTPLSQL Testing --
+ type num_recs_aa_type is table of number index by varchar2(50);
+ num_recs_aa num_recs_aa_type;
+ del_res_aa num_recs_aa_type;
+ del_tc_aa num_recs_aa_type;
+ l_results_ntSAVE core_data.results_nt_type;
+ l_results_ntTEST core_data.results_nt_type;
+ l_results_rec1 core_data.results_rec_type;
+ l_results_rec2 core_data.results_rec_type;
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ -------------------------------------- WTPLSQL Testing --
+ procedure run_test (in_test_run_id in number
+ ,in_test_name in varchar2) is
+ begin
+ finalize(in_test_run_id);
+ select count(*)
+ into num_recs_aa(in_test_name)
+ from wt_results
+ where test_run_id = in_test_run_id;
+ -------------------------------------- WTPLSQL Testing --
+ delete from wt_results where test_run_id = in_test_run_id;
+ del_res_aa(in_test_name) := SQL%ROWCOUNT;
+ delete from wt_testcase_runs where test_run_id = in_test_run_id;
+ del_tc_aa(in_test_name) := SQL%ROWCOUNT;
+ end run_test;
+ begin
+ wt_assert.g_testcase := 'Finalize Happy Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec1.testcase := 'TESTCASE TEST';
+ l_results_rec1.executed_dtm := systimestamp;
+ l_results_rec1.interval_msec := 99;
+ l_results_rec1.assertion := 'FINALTEST';
+ l_results_rec1.pass := TRUE;
+ l_results_rec1.details := 'This is a Passing WT_RESULT.FINALIZE Test';
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec2.testcase := 'TESTCASE TEST';
+ l_results_rec2.executed_dtm := systimestamp;
+ l_results_rec2.interval_msec := 99;
+ l_results_rec2.assertion := 'FINALTEST';
+ l_results_rec2.pass := FALSE;
+ l_results_rec2.details := 'This is a Failing WT_RESULT.FINALIZE Test';
+ -------------------------------------- WTPLSQL Testing --
+ delete from wt_results where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Test Results',
+ check_this_in => SQL%ROWCOUNT);
+ delete from wt_testcase_runs where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Testcase Runs',
+ check_this_in => SQL%ROWCOUNT);
+ delete from wt_test_runs where id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Test Runs',
+ check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ -- Setup the FK Record
+ l_test_runs_rec.id := -99;
+ l_test_runs_rec.start_dtm := sysdate;
+ l_test_runs_rec.test_runner_id := wt_test_runner.dim_id('WT_RESULT_TEST','WT_RESULT_TEST');
+ insert into wt_test_runs values l_test_runs_rec;
+ wt_assert.eq (
+ msg_in => 'Create Test Results Run',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- Capture Original Values
+ l_results_ntSAVE := core_data.g_results_nt;
+ select count(*)
+ into num_recs_aa('Initial Record Count')
+ from wt_results
+ where test_run_id = -99;
+ -------------------------------------- WTPLSQL Testing --
+ -- No Assertion Testing in Here
+ core_data.g_results_nt := core_data.results_nt_type(l_results_rec1, l_results_rec2);
+ run_test(-99, 'Record Count Test');
+ core_data.g_results_nt := core_data.results_nt_type(NULL);
+ run_test(-99, 'NULL Record Count');
+ core_data.g_results_nt := core_data.results_nt_type(l_results_rec1);
+ run_test(NULL, 'NULL Test Run ID Test');
+ -------------------------------------- WTPLSQL Testing --
+ -- Restore values so we can test
+ core_data.g_results_nt := l_results_ntSAVE;
+ wt_assert.eq (
+ msg_in => 'Initial Record Count',
+ check_this_in => num_recs_aa('Initial Record Count'),
+ against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Record Count Test',
+ check_this_in => num_recs_aa('Record Count Test'),
+ against_this_in => 2);
+ wt_assert.eq (
+ msg_in => 'Delete Record Count Test Results',
+ check_this_in => del_res_aa('Record Count Test'),
+ against_this_in => 2);
+ wt_assert.isnotnull (
+ msg_in => 'Delete Record Count Test Testcase Runs',
+ check_this_in => del_tc_aa('Record Count Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'NULL Record Count',
+ check_this_in => num_recs_aa('NULL Record Count'),
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'Delete NULL Record Count Results',
+ check_this_in => del_res_aa('NULL Record Count'),
+ against_this_in => 1);
+ wt_assert.isnotnull (
+ msg_in => 'Delete NULL Record Count Testcase Runs',
+ check_this_in => del_tc_aa('NULL Record Count'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'NULL Test Run ID Test',
+ check_this_in => num_recs_aa('NULL Test Run ID Test'),
+ against_this_in => 0);
+ wt_assert.eq (
+ msg_in => 'Delete NULL Record Count Results',
+ check_this_in => del_res_aa('NULL Test Run ID Test'),
+ against_this_in => 0);
+ wt_assert.isnotnull (
+ msg_in => 'Delete NULL Record Count Testcase Runs',
+ check_this_in => del_tc_aa('NULL Test Run ID Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.raises (
+ msg_in => 'Clear Test Results Run',
+ check_call_in => 'delete from wt_test_runs where id = -99',
+ against_exc_in => '');
+ commit;
+ end t_finalize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ ret_num number;
+begin
+ delete from wt_testcase_runs where test_run_id = in_test_run_id;
+ ret_num := SQL%ROWCOUNT;
+ delete from wt_results where test_run_id = in_test_run_id;
+ ret_num := ret_num + SQL%ROWCOUNT;
+ return ret_num;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ l_results_rec wt_results%ROWTYPE;
+ l_num_recs number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Happy Path';
+ select count(*) into l_num_recs
+ from wt_results
+ where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Before Insert Count',
+ check_this_in => l_num_recs);
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec.id := -99;
+ l_test_runs_rec.start_dtm := sysdate;
+ l_test_runs_rec.test_runner_id := wt_test_runner.dim_id('WT_RESULT_TEST','WT_RESULT_TEST');
+ insert into wt_test_runs values l_test_runs_rec;
+ l_results_rec.test_run_id := -99;
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec.result_seq := 1;
+ l_results_rec.executed_dtm := sysdate;
+ l_results_rec.interval_msec := 99;
+ l_results_rec.assertion := 'DELRECTEST';
+ l_results_rec.status := 'PASS';
+ l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test';
+ insert into wt_results values l_results_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'After Insert Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs + 1);
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-99)',
+ check_this_in => delete_run_id(-99),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-99) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'After Test Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs);
+ rollback;
+ wt_assert.eqqueryvalue (
+ msg_in => 'After ROLLBACK Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs);
+ end t_delete_run_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_RESULT:PACKAGE BODY';
+ t_initialize;
+ t_finalize;
+ t_delete_run_id;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_result;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/79927809-19FF-B070-129B-34DF9FBACA9E.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/79927809-19FF-B070-129B-34DF9FBACA9E.xml
new file mode 100644
index 0000000..1491635
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/79927809-19FF-B070-129B-34DF9FBACA9E.xml
@@ -0,0 +1,775 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+CORE_DATA
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.CORE_DATA
+ authid definer
+is
+
+ SUBTYPE long_name is varchar2(128);
+
+ TYPE run_rec_type is record
+ (test_runner_owner long_name -- Owner of the Test Runner
+ ,test_runner_name long_name -- Name of the Test Runner
+ ,start_dtm timestamp(3) with local time zone -- Test Runner Start Date/Time
+ ,end_dtm timestamp(3) with local time zone -- Test Runner End Date/Time
+ ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds
+ ,error_message varchar2(4000) -- Error Message
+ ,tc_cnt number(7) default 0 -- Number of Test Cases
+ ,tc_fail number(7) default 0 -- Number of Failed Test Cases
+ ,asrt_fst_dtm timestamp(3) with local time zone -- Date/Time of First Assertion
+ ,asrt_lst_dtm timestamp(3) with local time zone -- Date/Time of Last Assertion
+ ,asrt_cnt number(7) default 0 -- Number of Assertions across all Test Cases
+ ,asrt_fail number(7) default 0 -- Number of Assertion Failures across all Test Cases
+ ,asrt_min_msec number(10,3) -- Minumum Assertion Interval in Milliseconds across all Test Cases
+ ,asrt_max_msec number(10,3) -- Maximum Assertion Interval in Milliseconds across all Test Cases
+ ,asrt_tot_msec number(10,3) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases
+ ,dbout_owner long_name -- Owner of the Database Object Under Test
+ ,dbout_name long_name -- Name of the Database Object Under Test
+ ,dbout_type varchar2(20) -- Type of the Database Object Under Test
+ );
+ g_run_rec run_rec_type;
+
+ TYPE tcases_rec_type is record
+ (asrt_cnt number(7) default 0 -- Number of Assertions in this Test Case
+ ,asrt_fail number(7) default 0 -- Number of Failed Assertsion in this Test Case
+ ,asrt_min_msec number(10,3) -- Minumum Assertion Interval in Milliseconds in this Test Cases
+ ,asrt_max_msec number(10,3) -- Maximum Assertion Interval in Milliseconds in this Test Cases
+ ,asrt_tot_msec number(10,3) default 0 -- Total Assertion Interval in Milliseconds in this Test Cases
+ );
+ TYPE tcases_aa_type is table of tcases_rec_type index by long_name;
+ g_tcases_aa tcases_aa_type;
+
+ TYPE results_rec_type is record
+ (testcase long_name -- Test Case Name of the Assertion
+ ,executed_dtm timestamp(6) with local time zone -- Execution Date/Time of the Assertion
+ ,interval_msec number(10,3) default 0 -- Interval from Previous Assertion in Milliseconds
+ ,assertion varchar2(15) -- Name of the Assertion
+ ,pass boolean -- Did the Assertion Pass? (TRUE/FALSE)
+ ,message varchar2(200) -- Identification Message of the Assertion
+ ,details varchar2(4000) -- Test Details of the Assertion
+ );
+ TYPE results_nt_type is table of results_rec_type;
+ g_results_nt results_nt_type;
+
+ procedure init1
+ (in_package_name in varchar2);
+
+ procedure init2;
+
+ procedure add
+ (in_testcase in varchar2
+ ,in_assertion in varchar2
+ ,in_pass in boolean
+ ,in_details in varchar2
+ ,in_message in varchar2);
+
+ procedure final1;
+
+ procedure run_error
+ (in_error_message in varchar2);
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end core_data;
+
+wtp@DEVPDB_localhost
+WTP
+CORE_DATA
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.CORE_DATA
+is
+
+ g_first_executed_dtm timestamp(6) with local time zone;
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+function get_testcase
+ return long_name
+is
+begin
+ return nvl(wt_assert.g_testcase
+ ,substr(core_data.g_run_rec.test_runner_owner || '.' ||
+ core_data.g_run_rec.test_runner_name, 1, 128));
+end get_testcase;
+
+------------------------------------------------------------
+procedure init1
+ (in_package_name in varchar2)
+is
+ l_run_recNULL run_rec_type;
+ l_testcase long_name;
+begin
+ -- Initialize Test Run Record
+ g_run_rec := l_run_recNULL;
+ g_run_rec.start_dtm := systimestamp;
+ g_run_rec.test_runner_name := in_package_name;
+ -- These don't always work:
+ -- g_run_rec.test_runner_owner := USER;
+ -- g_run_rec.test_runner_owner := sys_context('userenv', 'current_schema');
+ select username into g_run_rec.test_runner_owner from user_users;
+ -- Initialize Test Cases Array
+ l_testcase := g_tcases_aa.LAST;
+ while l_testcase is not null
+ loop
+ g_tcases_aa.DELETE(l_testcase);
+ l_testcase := g_tcases_aa.PRIOR(l_testcase);
+ end loop;
+ -- Initialize Test Results Array
+ g_results_nt := null;
+end init1;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_init1
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INIT "One" Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ g_tcases_aa('INIT Happy 1 Test 1') := NULL;
+ g_tcases_aa('INIT Happy 1 Test 2') := NULL;
+ init1 ('WTPLSQL');
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.test_runner_owner'
+ ,check_this_in => l_run_recTEST.test_runner_owner
+ ,against_this_in => USER);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.test_runner_name'
+ ,check_this_in => l_run_recTEST.test_runner_name
+ ,against_this_in => 'WTPLSQL');
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.start_dtm'
+ ,check_this_in => l_run_recTEST.start_dtm);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm'
+ ,check_this_in => l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm);
+ wt_assert.isnull
+ (msg_in => 'l_run_recTEST.end_dtm'
+ ,check_this_in => l_run_recTEST.end_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.tc_cnt'
+ ,check_this_in => l_run_recTEST.tc_cnt
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.tc_fail'
+ ,check_this_in => l_run_recTEST.tc_fail
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_tot_msec'
+ ,check_this_in => l_run_recTEST.asrt_tot_msec
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'l_tcases_aaTEST.FIRST'
+ ,check_this_in => l_tcases_aaTEST.FIRST);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST is null'
+ ,check_this_in => (l_results_ntTEST is NULL) );
+ end t_init1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure init2
+is
+begin
+ g_first_executed_dtm := systimestamp;
+end init2;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_init2
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ lt PLS_INTEGER;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INIT "Two" Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ -- lt points to the NULL record in g_results_nt
+ lt := g_results_nt.COUNT;
+ g_results_nt(lt).executed_dtm := null;
+ init2;
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(1).executed_dtm'
+ ,check_this_in => l_results_ntTEST(1).executed_dtm);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm'
+ ,check_this_in => l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm);
+ end t_init2;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure add
+ (in_testcase in varchar2
+ ,in_assertion in varchar2
+ ,in_pass in boolean
+ ,in_details in varchar2
+ ,in_message in varchar2)
+is
+ l_results_rec results_rec_type;
+ l_results_recNULL results_rec_type;
+ l_tcases_rec tcases_rec_type;
+ l_current_tstamp timestamp(6) with local time zone := systimestamp;
+ l_interval_buff interval day(9) to second(6);
+begin
+ ------------------------------------------------------------
+ -- Set and Update "l_results_rec"
+ if g_results_nt is null
+ then
+ l_results_rec := l_results_recNULL;
+ else
+ l_results_rec := g_results_nt(g_results_nt.COUNT);
+ end if;
+ l_results_rec.testcase := nvl(in_testcase
+ ,substr(g_run_rec.test_runner_owner || '.' ||
+ g_run_rec.test_runner_name, 1, 128));
+ l_results_rec.assertion := in_assertion;
+ l_results_rec.pass := nvl(in_pass,FALSE);
+ l_results_rec.details := in_details;
+ l_results_rec.message := in_message;
+ l_interval_buff := l_current_tstamp -
+ nvl(l_results_rec.executed_dtm
+ ,g_first_executed_dtm);
+ l_results_rec.interval_msec := 1000*( extract(second from l_interval_buff) +
+ 60*( extract(minute from l_interval_buff) +
+ 60*( extract(hour from l_interval_buff) +
+ 24*extract(day from l_interval_buff)
+ ) ) );
+ l_results_rec.executed_dtm := l_current_tstamp;
+ ------------------------------------------------------------
+ -- Add New Element
+ if g_results_nt is null
+ then
+ -- Initialize the "g_results_nt" Array
+ g_results_nt := results_nt_type(l_results_rec);
+ else
+ -- Add New Element to "g_results_nt" Array
+ g_results_nt.extend;
+ g_results_nt(g_results_nt.COUNT) := l_results_rec;
+ end if;
+ -----------------------------------------------
+ -- Update "g_run_rec" based on "l_results_rec"
+ g_run_rec.asrt_cnt := g_run_rec.asrt_cnt + 1;
+ if NOT l_results_rec.pass
+ then
+ g_run_rec.asrt_fail := g_run_rec.asrt_fail + 1;
+ end if;
+ g_run_rec.asrt_tot_msec := g_run_rec.asrt_tot_msec +
+ l_results_rec.interval_msec;
+ if l_results_rec.interval_msec < nvl(g_run_rec.asrt_min_msec,9999999)
+ then
+ g_run_rec.asrt_min_msec := l_results_rec.interval_msec;
+ end if;
+ if l_results_rec.interval_msec > nvl(g_run_rec.asrt_max_msec,-1)
+ then
+ g_run_rec.asrt_max_msec := l_results_rec.interval_msec;
+ end if;
+ -----------------------------------------------------------------------
+ -- Set "l_tcases_rec" and update the appropriate "g_tcases_aa" element
+ --
+ if g_tcases_aa.EXISTS(l_results_rec.testcase)
+ then
+ l_tcases_rec := g_tcases_aa(l_results_rec.testcase);
+ end if;
+ l_tcases_rec.asrt_cnt := l_tcases_rec.asrt_cnt + 1;
+ if NOT l_results_rec.pass
+ then
+ l_tcases_rec.asrt_fail := l_tcases_rec.asrt_fail + 1;
+ end if;
+ l_tcases_rec.asrt_tot_msec := l_tcases_rec.asrt_tot_msec +
+ l_results_rec.interval_msec;
+ if l_results_rec.interval_msec < nvl(l_tcases_rec.asrt_min_msec,9999999)
+ then
+ l_tcases_rec.asrt_min_msec := l_results_rec.interval_msec;
+ end if;
+ if l_results_rec.interval_msec > nvl(l_tcases_rec.asrt_max_msec,-1)
+ then
+ l_tcases_rec.asrt_max_msec := l_results_rec.interval_msec;
+ end if;
+ g_tcases_aa(l_results_rec.testcase) := l_tcases_rec;
+ --
+end add;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_add
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ lt PLS_INTEGER;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Add Procedure Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ add(in_testcase => 'The Testcase'
+ ,in_assertion => 'The Assert'
+ ,in_pass => TRUE
+ ,in_details => 'The Details'
+ ,in_message => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ lt := l_results_ntTEST.COUNT;
+ wt_assert.isnotnull
+ (msg_in => 'The last element in l_resultsTEST_nt'
+ ,check_this_in => lt);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_results_nt Testing
+ -----------------------
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST.COUNT = ' ||
+ 'l_results_ntSAVE.COUNT + 1'
+ ,check_this_in => l_results_ntTEST.COUNT
+ ,against_this_in => l_results_ntSAVE.COUNT + 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(lt).interval_msec'
+ ,check_this_in => l_results_ntTEST(lt).interval_msec);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(lt).interval_msec >= 0'
+ ,check_this_in => l_results_ntTEST(lt).interval_msec >= 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(lt).executed_dtm'
+ ,check_this_in => l_results_ntTEST(lt).executed_dtm);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(lt).executed_dtm >= ' ||
+ 'l_results_ntTEST(lt-1).executed_dtm'
+ ,check_this_in => l_results_ntTEST(lt).executed_dtm >=
+ l_results_ntTEST(lt-1).executed_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).testcase'
+ ,check_this_in => l_results_ntTEST(lt).testcase
+ ,against_this_in => 'The Testcase');
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).assertion'
+ ,check_this_in => l_results_ntTEST(lt).assertion
+ ,against_this_in => 'The Assert');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).pass'
+ ,check_this_in => l_results_ntTEST(lt).pass
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).details'
+ ,check_this_in => l_results_ntTEST(lt).details
+ ,against_this_in => 'The Details');
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).message'
+ ,check_this_in => l_results_ntTEST(lt).message
+ ,against_this_in => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ -- l_run_rec Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_tot_msec = ' ||
+ 'l_run_recSAVE.asrt_tot_msec + ' ||
+ 'l_results_ntTEST(lt).interval_msec'
+ ,check_this_in => l_run_recTEST.asrt_tot_msec
+ ,against_this_in => l_run_recSAVE.asrt_tot_msec +
+ l_results_ntTEST(lt).interval_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_min_msec'
+ ,check_this_in => l_run_recTEST.asrt_min_msec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.asrt_min_msec <= ' ||
+ 'l_run_recSAVE.asrt_min_msec'
+ ,check_this_in => l_run_recTEST.asrt_min_msec <=
+ l_run_recSAVE.asrt_min_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_max_msec'
+ ,check_this_in => l_run_recTEST.asrt_max_msec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.asrt_max_msec >= ' ||
+ 'l_run_recSAVE.asrt_max_msec'
+ ,check_this_in => l_run_recTEST.asrt_max_msec >=
+ l_run_recSAVE.asrt_max_msec);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_tcases_aa Testing
+ ----------------------
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_cnt
+ ,against_this_in => 1);
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail);
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_tot_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_tot_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_min_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_min_msec);
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_max_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_max_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Add Procedure Happy Path 2';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ add(in_testcase => 'The Testcase'
+ ,in_assertion => 'The Assert'
+ ,in_pass => FALSE
+ ,in_details => 'The Details'
+ ,in_message => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ lt := l_results_ntTEST.COUNT;
+ wt_assert.isnotnull
+ (msg_in => 'The last element in l_resultsTEST_nt'
+ ,check_this_in => lt);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_results_nt Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail + 1'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail + 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_run_rec Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail + 1'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail + 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_tcases_aa Testing
+ ----------------------
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_cnt
+ ,against_this_in => 1);
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail
+ ,against_this_in => 1);
+ end t_add;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure final1
+is
+ l_testcase long_name;
+ l_interval_buff interval day(9) to second(6);
+begin
+ -- Update Test Case Data
+ g_run_rec.tc_cnt := g_tcases_aa.COUNT;
+ g_run_rec.tc_fail := 0;
+ if g_tcases_aa.COUNT > 0
+ then
+ l_testcase := g_tcases_aa.FIRST;
+ loop
+ if g_tcases_aa(l_testcase).asrt_fail > 0
+ then
+ g_run_rec.tc_fail := g_run_rec.tc_fail + 1;
+ end if;
+ exit when l_testcase = g_tcases_aa.LAST;
+ l_testcase := g_tcases_aa.NEXT(l_testcase);
+ end loop;
+ end if;
+ --
+ if g_results_nt.EXISTS(1)
+ then
+ g_run_rec.asrt_fst_dtm := g_results_nt(1).executed_dtm;
+ g_run_rec.asrt_lst_dtm := g_results_nt(g_results_nt.COUNT).executed_dtm;
+ end if;
+ -- Update Test Run Data
+ g_run_rec.end_dtm := systimestamp;
+ l_interval_buff := g_run_rec.end_dtm - g_run_rec.start_dtm;
+ g_run_rec.runner_sec := (extract(second from l_interval_buff) +
+ 60 * ( extract(minute from l_interval_buff) +
+ 60 * ( extract(hour from l_interval_buff) +
+ 24 * ( extract(day from l_interval_buff)
+ ) ) ) );
+end final1;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_final1
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'FINAL "One" Happy Path';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ g_tcases_aa('TC1').asrt_fail := 2;
+ final1;
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ -- Update Test Case Data
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.tc_cnt'
+ ,check_this_in => l_run_recTEST.tc_cnt);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.tc_cnt > 0'
+ ,check_this_in => l_run_recTEST.tc_cnt > 0);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.tc_fail'
+ ,check_this_in => l_run_recTEST.tc_fail);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.tc_fail >= 0'
+ ,check_this_in => l_run_recTEST.tc_fail >= 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.asrt_fst_dtm'
+ ,check_this_in => l_run_recSAVE.asrt_fst_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_fst_dtm'
+ ,check_this_in => l_run_recTEST.asrt_fst_dtm);
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.asrt_lst_dtm'
+ ,check_this_in => l_run_recSAVE.asrt_lst_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_lst_dtm'
+ ,check_this_in => l_run_recTEST.asrt_lst_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ -- Update Test Run Data
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.end_dtm'
+ ,check_this_in => l_run_recSAVE.end_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.end_dtm'
+ ,check_this_in => l_run_recTEST.end_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec);
+ end t_final1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure run_error
+ (in_error_message in varchar2)
+is
+begin
+ if g_run_rec.error_message is null
+ then
+ g_run_rec.error_message := substr(in_error_message,1,4000);
+ else
+ g_run_rec.error_message := substr(g_run_rec.error_message || CHR(10) ||
+ in_error_message,1,4000);
+ end if;
+end run_error;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_run_error
+ is
+ l_run_recSAVE run_rec_type;
+ l_run_recTEST run_rec_type;
+ test_message varchar2(32767);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('Simlple Message');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Simlple Message');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 2';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('Message 1');
+ run_error('Message 2');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Message 1' || CHR(10) || 'Message 2');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 3';
+ for i in 1 .. 399
+ loop
+ test_message := test_message || '1234567890';
+ end loop;
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error(test_message);
+ run_error('Longer than 10 characters.');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.isnotnull
+ (msg_in => 'substr(l_run_recTEST.error_message,3000)'
+ ,check_this_in => substr(l_run_recTEST.error_message,3000));
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.error_message like ''%Longer th'''
+ ,check_this_in => l_run_recTEST.error_message like '%Longer th');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 4';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('');
+ run_error('Message');
+ run_error('');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Message' || CHR(10));
+ end t_run_error;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'CORE_DATA:PACKAGE BODY';
+ -------------------------------------- WTPLSQL Testing --
+ t_init1;
+ t_init2;
+ t_add;
+ t_final1;
+ --t_final2;
+ t_run_error;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end core_data;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/822BA676-C543-90A8-87A9-325B2468DD0A.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/822BA676-C543-90A8-87A9-325B2468DD0A.xml
new file mode 100644
index 0000000..e6edaf5
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/822BA676-C543-90A8-87A9-325B2468DD0A.xml
@@ -0,0 +1,440 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNNER
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_TEST_RUNNER
+ authid definer
+as
+
+ -- Return a Test Runner Surrogate Key.
+ -- Return NULL if the Test Runner does not exist.
+ function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number;
+
+ -- Return a Test Runner Surrogate Key.
+ -- Add the Test Runner if it does not exist.
+ function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number;
+
+ -- Delete all records for a test runner
+ function delete_records
+ (in_test_runner_id in number)
+ return number;
+
+ -- Delete all records with no child records
+ function cleanup_records
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_test_runner;
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNNER
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_TEST_RUNNER
+as
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id
+ from wt_test_runners
+ where owner = in_owner
+ and name = in_name;
+ return l_id;
+exception when NO_DATA_FOUND
+then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_OWNER, C_NAME));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_test_runners (id, owner, name)
+ values (wt_test_runners_seq.nextval, C_OWNER, C_NAME)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_OWNER, C_NAME)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number
+is
+ pragma AUTONOMOUS_TRANSACTION;
+ rec wt_test_runners%ROWTYPE;
+begin
+ if in_owner is NULL
+ OR in_name is NULL
+ then
+ return NULL;
+ end if;
+ rec.id := get_id (in_owner, in_name);
+ if rec.id is null
+ then
+ rec.id := wt_test_runners_seq.nextval;
+ rec.owner := in_owner;
+ rec.name := in_name;
+ insert into wt_test_runners values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_OWNER, C_NAME);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_OWNER, C_NAME)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL, NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Delete all records for a test runner
+function delete_records
+ (in_test_runner_id in number)
+ return number
+is
+ ret_num number := 0;
+begin
+ for buff in (
+ select id from wt_test_runs
+ where test_runner_id = in_test_runner_id )
+ loop
+ ret_num := ret_num + wt_profile.delete_run_id(buff.id);
+ ret_num := ret_num + wt_result.delete_run_id(buff.id);
+ ret_num := ret_num + wt_test_run.delete_run_id(buff.id);
+ end loop;
+ delete from wt_test_runners where id = in_test_runner_id;
+ ret_num := ret_num + SQL%ROWCOUNT;
+ return ret_num;
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ l_runner_id number := -99;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of wt_test_runners Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ delete from wt_test_runs
+ where id = l_runner_id
+ and test_runner_id = l_runner_id;
+ wt_assert.isnotnull
+ (msg_in => 'Number of wt_test_runs Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runners (id, owner, name)
+ values (l_runner_id, C_OWNER, C_NAME);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of wt_test_runners Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runs (id, test_runner_id, start_dtm)
+ values (l_runner_id, l_runner_id, sysdate);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of wt_test_runs Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || l_runner_id ||
+ ' and test_runner_id = ' || l_runner_id
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(' || l_runner_id || ')',
+ check_this_in => delete_records(l_runner_id),
+ against_this_in => 2);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(' || l_runner_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(' || l_runner_id || ') Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(NULL)',
+ check_this_in => delete_records(NULL),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(NULL) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(NULL) Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 3';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(-9999)',
+ check_this_in => delete_records(-9999),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(-9999) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(-9999) Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function cleanup_records
+ return number
+is
+begin
+ delete from wt_test_runners
+ where id in (
+ select id from wt_test_runners
+ MINUS
+ select distinct test_runner_id ID from wt_test_runs);
+ return SQL%ROWCOUNT;
+end cleanup_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_cleanup_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runners (id, owner, name)
+ values (wt_test_runners_seq.nextval, C_OWNER, C_NAME);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Happy Path 1';
+ begin
+ wt_assert.isnotnull (
+ msg_in => 'Run cleanup_records 1',
+ check_this_in => cleanup_records);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run cleanup_records 1 Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Happy Path 2';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run cleanup_records 2',
+ check_this_in => cleanup_records,
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run cleanup_records 2 Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_cleanup_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TEST_RUNNER:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ t_cleanup_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_test_runner;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/8A8CB50C-C6B4-CD40-C3D6-9D3C8669988D.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/8A8CB50C-C6B4-CD40-C3D6-9D3C8669988D.xml
new file mode 100644
index 0000000..01bb89d
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/8A8CB50C-C6B4-CD40-C3D6-9D3C8669988D.xml
@@ -0,0 +1,280 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+JUNIT_CORE_REPORT
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.JUNIT_CORE_REPORT
+ authid definer
+as
+
+ g_in_process boolean := FALSE;
+
+ TYPE vc_aa_type is table of varchar2(4000) index by pls_integer;
+ vc_aa vc_aa_type;
+
+ procedure xml_header;
+
+ procedure xml_body;
+
+ procedure xml_trailer;
+
+ procedure before_test_all;
+
+ procedure show_current;
+
+ procedure after_test_all;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+end junit_core_report;
+
+wtp@DEVPDB_localhost
+WTP
+JUNIT_CORE_REPORT
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.JUNIT_CORE_REPORT
+as
+
+
+----------------------
+-- PRivate Procedures
+----------------------
+
+
+------------------------------------------------------------
+-- Print to DBMS_OUTPUT
+procedure p
+ (in_line in varchar2)
+is
+begin
+ if g_in_process
+ then
+ vc_aa(vc_aa.COUNT + 1) := in_line;
+ else
+ dbms_output.put_line(in_line);
+ end if;
+end p;
+
+
+------------------------------------------------------------
+-- XML Escape
+function xe
+ (in_txt in varchar2)
+ return varchar2
+is
+begin
+ return replace
+ (replace
+ (replace
+ (replace
+ (replace
+ (in_txt
+ ,'<','&lt;') -- Less Than
+ ,'>','&gt;') -- Greater Than
+ ,'&','&') -- Ampersand
+ ,'''',''') -- Apostrophe
+ ,'"','&quot;'); -- Quotation Mark
+end xe;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure xml_header
+is
+begin
+ p('<?xml version="1.0" encoding="UTF-8"?>');
+ p('<!-- https://stackoverflow.com/questions/4922867/what-is-the-junit-xml-format-specification-that-hudson-supports -->');
+ p('<!-- http://nelsonwells.net/2012/09/how-jenkins-ci-parses-and-displays-junit-output -->');
+ p('<!-- Jenkins identifies the failed tests as {package}.{class}.{testcase}. -->');
+ p('<testsuites>');
+end xml_header;
+
+
+------------------------------------------------------------
+procedure xml_body
+is
+ l_rec core_data.results_rec_type;
+ l_testcase core_data.long_name;
+ l_classname varchar2(4000);
+ single_line_save boolean;
+begin
+ single_line_save := wt_core_report.g_single_line_output;
+ wt_core_report.g_single_line_output := TRUE;
+ if core_data.g_run_rec.dbout_name is not null
+ then
+ l_classname := xe(core_data.g_run_rec.dbout_owner) ||
+ '.' || xe(core_data.g_run_rec.dbout_name) ||
+ ':' || xe(replace(core_data.g_run_rec.dbout_type,' ','_'));
+ end if;
+ if core_data.g_tcases_aa.COUNT > 0
+ then
+ ---------------------
+ -- Test Suite Header
+ p(' <testsuite name="' || xe(core_data.g_run_rec.test_runner_owner) ||
+ '.' || xe(core_data.g_run_rec.test_runner_name) ||
+ '" classname="' || l_classname ||
+ '" tests="' || core_data.g_run_rec.tc_cnt ||
+ '" failures="' || core_data.g_run_rec.tc_fail ||
+ '" time="' || core_data.g_run_rec.runner_sec ||
+ '" timestamp="' || to_char(core_data.g_run_rec.start_dtm,'YYYY-MM-DD"T"HH24:MI:SS') ||
+ '">' );
+ l_testcase := core_data.g_tcases_aa.FIRST;
+ loop
+ --------------------
+ -- Test Case Header
+ p(' <testcase name="' || xe(l_testcase) ||
+ '" classname="' || l_classname ||
+ '" time="' || core_data.g_tcases_aa(l_testcase).asrt_tot_msec ||
+ '">' );
+ if core_data.g_tcases_aa(l_testcase).asrt_fail > 0
+ or ( core_data.g_run_rec.error_message is not null
+ and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase)
+ then
+ -----------------------
+ -- Short Error Message
+ if core_data.g_run_rec.error_message is not null
+ and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase
+ then
+ p(' <error message="' || xe(replace
+ (replace
+ (substr(core_data.g_run_rec.error_message
+ ,1,60)
+ ,CHR(10),' ')
+ ,CHR(13),'')) ||
+ '">' );
+ else
+ p(' <error message="' || core_data.g_tcases_aa(l_testcase).asrt_fail ||
+ ' assertion failures.">' );
+ end if;
+ p(' <![CDATA[');
+ ---------------------
+ -- Print all results
+ for i in 1 .. core_data.g_results_nt.COUNT
+ loop
+ if core_data.g_results_nt(i).testcase = l_testcase
+ then
+ l_rec := core_data.g_results_nt(i);
+ l_rec.testcase := '';
+ p(wt_core_report.format_test_result(l_rec));
+ end if;
+ end loop;
+ ----------------------
+ -- Long Error Message
+ if core_data.g_run_rec.error_message is not null
+ and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase
+ then
+ p(' ----');
+ p(core_data.g_run_rec.error_message);
+ end if;
+ ----------------------
+ p(' ]]>');
+ p(' </error>');
+ -----------------------
+ end if;
+ p(' </testcase>');
+ --------------------
+ exit when l_testcase = core_data.g_tcases_aa.LAST;
+ l_testcase := core_data.g_tcases_aa.NEXT(l_testcase);
+ end loop;
+ p(' </testsuite>');
+ ---------------------
+ end if;
+ wt_core_report.g_single_line_output := single_line_save;
+end xml_body;
+
+
+------------------------------------------------------------
+procedure xml_trailer
+is
+begin
+ p('</testsuites>');
+end xml_trailer;
+
+
+------------------------------------------------------------
+-- This can be used as an
+procedure show_current
+is
+begin
+ --
+ if not g_in_process
+ then
+ xml_header;
+ end if;
+ --
+ xml_body;
+ --
+ if not g_in_process
+ then
+ xml_trailer;
+ end if;
+ --
+end show_current;
+
+
+------------------------------------------------------------
+procedure before_test_all
+is
+begin
+ vc_aa.DELETE;
+ g_in_process := TRUE;
+ xml_header;
+end before_test_all;
+
+
+------------------------------------------------------------
+procedure after_test_all
+is
+begin
+ xml_trailer;
+ for i in 1 .. vc_aa.COUNT
+ loop
+ dbms_output.put_line(vc_aa(i));
+ end loop;
+ g_in_process := FALSE;
+end after_test_all;
+
+
+------------------------------------------------------------
+procedure insert_hooks
+is
+begin
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_all', 20, 'begin junit_core_report.before_test_all; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 20, 'begin junit_core_report.show_current; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_all', 20, 'begin junit_core_report.after_test_all; end;');
+ commit;
+ hook.init;
+end insert_hooks;
+
+
+------------------------------------------------------------
+procedure delete_hooks
+is
+begin
+ delete from hooks where run_string like '% junit_core_report.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "junit_core_report" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks;
+
+
+end junit_core_report;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/AFAA168D-2B04-671A-C28D-06C54ECE5A52.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/AFAA168D-2B04-671A-C28D-06C54ECE5A52.xml
new file mode 100644
index 0000000..cc5730f
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/AFAA168D-2B04-671A-C28D-06C54ECE5A52.xml
@@ -0,0 +1,2105 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_PROFILE
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_PROFILE
+ authid definer
+as
+
+ g_rec wt_dbout_runs%ROWTYPE;
+
+ function is_profilable
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+ return boolean;
+
+ function trigger_offset
+ (dbout_owner_in in varchar2
+ ,dbout_name_in in varchar2
+ ,dbout_type_in in varchar2)
+ return number;
+
+ function calc_pct_coverage
+ (in_test_run_id in number)
+ return number;
+
+ procedure initialize;
+
+ procedure finalize
+ (in_test_run_id in number);
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_profile;
+
+wtp@DEVPDB_localhost
+WTP
+WT_PROFILE
+duane
+2024-04-10 19:09:30 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_PROFILE
+as
+
+ TYPE ignr_aa_type is table
+ of varchar2(1)
+ index by PLS_INTEGER;
+
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ g_current_user varchar2(30);
+ wtplsql_skip_test boolean := FALSE;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+
+ procedure tl_compile_db_object
+ (in_ptype in varchar2
+ ,in_pname in varchar2
+ ,in_source in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ l_errtxt varchar2(32000) := '';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ -- Wrap in_source to complete the DDL statement
+ l_sql_txt := 'create or replace ' ||
+ in_ptype || ' ' ||
+ in_pname || ' is' || CHR(10) ||
+ in_source || ';' ;
+ wt_assert.raises
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ for buff in (select * from user_errors
+ where attribute = 'ERROR'
+ and name = in_pname
+ and type = in_ptype
+ order by sequence)
+ loop
+ l_errtxt := l_errtxt || buff.line || ', ' ||
+ buff.position || ': ' || buff.text || CHR(10);
+ end loop;
+ wt_assert.isnull
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname ||
+ ' Error'
+ ,check_this_in => l_errtxt);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.objexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_compile_db_object;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_drop_db_object
+ (in_pname in varchar2,
+ in_ptype in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
+ wt_assert.raises
+ (msg_in => 'drop ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ wt_assert.objnotexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_drop_db_object;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_count_plsql_profiler_recs
+ (in_test_run_id in number
+ ,in_expected_count in number)
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of plsql_profiler_runs (' || in_test_run_id || ')'
+ ,check_query_in => 'select count(*) from plsql_profiler_runs' ||
+ ' where runid = ' || in_test_run_id
+ ,against_value_in => in_expected_count);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of plsql_profiler_units (' || in_test_run_id || ')'
+ ,check_query_in => 'select count(*) from plsql_profiler_units' ||
+ ' where runid = ' || in_test_run_id
+ ,against_value_in => in_expected_count);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of plsql_profiler_data (' || in_test_run_id || ')'
+ ,check_query_in => 'select count(*) from plsql_profiler_data' ||
+ ' where runid = ' || in_test_run_id
+ ,against_value_in => in_expected_count);
+ end tl_count_plsql_profiler_recs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_plsql_profiler_recs
+ (in_test_run_id in number
+ ,in_run_date_offset in number default 0)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into plsql_profiler_runs (runid, run_date)' ||
+ ' values (' || in_test_run_id ||
+ ', sysdate + ' || in_run_date_offset || ')';
+ wt_assert.raises (
+ msg_in => 'insert plsql_profiler_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' ||
+ ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
+ wt_assert.raises (
+ msg_in => 'insert plsql_profiler_units (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' ||
+ ' values (' || in_test_run_id || ', ' || in_test_run_id || ', 0)';
+ wt_assert.raises (
+ msg_in => 'insert plsql_profiler_data (RUNID: ' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ commit;
+ end tl_insert_plsql_profiler_recs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_plsql_profiler_recs
+ (in_test_run_id in number)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from plsql_profiler_data' ||
+ ' where runid = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'delete plsql_profiler_data (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_data rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from plsql_profiler_units' ||
+ ' where runid = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'delete plsql_profiler_units (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_units rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from plsql_profiler_runs' ||
+ ' where runid = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'delete plsql_profiler_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ commit;
+ end tl_delete_plsql_profiler_recs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_test_runs
+ (in_test_run_id in NUMBER
+ ,in_runner_name in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into wt_test_runs' ||
+ ' (id, start_dtm, test_runner_id)' ||
+ ' values (' || in_test_run_id || ', sysdate, ' ||
+ wt_test_runner.dim_id(g_current_user
+ ,in_runner_name) || ')';
+ wt_assert.raises (
+ msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 1);
+ commit;
+ end tl_insert_test_runs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_test_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_test_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_test_runs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_wt_profiles
+ (in_rec in wt_profiles%ROWTYPE)
+ is
+ l_sqlerrm varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into wt_profiles values in_rec;
+ l_sqlerrm := SQLERRM;
+ commit;
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Insert wt_profiles (' || in_rec.test_run_id ||
+ ',' || in_rec.line || ')',
+ check_this_in => l_sqlerrm,
+ against_this_in => 'ORA-0000: normal, successful completion');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles (' || in_rec.test_run_id ||
+ ',' || in_rec.line || ') Count',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || in_rec.test_run_id ||
+ ' and line = ' || in_rec.line,
+ against_value_in => 1);
+ end tl_insert_wt_profiles;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_wt_profiles
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_profiles where test_run_id = ' ||
+ in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_profiles (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_profiles rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_wt_profiles;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_dbout_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into wt_dbout_runs' ||
+ ' (test_run_id, profiler_runid)' ||
+ ' values (' || in_test_run_id ||
+ ', ' || in_test_run_id || ')';
+ wt_assert.raises (
+ msg_in => 'Insert wt_dbout_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_dbout_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_dbout_runs' ||
+ ' where test_run_id = ' || in_test_run_id,
+ against_value_in => 1);
+ commit;
+ end tl_insert_dbout_runs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_dbout_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_dbout_runs where test_run_id = ' ||
+ in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_dbout_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_dbout_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_dbout_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_dbout_runs' ||
+ ' where test_run_id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_dbout_runs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+------------------------------------------------------------
+-- Return DBMS_PROFILER specific error messages
+function get_error_msg
+ (retnum_in in binary_integer)
+ return varchar2
+is
+ l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: ';
+begin
+ case retnum_in
+ when dbms_profiler.error_param then return l_msg_prefix ||
+ 'A subprogram was called with an incorrect parameter.';
+ when dbms_profiler.error_io then return l_msg_prefix ||
+ 'Data flush operation failed.' ||
+ ' Check whether the profiler tables have been created,' ||
+ ' are accessible, and that there is adequate space.';
+ when dbms_profiler.error_version then return l_msg_prefix ||
+ 'There is a mismatch between package and database implementation.' ||
+ ' Oracle returns this error if an incorrect version of the' ||
+ ' DBMS_PROFILER package is installed, and if the version of the' ||
+ ' profiler package cannot work with this database version.';
+ else return l_msg_prefix ||
+ 'Unknown error number ' || retnum_in;
+ end case;
+end get_error_msg;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_error_msg
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Get Error Messages';
+ wt_assert.isnotnull (
+ msg_in => 'ERROR_PARAM Test 1',
+ check_this_in => get_error_msg(dbms_profiler.error_param));
+ wt_assert.this (
+ msg_in => 'ERROR_PARAM Test 2',
+ check_this_in => regexp_like(get_error_msg(dbms_profiler.error_param)
+ ,'incorrect parameter','i'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'ERROR_IO Test 1',
+ check_this_in => get_error_msg(dbms_profiler.error_io));
+ wt_assert.this (
+ msg_in => 'ERROR_IO Test 2',
+ check_this_in => regexp_like(get_error_msg(dbms_profiler.error_io)
+ ,'Data flush operation','i'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'ERROR_VERSION Test 1',
+ check_this_in => get_error_msg(dbms_profiler.error_version));
+ wt_assert.this (
+ msg_in => 'ERROR_VERSION Test 2',
+ check_this_in => regexp_like(get_error_msg(dbms_profiler.error_version)
+ ,'incorrect version','i'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'Unknown Error Test 1',
+ check_this_in => get_error_msg(-9999));
+ wt_assert.this (
+ msg_in => 'Unknown Error Test 2',
+ check_this_in => regexp_like(get_error_msg(-9999)
+ ,'Unknown error','i'));
+ end t_get_error_msg;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function clear_plsql_profiler_recs
+ (in_test_run_id in number default NULL)
+ return number
+is
+ num_recs number := 0;
+begin
+ for buff in (
+ select runid
+ from plsql_profiler_runs
+ where ( in_test_run_id is null
+ and run_date < sysdate -1 )
+ or runid in (
+ select profiler_runid from wt_dbout_runs
+ where test_run_id = in_test_run_id ) )
+ loop
+ delete from plsql_profiler_data where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ delete from plsql_profiler_units where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ delete from plsql_profiler_runs where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ end loop;
+ return num_recs;
+end clear_plsql_profiler_recs;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_clear_plsql_profiler_recs
+ is
+ c_test_run_id constant number := -99;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs',
+ check_this_in => clear_plsql_profiler_recs,
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
+ tl_insert_test_runs(c_test_run_id, 'Delete Profiler Test 2');
+ tl_insert_dbout_runs(c_test_run_id);
+ tl_insert_plsql_profiler_recs(c_test_run_id);
+ tl_count_plsql_profiler_recs(c_test_run_id, 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs(' || c_test_run_id || ')',
+ check_this_in => clear_plsql_profiler_recs(c_test_run_id),
+ against_this_in => 3);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs(' || c_test_run_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ tl_count_plsql_profiler_recs(c_test_run_id, 0);
+ tl_delete_dbout_runs(c_test_run_id);
+ tl_delete_test_runs(c_test_run_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 3';
+ tl_insert_test_runs(c_test_run_id, 'Delete Profiler Test 3');
+ tl_insert_dbout_runs(c_test_run_id);
+ tl_insert_plsql_profiler_recs(c_test_run_id, -2);
+ tl_count_plsql_profiler_recs(c_test_run_id, 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs',
+ check_this_in => clear_plsql_profiler_recs,
+ against_this_in => 3);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ tl_count_plsql_profiler_recs(c_test_run_id, 0);
+ tl_delete_dbout_runs(c_test_run_id);
+ tl_delete_test_runs(c_test_run_id);
+ end t_clear_plsql_profiler_recs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function load_ignr_aa
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2
+ ,in_trigger_offset in number)
+ return ignr_aa_type
+is
+ l_ignr_aa ignr_aa_type;
+ cursor c_find_begin is
+ select line
+ ,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col
+ from dba_source
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type
+ and text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\'
+ order by line;
+ buff_find_begin c_find_begin%ROWTYPE;
+ cursor c_find_end (in_line in number, in_col in number) is
+ with q1 as (
+ select line
+ ,instr(text,'--%WTPLSQL_end_ignore_lines%--') col
+ from dba_source
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type
+ and line >= in_line
+ and text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\'
+ )
+ select line
+ ,col
+ from q1
+ where line > in_line
+ or ( line = in_line
+ and col > in_col)
+ order by line
+ ,col;
+ buff_find_end c_find_end%ROWTYPE;
+begin
+ open c_find_begin;
+ loop
+ fetch c_find_begin into buff_find_begin;
+ exit when c_find_begin%NOTFOUND;
+ open c_find_end (buff_find_begin.line, buff_find_begin.col);
+ fetch c_find_end into buff_find_end;
+ if c_find_end%NOTFOUND
+ then
+ select max(line)
+ into buff_find_end.line
+ from dba_source
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type;
+ end if;
+ close c_find_end;
+ for i in buff_find_begin.line + in_trigger_offset ..
+ buff_find_end.line + in_trigger_offset
+ loop
+ l_ignr_aa(i) := 'X';
+ end loop;
+ end loop;
+ close c_find_begin;
+ return l_ignr_aa;
+end load_ignr_aa;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_load_ignr_aa
+ is
+ l_ignr_aa ignr_aa_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
+ -------------------------------------- WTPLSQL Testing --
+ procedure run_load_ignr is begin
+ l_recSAVE := g_rec;
+ l_ignr_aa := load_ignr_aa(g_current_user
+ ,l_pname
+ ,'PACKAGE BODY'
+ ,0);
+ g_rec := l_recSAVE;
+ end run_load_ignr;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Setup';
+ tl_compile_db_object
+ (in_ptype => 'package'
+ ,in_pname => l_pname
+ ,in_source => ' l_junk number; end ' || l_pname);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Happy Path 1';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source => 'begin' || CHR(10) ||
+ ' l_junk := 1; end ' || l_pname );
+ run_load_ignr;
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Happy Path 2';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 3
+ ' l_junk := 1;' || CHR(10) || -- Line 4
+ 'end ' || l_pname ); -- Line 5
+ run_load_ignr;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 3);
+ for i in 3 .. 5
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Happy Path 3';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' l_junk := 1;' || CHR(10) || -- Line 3
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
+ ' l_junk := 2;' || CHR(10) || -- Line 5
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
+ ' l_junk := 3;' || CHR(10) || -- Line 7
+ 'end ' || l_pname ); -- Line 8
+ run_load_ignr;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 3);
+ for i in 4 .. 6
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Happy Path 4';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' l_junk := 1;' || CHR(10) || -- Line 3
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
+ ' l_junk := 2;' || CHR(10) || -- Line 5
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
+ ' l_junk := 3;' || CHR(10) || -- Line 7
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 8
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
+ run_load_ignr;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 6);
+ for i in 4 .. 6
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ for i in 8 .. 10
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Sad Path 1';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 3
+ ' l_junk := 4;' || CHR(10) || -- Line 4
+ 'end ' || l_pname ); -- Line 5
+ run_load_ignr;
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Sad Path 2';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' l_junk := 1;' || CHR(10) || -- Line 3
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
+ ' l_junk := 2;' || CHR(10) || -- Line 5
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
+ ' l_junk := 3;' || CHR(10) || -- Line 7
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
+ run_load_ignr;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 3);
+ for i in 4 .. 6
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Sad Path 3';
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' l_junk := 1;' || CHR(10) || -- Line 3
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
+ ' l_junk := 2;' || CHR(10) || -- Line 5
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 6
+ ' l_junk := 3;' || CHR(10) || -- Line 7
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
+ run_load_ignr;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
+ ,against_this_in => 5);
+ for i in 4 .. 8
+ loop
+ wt_assert.eq
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
+ ,against_this_in => TRUE);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Load Ignr Teardown';
+ tl_drop_db_object(l_pname, 'package');
+ end t_load_ignr_aa;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure add_dbout_run
+ (in_profiles_rec in wt_profiles%ROWTYPE)
+is
+begin
+ -- If this raises an exception, it must be done before any other values
+ -- are set because they will not be rolled-back after the "raise".
+ case in_profiles_rec.status
+ when 'EXEC' then
+ g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
+ -- Only count the executed time.
+ g_rec.exec_min_usec := least(nvl(g_rec.exec_min_usec,999999999)
+ ,in_profiles_rec.exec_min_usec);
+ g_rec.exec_max_usec := greatest(nvl(g_rec.exec_max_usec,0)
+ ,in_profiles_rec.exec_max_usec);
+ g_rec.exec_tot_usec := nvl(g_rec.exec_tot_usec,0) +
+ ( in_profiles_rec.exec_tot_usec /
+ in_profiles_rec.exec_cnt );
+ when 'IGNR' then
+ g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
+ when 'EXCL' then
+ g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
+ when 'NOTX' then
+ g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
+ when 'UNKN' then
+ g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
+ else
+ raise_application_error(-20011, 'Unknown Profile status "' ||
+ in_profiles_rec.status || '"');
+ end case;
+ g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
+end add_dbout_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_add_dbout_run
+ is
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_profileTEST wt_profiles%ROWTYPE;
+ l_sqlerrm varchar2(4000);
+ begin
+ wt_assert.g_testcase := 'Add Profile Testing';
+ -------------------------------------- WTPLSQL Testing --
+ -- Overview:
+ -- 1) Save results in temporary variables
+ -- 2) Clear add_dbout_run variables
+ -- 3) Call add_dbout_run several times with test data.
+ -- 4) Capture test results
+ -- 5) Restore saved results
+ -- 6) Confirm the test results using WT_ASSERT.
+ -------------------------------------- WTPLSQL Testing --
+ l_recSAVE := g_rec;
+ g_rec := l_recTEST;
+ l_profileTEST.test_run_id := -20;
+ l_profileTEST.exec_min_usec := 10;
+ l_profileTEST.exec_max_usec := 20;
+ l_profileTEST.exec_tot_usec := 30;
+ l_profileTEST.exec_cnt := 1;
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'EXCL';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXCL';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'UNKN';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'ABC';
+ begin
+ add_dbout_run(l_profileTEST);
+ l_sqlerrm := SQLERRM;
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.profiled_lines',
+ check_this_in => l_recTEST.profiled_lines,
+ against_this_in => 15);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_min_usec',
+ check_this_in => l_recTEST.exec_min_usec,
+ against_this_in => 10);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_max_usec',
+ check_this_in => l_recTEST.exec_max_usec,
+ against_this_in => 20);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_tot_usec',
+ check_this_in => l_recTEST.exec_tot_usec,
+ against_this_in => 150);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.executed_lines',
+ check_this_in => l_recTEST.executed_lines,
+ against_this_in => 5);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.ignored_lines',
+ check_this_in => l_recTEST.ignored_lines,
+ against_this_in => 4);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.notexec_lines',
+ check_this_in => l_recTEST.notexec_lines,
+ against_this_in => 3);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.excluded_lines',
+ check_this_in => l_recTEST.excluded_lines,
+ against_this_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.unknown_lines',
+ check_this_in => l_recTEST.unknown_lines,
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'Add Result Sad Path 1',
+ check_this_in => 'ORA-20011: Unknown Profile status "ABC"',
+ against_this_in => l_sqlerrm);
+ end t_add_dbout_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+------------------------------------------------------------
+function set_prof_status
+ (in_prof_rec wt_profiles%ROWTYPE
+ ,in_max_line number)
+ return varchar2
+is
+begin
+ if in_prof_rec.exec_cnt > 0
+ then
+ -- Found Executed Statement
+ return 'EXEC';
+ end if;
+ if in_prof_rec.exec_cnt = 0
+ and in_prof_rec.exec_tot_usec = 0
+ then
+ -- Check for declaration if Not Executed
+ if regexp_like(in_prof_rec.text, '^[[:space:]]*' ||
+ '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
+ '[[:space:]]', 'i')
+ then
+ -- Exclude declarations if Not Executed
+ return 'EXCL';
+ elsif in_prof_rec.line = in_max_line
+ AND regexp_like(in_prof_rec.text, 'END', 'i')
+ then
+ return 'EXCL';
+ -- ^ - Anchored to start of line
+ -- [[:space:]]* - Zero or more spaces
+ -- [Ee][Nn][Dd] - casefolded "end"
+ -- ( [[:space:]]* - Zero or more spaces
+ -- | - OR
+ -- [[:space:]]+ - One or more spaces followed by
+ -- [A-Za-z0-9_$#]{1,128}) - String of 1 to 128 characters
+ -- )
+ -- [[:space:]]* - Zero or more spaces
+ -- [;] - Semicolon character
+ -- $ - Anchored to end of line
+ elsif regexp_like(in_prof_rec.text, '^[[:space:]]*[Ee][Nn][Dd]([[:space:]]*|[[:space:]]+[A-Za-z0-9_$#]{1,128})[[:space:]]*[;]$')
+ then
+ return 'EXCL';
+ else
+ -- Found Not Executed Statement
+ return 'NOTX';
+ end if;
+ end if;
+ -- Everything else is unknown
+ return 'UNKN';
+end set_prof_status;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_prof_status
+ is
+ l_prof_rec wt_profiles%ROWTYPE;
+ begin
+ wt_assert.g_testcase := 'Set Prof Status Happy Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Executable Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Executable Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 10;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Not Executed Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'NOTX');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 4;
+ wt_assert.eq(
+ msg_in => 'Unknown Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 4;
+ wt_assert.eq(
+ msg_in => 'Unknown Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Set Prof Status Sad Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := NULL;
+ l_prof_rec.exec_tot_usec := NULL;
+ l_prof_rec.text := NULL;
+ l_prof_rec.line := NULL;
+ wt_assert.eq(
+ msg_in => 'NULL Profiler Record',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'NULL Max Lines',
+ check_this_in => set_prof_status(l_prof_rec, NULL),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := NULL;
+ l_prof_rec.exec_tot_usec := NULL;
+ l_prof_rec.text := NULL;
+ l_prof_rec.line := NULL;
+ wt_assert.eq(
+ msg_in => 'All inputs NULL',
+ check_this_in => set_prof_status(l_prof_rec, NULL),
+ against_this_in => 'UNKN');
+ end t_set_prof_status;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure insert_wt_profile
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+is
+ l_ignr_aa ignr_aa_type;
+ l_prof_rec wt_profiles%ROWTYPE;
+ l_max_line number;
+begin
+ l_prof_rec.test_run_id := g_rec.test_run_id;
+ -- Capture load_ignr_aa array
+ l_ignr_aa := load_ignr_aa(in_dbout_owner
+ ,in_dbout_name
+ ,in_dbout_type
+ ,g_rec.trigger_offset);
+ -- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION.
+ select max(ppd.line#) into l_max_line
+ from plsql_profiler_units ppu
+ join plsql_profiler_data ppd
+ on ppd.unit_number = ppu.unit_number
+ and ppd.runid = g_rec.profiler_runid
+ where ppu.unit_owner = in_dbout_owner
+ and ppu.unit_name = in_dbout_name
+ and ppu.unit_type = in_dbout_type
+ and ppu.runid = g_rec.profiler_runid;
+ for buf1 in (
+ select src.line
+ ,ppd.total_occur
+ ,ppd.total_time
+ ,ppd.min_time
+ ,ppd.max_time
+ ,src.text
+ from plsql_profiler_units ppu
+ join plsql_profiler_data ppd
+ on ppd.unit_number = ppu.unit_number
+ and ppd.runid = g_rec.profiler_runid
+ join dba_source src
+ on src.line = ppd.line# + g_rec.trigger_offset
+ and src.owner = in_dbout_owner
+ and src.name = in_dbout_name
+ and src.type = in_dbout_type
+ where ppu.unit_owner = in_dbout_owner
+ and ppu.unit_name = in_dbout_name
+ and ppu.unit_type = in_dbout_type
+ and ppu.runid = g_rec.profiler_runid )
+ loop
+ l_prof_rec.line := buf1.line;
+ l_prof_rec.exec_cnt := buf1.total_occur;
+ l_prof_rec.exec_tot_usec := buf1.total_time/1000;
+ l_prof_rec.exec_min_usec := buf1.min_time/1000;
+ l_prof_rec.exec_max_usec := buf1.max_time/1000;
+ l_prof_rec.text := buf1.text;
+ if l_ignr_aa.EXISTS(l_prof_rec.line)
+ then
+ -- Found Statement to Ignore
+ l_prof_rec.status := 'IGNR';
+ else
+ l_prof_rec.status := set_prof_status(l_prof_rec, l_max_line);
+ end if;
+ add_dbout_run(l_prof_rec); -- Updates g_rec
+ insert into wt_profiles values l_prof_rec;
+ end loop;
+ -- Update Aggregates in g_rec
+ g_rec.coverage_pct := calc_pct_coverage(g_rec.test_run_id);
+ if nvl(g_rec.executed_lines,0) != 0
+ then
+ g_rec.exec_avg_usec := round(g_rec.exec_tot_usec / g_rec.executed_lines, 2);
+ end if;
+end insert_wt_profile;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_insert_wt_profile
+ is
+ units_rec plsql_profiler_units%ROWTYPE;
+ data_rec plsql_profiler_data%ROWTYPE;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_recNULL wt_dbout_runs%ROWTYPE;
+ c_test_run_id constant number := -97;
+ l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
+ l_sqlerrm varchar2(4000);
+ l_err_stack varchar2(32000);
+ -------------------------------------- WTPLSQL Testing --
+ procedure insert_plsql_profiler_data
+ (in_line# in number
+ ,in_total_occur in number
+ ,in_total_time in number)
+ is
+ begin
+ data_rec.line# := in_line#;
+ data_rec.total_occur := in_total_occur;
+ data_rec.total_time := in_total_time;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into plsql_profiler_data values data_rec;
+ commit;
+ l_sqlerrm := SQLERRM;
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ wt_assert.eq (
+ msg_in => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')',
+ check_this_in => l_sqlerrm,
+ against_this_in => 'ORA-0000: normal, successful completion');
+ end insert_plsql_profiler_data;
+ -------------------------------------- WTPLSQL Testing --
+ procedure test_dbout_profiler
+ (in_line# in number
+ ,in_col_name in varchar2
+ ,in_value in varchar2)
+ is
+ begin
+ wt_assert.eqqueryvalue
+ (msg_in => 'wt_profiles line ' || in_line# ||
+ ', column ' || in_col_name
+ ,check_query_in => 'select ' || in_col_name ||
+ ' from wt_profiles' ||
+ ' where test_run_id = ' || c_test_run_id ||
+ ' and line = ' || in_line#
+ ,against_value_in => in_value);
+ end test_dbout_profiler;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
+ tl_compile_db_object
+ (in_ptype => 'package'
+ ,in_pname => l_pname
+ ,in_source => ' l_junk number; end ' || l_pname );
+ -------------------------------------- WTPLSQL Testing --
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source =>
+ 'begin' || CHR(10) || -- Line 2
+ ' l_junk := 1;' || CHR(10) || -- Line 3
+ ' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
+ ' l_junk := 2;' || CHR(10) || -- Line 5
+ ' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
+ ' if 0 = 1 then' || CHR(10) || -- Line 7
+ ' l_junk := 3;' || CHR(10) || -- Line 8
+ ' end if;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
+ tl_insert_plsql_profiler_recs(c_test_run_id);
+ tl_count_plsql_profiler_recs(c_test_run_id, 1);
+ tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
+ -------------------------------------- WTPLSQL Testing --
+ units_rec.runid := c_test_run_id;
+ units_rec.unit_number := 1;
+ units_rec.unit_owner := g_current_user;
+ units_rec.unit_name := l_pname;
+ units_rec.unit_type := 'PACKAGE BODY';
+ units_rec.total_time := 0;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into plsql_profiler_units values units_rec;
+ commit;
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ exception when others then
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'insert UNIT 1 into plsql_profiler_units',
+ check_this_in => l_err_stack);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of UNIT 1 plsql_profiler_units'
+ ,check_query_in => 'select count(*) from plsql_profiler_units' ||
+ ' where runid = ' || c_test_run_id ||
+ ' and unit_number = 1'
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ data_rec.runid := c_test_run_id;
+ data_rec.unit_number := 1;
+ data_rec.min_time := 0;
+ data_rec.max_time := 1;
+ insert_plsql_profiler_data(1, 0, 0);
+ insert_plsql_profiler_data(2, 0, 1);
+ insert_plsql_profiler_data(3, 1, 1);
+ insert_plsql_profiler_data(5, 1, 1);
+ insert_plsql_profiler_data(7, 1, 1);
+ insert_plsql_profiler_data(8, 0, 0);
+ insert_plsql_profiler_data(9, 1, 1);
+ insert_plsql_profiler_data(10, 0, 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of UNIT 1 plsql_profiler_data'
+ ,check_query_in => 'select count(*) from plsql_profiler_data' ||
+ ' where runid = ' || c_test_run_id ||
+ ' and unit_number = 1'
+ ,against_value_in => 8);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
+ l_recSAVE := g_rec;
+ g_rec.test_run_id := c_test_run_id;
+ g_rec.profiler_runid := c_test_run_id;
+ g_rec.trigger_offset := 0;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert_wt_profile(g_current_user
+ ,l_pname
+ ,'PACKAGE BODY');
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ exception when others then
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ end;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ wt_assert.isnull (
+ msg_in => 'insert_wt_profile SQLERRM',
+ check_this_in => l_err_stack);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Check Coverage Percent',
+ check_this_in => l_recTEST.coverage_pct,
+ against_this_in => 75);
+ wt_assert.isnotnull (
+ msg_in => 'Check Line Execution Average Microseconds',
+ check_this_in => l_recTEST.exec_avg_usec);
+ -------------------------------------- WTPLSQL Testing --
+ test_dbout_profiler(1, 'STATUS', 'EXCL');
+ test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
+ test_dbout_profiler(2, 'STATUS', 'UNKN');
+ test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10));
+ test_dbout_profiler(3, 'STATUS', 'EXEC');
+ test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10));
+ test_dbout_profiler(5, 'STATUS', 'IGNR');
+ test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10));
+ test_dbout_profiler(7, 'STATUS', 'EXEC');
+ test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10));
+ test_dbout_profiler(8, 'STATUS', 'NOTX');
+ test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10));
+ test_dbout_profiler(9, 'STATUS', 'EXEC');
+ test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10));
+ test_dbout_profiler(10, 'STATUS', 'EXCL');
+ test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
+ tl_delete_wt_profiles(c_test_run_id);
+ tl_delete_test_runs(c_test_run_id);
+ tl_delete_plsql_profiler_recs(c_test_run_id);
+ tl_count_plsql_profiler_recs(c_test_run_id, 0);
+ tl_drop_db_object(l_pname, 'package');
+ end t_insert_wt_profile;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function is_profilable -- find_dbout
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+ return boolean
+is
+ cursor c_readable
+ is
+ select src.name
+ from dba_source src
+ where src.owner = in_dbout_owner
+ and src.name = in_dbout_name
+ and src.type = in_dbout_type;
+ b_readable c_readable%ROWTYPE;
+ ret_bool boolean;
+begin
+ -- Find the first occurance of any PL/SQL source
+ open c_readable;
+ fetch c_readable into b_readable;
+ ret_bool := c_readable%FOUND;
+ close c_readable;
+ return ret_bool;
+end is_profilable;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_is_profilable
+ is
+ l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_is_profilable Happy Path 1';
+ tl_compile_db_object
+ (in_ptype => 'package'
+ ,in_pname => l_pname
+ ,in_source => ' l_junk number;' || CHR(10) ||
+ 'end ' || l_pname );
+ tl_compile_db_object
+ (in_ptype => 'package body'
+ ,in_pname => l_pname
+ ,in_source => 'begin' || CHR(10) ||
+ 'l_junk := 1;' || CHR(10) ||
+ 'end ' || l_pname );
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'Check Package'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PACKAGE')
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'Check Package Body'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PACKAGE BODY')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'package');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_is_profilable Happy Path 2';
+ tl_compile_db_object
+ (in_ptype => 'procedure'
+ ,in_pname => l_pname
+ ,in_source => ' l_junk number;' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' l_junk := 1;' || CHR(10) ||
+ 'end ' || l_pname );
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'Check Procedure'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PROCEDURE')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'procedure');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_is_profilable Happy Path 3';
+ tl_compile_db_object
+ (in_ptype => 'type'
+ ,in_pname => l_pname
+ ,in_source => ' object(l_junk number' || CHR(10) ||
+ ' ,member procedure test1' || CHR(10) ||
+ ' )' );
+ -------------------------------------- WTPLSQL Testing --
+ tl_compile_db_object
+ (in_ptype => 'type body'
+ ,in_pname => l_pname
+ ,in_source => 'member procedure test1' || CHR(10) ||
+ 'is' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' l_junk := 1;' || CHR(10) ||
+ 'end;' || CHR(10) ||
+ 'end' );
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'Check Type'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'TYPE')
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'Check Type Body'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'TYPE BODY')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'type');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_is_profilable Happy Path 4';
+ wt_assert.eq
+ (msg_in => 'Check Missing Function'
+ ,check_this_in => is_profilable(g_current_user, 'BOGUS_FUNCTION_123', 'FUNCTION')
+ ,against_this_in => FALSE);
+ wt_assert.eq
+ (msg_in => 'Check Table'
+ ,check_this_in => is_profilable(g_current_user, 'WT_PROFILES', 'TABLE')
+ ,against_this_in => FALSE);
+ end t_is_profilable;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Find begining of PL/SQL Block in a Trigger
+function trigger_offset
+ (dbout_owner_in in varchar2
+ ,dbout_name_in in varchar2
+ ,dbout_type_in in varchar2)
+ return number
+is
+begin
+ if dbout_type_in != 'TRIGGER'
+ then
+ return 0;
+ end if;
+ for buff in (
+ select line, text from dba_source
+ where owner = dbout_owner_in
+ and name = dbout_name_in
+ and type = 'TRIGGER'
+ order by line )
+ loop
+ if regexp_instr(buff.text,
+ '(^declare$' ||
+ '|^declare[[:space:]]' ||
+ '|[[:space:]]declare$' ||
+ '|[[:space:]]declare[[:space:]])', 1, 1, 0, 'i') <> 0
+ OR
+ regexp_instr(buff.text,
+ '(^begin$' ||
+ '|^begin[[:space:]]' ||
+ '|[[:space:]]begin$' ||
+ '|[[:space:]]begin[[:space:]])', 1, 1, 0, 'i') <> 0
+ then
+ return buff.line - 1;
+ end if;
+ end loop;
+ return 0;
+end trigger_offset;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_trigger_offset
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Trigger Offset Happy Path';
+ wt_assert.eq (
+ msg_in => 'Trigger Test',
+ check_this_in => trigger_offset (dbout_owner_in => g_current_user
+ ,dbout_name_in => 'WT_SELF_TEST$TEST'
+ ,dbout_type_in => 'TRIGGER'),
+ against_this_in => 3);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Package Test',
+ check_this_in => trigger_offset (dbout_owner_in => g_current_user
+ ,dbout_name_in => 'WT_PROFILER'
+ ,dbout_type_in => 'PACKAGE BODY'),
+ against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Trigger Offset Sad Path';
+ wt_assert.eq (
+ msg_in => 'Non Existent Object',
+ check_this_in => trigger_offset (dbout_owner_in => 'BOGUS456'
+ ,dbout_name_in => 'BOGUS123'
+ ,dbout_type_in => 'TRIGGER'),
+ against_this_in => 0);
+ end t_trigger_offset;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function calc_pct_coverage
+ (in_test_run_id in number)
+ return number
+IS
+ cursor main is
+ select sum(case status when 'EXEC' then 1 else 0 end) HITS
+ ,sum(case status when 'NOTX' then 1 else 0 end) MISSES
+ from wt_profiles p
+ where test_run_id = in_test_run_id;
+ buff main%ROWTYPE;
+BEGIN
+ open main;
+ fetch main into buff;
+ close main;
+ if nvl(buff.hits + buff.misses, 0) != 0
+ then
+ return round(100 * buff.hits / (buff.hits + buff.misses),2);
+ end if;
+ return null;
+END calc_pct_coverage;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_calc_pct_coverage
+ is
+ c_test_run_id constant number := -95;
+ l_profile wt_profiles%ROWTYPE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
+ tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
+ l_profile.test_run_id := c_test_run_id;
+ l_profile.exec_cnt := 1;
+ l_profile.exec_tot_usec := 1;
+ l_profile.exec_min_usec := 1;
+ l_profile.exec_max_usec := 1;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
+ l_profile.line := 1;
+ l_profile.status := 'EXEC';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 2;
+ l_profile.status := 'NOTX';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 3;
+ l_profile.status := 'EXEC';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ wt_assert.eq (
+ msg_in => 'Main Test',
+ check_this_in => calc_pct_coverage(c_test_run_id),
+ against_this_in => 66.67);
+ tl_delete_wt_profiles(c_test_run_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
+ l_profile.line := 1;
+ l_profile.status := 'EXCL';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 2;
+ l_profile.status := 'UNKN';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 3;
+ l_profile.status := 'EXCL';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ wt_assert.isnull (
+ msg_in => 'Main Test',
+ check_this_in => calc_pct_coverage(c_test_run_id));
+ tl_delete_wt_profiles(c_test_run_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
+ wt_assert.isnull (
+ msg_in => 'Missing Test Run ID',
+ check_this_in => calc_pct_coverage(-99990));
+ wt_assert.isnull (
+ msg_in => 'NULL Test Run ID',
+ check_this_in => calc_pct_coverage(null));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Calculate Percent Coverage Teardown';
+ tl_delete_test_runs(c_test_run_id);
+ end t_calc_pct_coverage;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure initialize
+is
+ l_recNULL wt_dbout_runs%ROWTYPE;
+ l_retnum binary_integer;
+ junk number;
+begin
+ -- Clear g_rec
+ g_rec := l_recNULL;
+ -- Clear PLSQL Profiler Results Older than 1 Day
+ junk := clear_plsql_profiler_recs;
+ -- Check Versions
+ l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
+ if l_retnum <> 0 then
+ ------%WTPLSQL_begin_ignore_lines%------ Can't test this
+ --dbms_profiler.get_version(major_version, minor_version);
+ raise_application_error(-20005,
+ 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
+ ----------------%WTPLSQL_end_ignore_lines%----------------
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- This starts the PROFILER Running!!!
+ --dbms_output.put_line('running start_profiler in ' || wt_assert.g_testcase);
+ l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.profiler_runid);
+ if l_retnum <> 0 then
+ raise_application_error(-20006,
+ 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ else
+ g_rec.profiler_runid := 0;
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end initialize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE';
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_sqlerrm varchar2(4000);
+ begin
+ wt_assert.g_testcase := 'Initialize Happy Path 1';
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ wtplsql_skip_test := TRUE;
+ initialize;
+ wtplsql_skip_test := FALSE;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnotnull (
+ msg_in => 'l_recTEST.profiler_runid',
+ check_this_in => l_recTEST.profiler_runid);
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Because this procedure is called to cleanup after erorrs,
+-- it must be able to run multiple times without causing damage.
+procedure finalize
+ (in_test_run_id in number)
+is
+ junk number;
+begin
+ -- Return if not profiling
+ if g_rec.profiler_runid is null
+ then
+ return;
+ end if;
+ -- Abort if there is no Test Run ID
+ if in_test_run_id is null
+ then
+ raise_application_error (-20004, 'i_test_run_id is null');
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
+ --dbms_output.put_line('running stop_profiler in ' || wt_assert.g_testcase);
+ dbms_profiler.STOP_PROFILER;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ if is_profilable(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type)
+ then
+ -- Set g_rec values
+ g_rec.test_run_id := in_test_run_id;
+ g_rec.trigger_offset := trigger_offset(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ -- Save PLSQL Profiler Results (Also updates g_rec)
+ insert_wt_profile(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ -- Save g_rec
+ insert into wt_dbout_runs values g_rec;
+ commit;
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- Clear PLSQL Profiler Results for this Run
+ junk := clear_plsql_profiler_recs(g_rec.test_run_id);
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end finalize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize
+ is
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_sqlerrm varchar2(4000);
+ l_err_stack varchar2(32000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.error_message := NULL;
+ g_rec.profiler_runid := NULL;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-1);
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ exception when others then
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-1);
+ tl_delete_wt_profiles(-1);
+ tl_delete_test_runs(-1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'finalize(-1) SQLERRM',
+ check_this_in => l_err_stack);
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 2';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.dbout_owner := 'TEST OWNER';
+ core_data.g_run_rec.dbout_name := 'TEST NAME';
+ core_data.g_run_rec.dbout_type := 'TEST TYPE';
+ core_data.g_run_rec.error_message := NULL;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-2);
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ exception when others then
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-2);
+ tl_delete_wt_profiles(-2);
+ tl_delete_test_runs(-2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'finalize(-2) SQLERRM',
+ check_this_in => l_err_stack);
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ wt_assert.isnotnull (
+ msg_in => 'l_recTEST.profiler_runid',
+ check_this_in => l_recTEST.profiler_runid);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 3';
+ tl_insert_test_runs(-3, 'Finalize Happy Path 3');
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.dbout_owner := g_current_user;
+ core_data.g_run_rec.dbout_name := 'WT_PROFILE';
+ core_data.g_run_rec.dbout_type := 'PACKAGE BODY';
+ core_data.g_run_rec.error_message := NULL;
+ g_rec.profiler_runid := -33;
+ g_rec.trigger_offset := -33;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-3);
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ exception when others then
+ l_err_stack := dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-3);
+ tl_delete_wt_profiles(-3);
+ tl_delete_test_runs(-3);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'finalize(-3) SQLERRM',
+ check_this_in => l_err_stack);
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id,
+ against_this_in => -3);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset,
+ against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Sad Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ g_rec.profiler_runid := -4;
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(null);
+ l_sqlerrm := SQLERRM;
+ -------------------------------------- WTPLSQL Testing --
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ wtplsql_skip_test := FALSE;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ wt_assert.eq (
+ msg_in => 'finalize(null) SQLERRM',
+ check_this_in => l_sqlerrm,
+ against_this_in => 'ORA-20004: i_test_run_id is null');
+ end t_finalize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ num_recs number;
+begin
+ delete from wt_profiles where test_run_id = in_test_run_id;
+ num_recs := SQL%ROWCOUNT;
+ delete from wt_dbout_runs where test_run_id = in_test_run_id;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ if in_test_run_id is not null
+ then
+ num_recs := num_recs + clear_plsql_profiler_recs(in_test_run_id);
+ end if;
+ return num_recs;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ c_test_run_id constant number := -98;
+ l_run wt_dbout_runs%ROWTYPE;
+ l_profile wt_profiles%ROWTYPE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Setup';
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs Count 0',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || c_test_run_id,
+ against_value_in => 0);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles Count 0',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || c_test_run_id,
+ against_value_in => 0);
+ tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.test_run_id := c_test_run_id;
+ l_profile.line := 1;
+ l_profile.status := 'EXEC';
+ l_profile.exec_cnt := 1;
+ l_profile.exec_tot_usec := 1;
+ l_profile.exec_min_usec := 1;
+ l_profile.exec_max_usec := 1;
+ l_profile.text := 'Testing';
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Happy Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(' || c_test_run_id || ')',
+ check_this_in => delete_run_id(c_test_run_id),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(' || c_test_run_id || ') Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || c_test_run_id,
+ against_value_in => 0);
+ tl_delete_test_runs(c_test_run_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Sad Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-9876)',
+ check_this_in => delete_run_id(-9876),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-9876) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || c_test_run_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Sad Path 2';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(NULL)',
+ check_this_in => delete_run_id(NULL),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(NULL) Exception',
+ check_this_in => dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || c_test_run_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Teardown';
+ end t_delete_run_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'WT_PROFILE:PACKAGE BODY';
+ select username into g_current_user from user_users;
+ -------------------------------------- WTPLSQL Testing --
+ t_get_error_msg;
+ t_clear_plsql_profiler_recs;
+ t_load_ignr_aa;
+ t_add_dbout_run;
+ t_set_prof_status;
+ t_insert_wt_profile;
+ t_is_profilable;
+ t_trigger_offset;
+ t_calc_pct_coverage;
+ t_initialize;
+ t_finalize;
+ t_delete_run_id;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_profile;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/BCE56906-48A0-A455-E12D-D44C6F5A1204.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/BCE56906-48A0-A455-E12D-D44C6F5A1204.xml
new file mode 100644
index 0000000..4281f9e
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/BCE56906-48A0-A455-E12D-D44C6F5A1204.xml
@@ -0,0 +1,303 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_DBOUT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_DBOUT
+ authid definer
+as
+
+ -- Return a DBOUT Surrogate Key.
+ -- Return NULL if the DBOUT does not exist.
+ function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number;
+
+ -- Return a DBOUT Surrogate Key.
+ -- Add the DBOUT if it does not exist.
+ function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number;
+
+ -- Delete all records with no child records
+ procedure delete_records;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_dbout;
+
+wtp@DEVPDB_localhost
+WTP
+WT_DBOUT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_DBOUT
+as
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_DBOUT_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_DBOUT_NAME_FOR_TESTING_1234ABCD';
+ C_TYPE CONSTANT varchar2(50) := 'DBOUT_TYPE_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id from wt_dbouts
+ where owner = in_owner
+ and name = in_name
+ and type = in_type;
+ return l_id;
+exception
+ when NO_DATA_FOUND
+ then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_OWNER, C_NAME, C_TYPE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_dbouts (id, owner, name, type)
+ values (wt_dbouts_seq.nextval, C_OWNER, C_NAME, C_TYPE)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_OWNER, C_NAME, C_TYPE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number
+is
+ PRAGMA AUTONOMOUS_TRANSACTION;
+ rec wt_dbouts%ROWTYPE;
+begin
+ if in_owner is NULL
+ OR in_name is NULL
+ OR in_type is NULL
+ then
+ return null;
+ end if;
+ rec.id := get_id (in_owner, in_name, in_type);
+ if rec.id is null
+ then
+ rec.id := wt_dbouts_seq.nextval;
+ rec.owner := in_owner;
+ rec.name := in_name;
+ rec.type := in_type;
+ insert into wt_dbouts values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_OWNER, C_NAME, C_TYPE);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_OWNER, C_NAME, C_TYPE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL, NULL, NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure delete_records
+is
+begin
+ delete from wt_dbouts
+ where id in (
+ select id from wt_dbouts
+ MINUS
+ select distinct dbout_id ID from wt_test_runs);
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_dbouts (id, owner, name, type)
+ values (wt_dbouts_seq.nextval, C_OWNER, C_NAME, C_TYPE);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_DBOUT:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_dbout;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E540BEB4-86FF-0BEC-4B75-E54681F8A22B.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E540BEB4-86FF-0BEC-4B75-E54681F8A22B.xml
new file mode 100644
index 0000000..7e47303
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E540BEB4-86FF-0BEC-4B75-E54681F8A22B.xml
@@ -0,0 +1,4314 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_ASSERT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.WT_ASSERT
+ authid current_user
+is
+ -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
+
+ ASSERT_FAILURE_EXCEPTION exception;
+ PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20004);
+
+ -- See RESET_GLOBALS procedure for default global values
+
+ -- Testcase name for a series of assertions.
+ -- Modify as required
+ g_testcase core_data.long_name;
+
+ -- See RESET_GLOBALS procedure for default global values
+ TYPE g_rec_type is record
+ (last_pass boolean
+ ,raise_exception boolean
+ ,last_assert varchar2(15)
+ ,last_msg varchar2(200)
+ ,last_details varchar2(4000));
+ g_rec g_rec_type;
+
+ function last_pass
+ return boolean;
+
+ function last_assert
+ return varchar2;
+
+ function last_msg
+ return varchar2;
+
+ function last_details
+ return varchar2;
+
+ procedure reset_globals;
+
+ -- Date/Time Formats are configured at the Session Level
+ function get_NLS_DATE_FORMAT
+ return varchar2;
+ procedure set_NLS_DATE_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS');
+ function get_NLS_TIMESTAMP_FORMAT
+ return varchar2;
+ procedure set_NLS_TIMESTAMP_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6');
+ function get_NLS_TIMESTAMP_TZ_FORMAT
+ return varchar2;
+ procedure set_NLS_TIMESTAMP_TZ_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
+
+ ------------------------
+ -- Datatypes Supported
+ -- Oracle Data Type Families
+ -- https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/predefined.htm#LNPLS2047
+ --
+ -- VARCHAR2 - Includes ROWID, LONG*, RAW, LONG RAW*, and NVARCHAR2
+ -- DATE** - Includes TIMESTAMP and INTERVAL
+ -- NUMBER** - Includes PLS_INTEGER
+ -- BOOLEAN
+ -- XMLTYPE
+ -- CLOB - Includes NCLOB
+ -- BLOB
+ --
+ -- *LONG and LONG RAW data length is limited to VARCHAR2 length in PL/SQL (32K).
+ -- **VARCHAR2 includes DATE and NUMBER using Implicit Data Conversions:
+ -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002.htm#i163326
+ --
+
+ procedure this (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ --
+ procedure eq (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ procedure eq (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ against_this_in in boolean,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ procedure eq (
+ msg_in in varchar2,
+ check_this_in in XMLTYPE,
+ against_this_in in XMLTYPE,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure eq (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ against_this_in in CLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ procedure eq (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ against_this_in in BLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ --
+ procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ --
+ procedure isnull (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnull (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnull (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure isnull (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ --
+ procedure raises (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in varchar2);
+
+ procedure raises (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in number);
+
+ procedure throws (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in varchar2);
+
+ procedure throws (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in number);
+
+ --
+ procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in varchar2,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in XMLTYPE,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in CLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in BLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false);
+
+ --
+ procedure eqquery (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_query_in in varchar2,
+ raise_exc_in in boolean := false);
+
+ --
+ procedure eqtable (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ check_where_in in varchar2 := null,
+ against_where_in in varchar2 := null,
+ raise_exc_in in boolean := false);
+
+ --
+ procedure eqtabcount (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ check_where_in in varchar2 := null,
+ against_where_in in varchar2 := null,
+ raise_exc_in in boolean := false);
+
+ --
+ procedure objexists (
+ msg_in in varchar2,
+ obj_owner_in in varchar2,
+ obj_name_in in varchar2,
+ obj_type_in in varchar2 default null,
+ raise_exc_in in boolean := false);
+
+ procedure objexists (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ --
+ procedure objnotexists (
+ msg_in in varchar2,
+ obj_owner_in in varchar2,
+ obj_name_in in varchar2,
+ obj_type_in in varchar2 default null,
+ raise_exc_in in boolean := false);
+
+ procedure objnotexists (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false);
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_assert;
+
+wtp@DEVPDB_localhost
+WTP
+WT_ASSERT
+duane
+2024-04-10 19:09:29 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.WT_ASSERT is
+
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/');
+ temp_rowid2 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAB/');
+ temp_long1 CONSTANT long := hextoraw('0123456789ABCDEF0123456789ABCDEF');
+ temp_long2 CONSTANT long := hextoraw('FEDCBA9876543210FEDCBA9876543210');
+ temp_raw1 CONSTANT raw(2) := hextoraw('2345');
+ temp_raw2 CONSTANT raw(2) := hextoraw('6789');
+ temp_lraw1 CONSTANT long raw := hextoraw('0123456789ABCDEF0123456789ABCDEF');
+ temp_lraw2 CONSTANT long raw := hextoraw('FEDCBA9876543210FEDCBA9876543210');
+ temp_blob1 BLOB;
+ temp_blob2 CONSTANT BLOB := hextoraw('FEDCBA9876543210FEDCBA9876543210');
+ -------------------------------------- WTPLSQL Testing --
+ temp_nc1 CONSTANT NVARCHAR2(12) := 'NCHAR1';
+ temp_nc2 CONSTANT NVARCHAR2(12) := 'NCHAR2';
+ temp_bool CONSTANT boolean := NULL;
+ temp_clob1 CLOB;
+ temp_clob2 CONSTANT CLOB := 'This is another clob.';
+ temp_nclob1 NCLOB;
+ temp_nclob2 CONSTANT NCLOB := 'This is another clob.';
+ temp_xml1 XMLTYPE;
+ temp_xml2 CONSTANT XMLTYPE := xmltype('<?xml version="1.0" encoding="UTF-8"?><note>2</note>');
+ -------------------------------------- WTPLSQL Testing --
+ temp_pint1 CONSTANT pls_integer := 2;
+ temp_pint2 CONSTANT pls_integer := 3;
+ temp_date CONSTANT date := sysdate;
+ temp_tstmp CONSTANT timestamp := systimestamp;
+ temp_tstlzn CONSTANT timestamp with local time zone := systimestamp;
+ temp_tstzn CONSTANT timestamp with time zone := systimestamp;
+ temp_intds1 CONSTANT interval day to second := interval '+01 01:01:01.001' day to second;
+ temp_intds2 CONSTANT interval day to second := interval '+02 02:02:02.002' day to second;
+ temp_intym1 CONSTANT interval year to month := interval '+01-01' year to month;
+ temp_intym2 CONSTANT interval year to month := interval '+02-02' year to month;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec g_rec_type;
+ temp_testcase VARCHAR2(4000);
+ wtplsql_skip_save boolean := FALSE;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+----------------------
+-- Private Procedures
+----------------------
+
+------------------------------------------------------------
+function boolean_to_status
+ (in_boolean in boolean)
+ return varchar2
+is
+begin
+ if in_boolean is null
+ then
+ return '';
+ elsif in_boolean
+ then
+ return 'TRUE';
+ end if;
+ return 'FALSE';
+end boolean_to_status;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_boolean_to_status
+ is
+ begin
+ wt_assert.g_testcase := 'BOOLEAN_TO_STATUS';
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'Test for "TRUE" conversion'
+ ,check_this_in => boolean_to_status(TRUE)
+ ,against_this_in => 'TRUE');
+ wt_assert.eq
+ (msg_in => 'Test for "FALSE" conversion'
+ ,check_this_in => boolean_to_status(FALSE)
+ ,against_this_in => 'FALSE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'Test for NULL'
+ ,check_this_in => boolean_to_status(temp_bool));
+ end t_boolean_to_status;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure process_assertion
+is
+begin
+ if core_data.g_run_rec.test_runner_name is null
+ then
+ hook.run('ad_hoc_report');
+ return;
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_save then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ core_data.add
+ (in_testcase => g_testcase
+ ,in_assertion => g_rec.last_assert
+ ,in_pass => g_rec.last_pass
+ ,in_details => g_rec.last_details
+ ,in_message => g_rec.last_msg);
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_assertion');
+ if g_rec.raise_exception
+ and not g_rec.last_pass
+ then
+ raise_application_error(-20004, g_rec.last_msg || CHR(10) ||
+ ' Assertion ' || g_rec.last_assert || ' Failed.' || CHR(10) ||
+ ' Testcase: ' || g_testcase || CHR(10) ||
+ ' ' || g_rec.last_details );
+ end if;
+end process_assertion;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_process_assertion
+ is
+ l_test_runner_nameSAVE core_data.g_run_rec.test_runner_name%TYPE;
+ l_msg varchar2(100) := 'Check Exception Processing';
+ l_line varchar2(32767);
+ l_status pls_integer;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ loop
+ dbms_output.get_line(l_line, l_status);
+ exit when l_status = 1;
+ wt_assert.isnull
+ (msg_in => 'Clear DBMS_OUTPUT Buffer'
+ ,check_this_in => l_line);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Ad Hoc Report Happy Path';
+ g_rec.last_assert := 'THIS';
+ g_rec.last_pass := TRUE;
+ g_rec.last_details := 'Expected "PASS" and got "PASS"';
+ g_rec.last_msg := 'Ad Hoc Report Happy Path';
+ g_rec.raise_exception := FALSE;
+ l_test_runner_nameSAVE := core_data.g_run_rec.test_runner_name;
+ core_data.g_run_rec.test_runner_name := '';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ process_assertion; -- Should not throw exception
+ core_data.g_run_rec.test_runner_name := l_test_runner_nameSAVE;
+ wt_assert.isnotnull
+ (msg_in => l_msg
+ ,check_this_in => 'Ad Hoc Report Exception Success');
+ exception
+ -------------------------------------- WTPLSQL Testing --
+ when OTHERS then
+ core_data.g_run_rec.test_runner_name := l_test_runner_nameSAVE;
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Ad Hoc Report Exception Failed');
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 1 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 1 Line'
+ ,check_this_in => l_line
+ ,against_this_in => 'Ad Hoc Report Happy Path');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 2 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 2 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Assertion THIS PASSED.');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 3 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 3 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Testcase: Ad Hoc Report Happy Path');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 4 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 4 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Expected "PASS" and got "PASS"');
+ -------------------------------------- WTPLSQL Testing --
+ g_testcase := 'PROCESS_ASSERTION';
+ g_rec.last_assert := 'THIS';
+ g_rec.last_pass := FALSE;
+ g_rec.last_details := 'Expected "PASS" and got "FAIL"';
+ g_rec.last_msg := 'Process Assertion Forced Failure';
+ g_rec.raise_exception := TRUE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := TRUE;
+ process_assertion; -- Should throw exception
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Exception missing, should not have arrived here');
+ exception
+ -------------------------------------- WTPLSQL Testing --
+ when ASSERT_FAILURE_EXCEPTION then
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.eq
+ (msg_in => l_msg
+ ,check_this_in => SQLERRM
+ ,against_this_in => 'ORA-20004: Process Assertion Forced Failure' || CHR(10) ||
+ ' Assertion THIS Failed.' || CHR(10) ||
+ ' Testcase: PROCESS_ASSERTION' || CHR(10) ||
+ ' Expected "PASS" and got "FAIL"');
+ -------------------------------------- WTPLSQL Testing --
+ when OTHERS then
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Incorrect Exception Thrown: ' ||
+ substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace
+ ,1,3950) );
+ end;
+ end t_process_assertion;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure compare_queries (
+ check_query_in in varchar2,
+ against_query_in in varchar2)
+is
+ l_ret_txt varchar2(10);
+ l_qry_txt varchar2(32000);
+ l_exec_txt varchar2(32767);
+begin
+ -- Define Query for the Comparison
+ l_qry_txt := 'with check_query as (' || check_query_in ||
+ '), against_query as (' || against_query_in ||
+ '), q1 as (select * from check_query' ||
+ ' MINUS select * from against_query' ||
+ '), q2 as (select * from against_query' ||
+ ' MINUS select * from check_query' ||
+ ') select * from q1 UNION select * from q2' ;
+ ----------------------------------------
+ -- Define EXECUTE IMMEDIATE text
+ l_exec_txt :=
+'declare
+ cursor cur is ' || l_qry_txt || ';
+ rec cur%rowtype;
+begin
+ open cur;
+ fetch cur into rec;
+ :ret_txt := case cur%FOUND when TRUE then ''FOUND''
+ else ''NOTFOUND'' end;
+ close cur;
+end;';
+ ----------------------------------------
+ -- Run the Comparison
+ execute immediate l_exec_txt using out l_ret_txt;
+ if l_ret_txt = 'FOUND'
+ then
+ g_rec.last_pass := FALSE; -- Some Difference Found
+ else
+ g_rec.last_pass := TRUE; -- Nothing found, queries match
+ end if;
+ -- No Exceptions Raised
+ g_rec.last_details := 'Comparison Query: ' || l_qry_txt;
+exception
+ when OTHERS
+ then
+ g_rec.last_details := SQLERRM || CHR(10) ||
+ 'FAILURE of Compare Query: ' || l_qry_txt || ';';
+ g_rec.last_pass := FALSE;
+end compare_queries;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_compare_queries
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1';
+ compare_queries (
+ check_query_in => 'select bogus123 from bogus456',
+ against_query_in => 'select bogus987 from bogus654');
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull(
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this(
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ '%PL/SQL: ORA-00942: table or view does not exist%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2';
+ compare_queries (
+ check_query_in => 'select table_name from user_tables',
+ against_query_in => 'select tablespace_name from user_tables');
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull(
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this(
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details like
+ '%Comparison Query: with check_query as' ||
+ ' (select table_name from user_tables%');
+ end t_compare_queries;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+function last_pass
+ return boolean
+is
+begin
+ return g_rec.last_pass;
+end last_pass;
+
+function last_assert
+ return varchar2
+is
+begin
+ return g_rec.last_assert;
+end last_assert;
+
+function last_msg
+ return varchar2
+is
+begin
+ return g_rec.last_msg;
+end last_msg;
+
+function last_details
+ return varchar2
+is
+begin
+ return g_rec.last_details;
+end last_details;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_last_values
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Last Values Tests';
+ wt_assert.eq (
+ msg_in => 'Last Pass',
+ check_this_in => last_pass,
+ against_this_in => g_rec.last_pass,
+ null_ok_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'Last Assert',
+ check_this_in => last_assert,
+ against_this_in => g_rec.last_assert,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'Last MSG',
+ check_this_in => last_msg,
+ against_this_in => temp_rec.last_msg,
+ null_ok_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'Last Details',
+ check_this_in => last_details,
+ against_this_in => g_rec.last_details,
+ null_ok_in => TRUE);
+ end t_last_values;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure reset_globals
+is
+begin
+ g_testcase := '';
+ g_rec.last_pass := NULL;
+ g_rec.raise_exception := FALSE;
+ g_rec.last_assert := '';
+ g_rec.last_msg := '';
+ g_rec.last_details := '';
+end reset_globals;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_reset_globals
+ is
+ begin
+ reset_globals; -- Resets g_testcase
+ temp_rec := g_rec;
+ temp_testcase := g_testcase;
+ -------------------------------------- WTPLSQL Testing --
+ g_testcase := 'RESET_GLOBALS';
+ wt_assert.isnull(
+ msg_in => 'temp_testcase',
+ check_this_in => temp_testcase);
+ wt_assert.isnull
+ (msg_in => 'temp_rec.last_pass'
+ ,check_this_in => temp_rec.last_pass);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'temp_rec.raise_exception',
+ check_this_in => temp_rec.raise_exception,
+ against_this_in => FALSE);
+ wt_assert.isnull
+ (msg_in => 'temp_rec.last_assert'
+ ,check_this_in => temp_rec.last_assert);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'temp_rec.last_msg'
+ ,check_this_in => temp_rec.last_msg);
+ wt_assert.isnull
+ (msg_in => 'temp_rec.last_details'
+ ,check_this_in => temp_rec.last_details);
+ end t_reset_globals;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function get_NLS_DATE_FORMAT
+ return varchar2
+is
+ l_format varchar2(50);
+begin
+ select value into l_format
+ from nls_session_parameters
+ where parameter in 'NLS_DATE_FORMAT';
+ return l_format;
+end get_NLS_DATE_FORMAT;
+
+procedure set_NLS_DATE_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS')
+is
+begin
+ execute immediate 'alter session set NLS_DATE_FORMAT = ''' ||
+ in_format || '''';
+end set_NLS_DATE_FORMAT;
+
+function get_NLS_TIMESTAMP_FORMAT
+ return varchar2
+is
+ l_format varchar2(50);
+begin
+ select value into l_format
+ from nls_session_parameters
+ where parameter in 'NLS_TIMESTAMP_FORMAT';
+ return l_format;
+end get_NLS_TIMESTAMP_FORMAT;
+
+procedure set_NLS_TIMESTAMP_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6')
+is
+begin
+ execute immediate 'alter session set NLS_TIMESTAMP_FORMAT = ''' ||
+ in_format || '''';
+end set_NLS_TIMESTAMP_FORMAT;
+
+function get_NLS_TIMESTAMP_TZ_FORMAT
+ return varchar2
+is
+ l_format varchar2(50);
+begin
+ select value into l_format
+ from nls_session_parameters
+ where parameter in 'NLS_TIMESTAMP_TZ_FORMAT';
+ return l_format;
+end get_NLS_TIMESTAMP_TZ_FORMAT;
+
+procedure set_NLS_TIMESTAMP_TZ_FORMAT
+ (in_format in varchar2 default 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM')
+is
+begin
+ execute immediate 'alter session set NLS_TIMESTAMP_TZ_FORMAT = ''' ||
+ in_format || '''';
+end set_NLS_TIMESTAMP_TZ_FORMAT;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_nls_settings
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'NLS Settings';
+ set_NLS_DATE_FORMAT('DD-MON-YYYY');
+ wt_assert.eq
+ (msg_in => 'get_NLS_DATE_FORMAT 1'
+ ,check_this_in => get_NLS_DATE_FORMAT
+ ,against_this_in => 'DD-MON-YYYY');
+ set_NLS_DATE_FORMAT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'get_NLS_DATE_FORMAT 2'
+ ,check_this_in => get_NLS_DATE_FORMAT
+ ,against_this_in => 'DD-MON-YYYY HH24:MI:SS');
+ set_NLS_TIMESTAMP_FORMAT('DD-MON-YYYY');
+ wt_assert.eq
+ (msg_in => 'get_NLS_TIMESTAMP_FORMAT 2'
+ ,check_this_in => get_NLS_TIMESTAMP_FORMAT
+ ,against_this_in => 'DD-MON-YYYY');
+ set_NLS_TIMESTAMP_FORMAT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'get_NLS_TIMESTAMP_FORMAT 2'
+ ,check_this_in => get_NLS_TIMESTAMP_FORMAT
+ ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6');
+ set_NLS_TIMESTAMP_TZ_FORMAT('DD-MON-YYYY');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
+ ,check_this_in => get_NLS_TIMESTAMP_TZ_FORMAT
+ ,against_this_in => 'DD-MON-YYYY');
+ set_NLS_TIMESTAMP_TZ_FORMAT;
+ wt_assert.eq
+ (msg_in => 'get_NLS_TIMESTAMP_TZ_FORMAT 2'
+ ,check_this_in => get_NLS_TIMESTAMP_TZ_FORMAT
+ ,against_this_in => 'DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM');
+ end t_nls_settings;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------
+-- Assertion Procedures
+------------------------
+
+------------------------------------------------------------
+procedure this (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'THIS';
+ g_rec.last_msg := substr(msg_in,1,200);
+ g_rec.last_pass := nvl(check_this_in, FALSE);
+ g_rec.last_details := 'Expected "TRUE" and got "' ||
+ boolean_to_status(check_this_in) || '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end this;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_this
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'This Happy Path';
+ wt_assert.this (
+ msg_in => 'Run Test',
+ check_this_in => TRUE);
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'THIS');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected "TRUE" and got "TRUE"');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'This Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ this (
+ msg_in => 'Not Used',
+ check_this_in => FALSE);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'This Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ this (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'This Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ this (
+ msg_in => 'Not Used',
+ check_this_in => NULL);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ end t_this;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- EQ: string overload
+procedure eq (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'EQ';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
+ or ( check_this_in is null
+ and against_this_in is null
+ and null_ok_in )
+ );
+ g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
+ '" and got "' || substr(check_this_in ,1,1000) ||
+ '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eq;
+
+-- EQ: boolean overload
+procedure eq (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ against_this_in in boolean,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+begin
+ eq (msg_in => msg_in
+ ,check_this_in => boolean_to_status(check_this_in)
+ ,against_this_in => boolean_to_status(against_this_in)
+ ,null_ok_in => null_ok_in
+ ,raise_exc_in => raise_exc_in);
+end eq;
+
+-- EQ: XMLTYPE
+procedure eq (
+ msg_in in varchar2,
+ check_this_in in XMLTYPE,
+ against_this_in in XMLTYPE,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'EQ';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := nvl(xmltype.getclobval(check_this_in) =
+ xmltype.getclobval(against_this_in), FALSE);
+ g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) ||
+ '" and got "' || substr(xmltype.getclobval(check_this_in) ,1,1000) ||
+ '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eq;
+
+-- EQ: CLOB
+procedure eq (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ against_this_in in CLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'EQ';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
+ or ( check_this_in is null
+ and against_this_in is null
+ and null_ok_in )
+ );
+ g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
+ '" and got "' || substr(check_this_in ,1,1000) ||
+ '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eq;
+
+-- EQ: BLOB
+procedure eq (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ against_this_in in BLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+ compare_results number;
+begin
+ g_rec.last_assert := 'EQ';
+ g_rec.last_msg := msg_in;
+ compare_results := nvl(DBMS_LOB.COMPARE(check_this_in, against_this_in),-1);
+ g_rec.last_pass := ( (compare_results = 0)
+ or ( check_this_in is null
+ and against_this_in is null
+ and null_ok_in )
+ );
+ g_rec.last_details := 'DBMS_LOB.COMPARE on BLOBs, compare_results: ' || compare_results;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eq;
+
+-------------------------------------------------------------------------
+-- This is the start of a MASSIVE Unit Test on the "EQ" assertion ---
+-------------------------------------------------------------------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_eq
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => 'X',
+ against_this_in => 'X');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_pass value',
+ check_this_in => temp_rec.last_pass);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => (temp_rec.last_pass = TRUE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_assert value',
+ check_this_in => temp_rec.last_assert);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => (temp_rec.last_assert = 'EQ'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_msg value',
+ check_this_in => temp_rec.last_msg);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => (temp_rec.last_msg = 'Run Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details = 'Expected "X" and got "X"'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => 'X',
+ against_this_in => 'X',
+ null_ok_in => TRUE);
+ wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => '',
+ against_this_in => '',
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => 'X',
+ against_this_in => 'Y');
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => 'X');
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => 'Y');
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => 'X',
+ against_this_in => 'Y',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => '',
+ against_this_in => 'Y');
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'check_this_in value',
+ check_this_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => 'Y');
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => '',
+ against_this_in => '');
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'check_this_in value',
+ check_this_in => '');
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => '');
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => 'X',
+ against_this_in => 'Y',
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => 'X');
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => 'Y');
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => '',
+ against_this_in => 'Y',
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'check_this_in value',
+ check_this_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => 'Y');
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes ROWID
+ wt_assert.g_testcase := 'EQ ROWID Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_rowid1,
+ against_this_in => temp_rowid1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ ROWID Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_rowid1,
+ against_this_in => temp_rowid2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_rowid1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_rowid2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes LONG
+ wt_assert.g_testcase := 'EQ LONG Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_long1,
+ against_this_in => temp_long1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ LONG Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_long1,
+ against_this_in => temp_long2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_long1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_long2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes RAW
+ wt_assert.g_testcase := 'EQ RAW Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_raw1,
+ against_this_in => temp_raw1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ RAW Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_raw1,
+ against_this_in => temp_raw2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_raw1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_raw2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes LONG RAW
+ wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_lraw1,
+ against_this_in => temp_lraw1);
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes LONG RAW
+ wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_lraw1,
+ against_this_in => temp_lraw2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1';
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_lraw1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_lraw2);
+ wt_assert.this (
+ msg_in => 'Sad Path 1',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- VARCHAR2 includes Includes NVARCHAR2
+ wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_nc1,
+ against_this_in => temp_nc1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_nc1,
+ against_this_in => temp_nc2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_nc1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_nc2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => FALSE,
+ against_this_in => FALSE);
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => FALSE,
+ against_this_in => FALSE,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_bool,
+ against_this_in => temp_bool,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ against_this_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => TRUE);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ against_this_in => temp_bool);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => FALSE);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_bool);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ against_this_in => TRUE,
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => TRUE);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ against_this_in => temp_bool,
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => FALSE);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_bool);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => 4,
+ against_this_in => 4);
+ wt_assert.g_testcase := 'EQ NUMBER Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => 9876543210987654321098765432109876543210,
+ against_this_in => 9876543210987654321098765432109876543210);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => 4,
+ against_this_in => 5);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => 4);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => 5);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: NUMBER implicit conversion includes PLS_INTEGER
+ wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_pint1,
+ against_this_in => temp_pint1);
+ wtplsql_skip_save := TRUE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1';
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_pint1,
+ against_this_in => temp_pint2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_pint1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_pint2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ DATE Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_date,
+ against_this_in => temp_date);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ DATE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_date,
+ against_this_in => temp_date + 1/24);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_date);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_date + 1/24);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: DATE implicit conversion includes TIMESTAMP
+ wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1';
+ eq (
+ msg_in => 'EQ TIMSETAMP Happy Path 1',
+ check_this_in => temp_tstmp,
+ against_this_in => temp_tstmp);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_tstmp,
+ against_this_in => temp_tstmp + 1/24);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_tstmp);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_tstmp + 1/24);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: DATE implicit conversion includes TIMESTAMP
+ wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_tstzn,
+ against_this_in => temp_tstzn);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_tstlzn,
+ against_this_in => temp_tstlzn + 1/24);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_tstlzn);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_tstlzn + 1/24);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: DATE implicit conversion includes TIMESTAMP
+ wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_tstzn,
+ against_this_in => temp_tstzn);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_tstzn,
+ against_this_in => temp_tstzn + 1/24);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_tstzn);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_tstzn + 1/24);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: DATE implicit conversion includes INTERVAL
+ wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_intds1,
+ against_this_in => temp_intds1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_intds1,
+ against_this_in => temp_intds2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_intds1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_intds2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ -- EQ: DATE implicit conversion includes INTERVAL
+ wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_intym1,
+ against_this_in => temp_intym1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_intym1,
+ against_this_in => temp_intym2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_intym1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_intym2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_xml1,
+ against_this_in => temp_xml1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_pass value',
+ check_this_in => temp_rec.last_pass);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => (temp_rec.last_pass = TRUE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => ' g_rec.last_assert value',
+ check_this_in => temp_rec.last_assert);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => (temp_rec.last_assert = 'EQ'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_msg value',
+ check_this_in => temp_rec.last_msg);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => (temp_rec.last_msg = 'Run Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_xml1,
+ against_this_in => temp_xml2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => xmltype.getclobval(temp_xml1));
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => xmltype.getclobval(temp_xml2));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_xml1,
+ against_this_in => temp_xml2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_clob1,
+ against_this_in => temp_clob1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_pass value',
+ check_this_in => temp_rec.last_pass);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => (temp_rec.last_pass = TRUE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_assert value',
+ check_this_in => temp_rec.last_assert);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => (temp_rec.last_assert = 'EQ'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_msg value',
+ check_this_in => temp_rec.last_msg);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => (temp_rec.last_msg = 'Run Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_clob1,
+ against_this_in => temp_clob1,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Happy Path 3';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => cast (NULL as CLOB),
+ against_this_in => cast (NULL as CLOB),
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1,
+ against_this_in => temp_clob2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_clob1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_clob2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1,
+ against_this_in => temp_clob2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1,
+ against_this_in => cast (NULL as CLOB));
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_clob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as CLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ CLOB Sad Path 4';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1,
+ against_this_in => cast (NULL as CLOB),
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_clob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as CLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_nclob1,
+ against_this_in => temp_nclob1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_nclob1,
+ against_this_in => temp_nclob1,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Happy Path 3';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => cast (NULL as NCLOB),
+ against_this_in => cast (NULL as NCLOB),
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_nclob1,
+ against_this_in => temp_nclob2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_nclob1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_nclob2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_nclob1,
+ against_this_in => temp_nclob2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_nclob1,
+ against_this_in => cast (NULL as NCLOB));
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_nclob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as NCLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ NCLOB Sad Path 4';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_nclob1,
+ against_this_in => cast (NULL as NCLOB),
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_nclob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as NCLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Happy Path 1';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_blob1,
+ against_this_in => temp_blob1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_pass value',
+ check_this_in => temp_rec.last_pass);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => (temp_rec.last_pass = TRUE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_assert value',
+ check_this_in => temp_rec.last_assert);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => (temp_rec.last_assert = 'EQ'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_msg value',
+ check_this_in => temp_rec.last_msg);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => (temp_rec.last_msg = 'Run Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details =
+ 'DBMS_LOB.COMPARE on BLOBs, compare_results: 0'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Happy Path 2';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => temp_blob1,
+ against_this_in => temp_blob1,
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Happy Path 3';
+ eq (
+ msg_in => 'Run Test',
+ check_this_in => cast (NULL as BLOB),
+ against_this_in => cast (NULL as BLOB),
+ null_ok_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1,
+ against_this_in => temp_blob2);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_blob1);
+ wt_assert.isnotnull (
+ msg_in => 'against_this_in value',
+ check_this_in => temp_blob2);
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1,
+ against_this_in => temp_blob2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1,
+ against_this_in => cast (NULL as BLOB));
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_blob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as BLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQ BLOB Sad Path 4';
+ wtplsql_skip_save := TRUE;
+ eq (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1,
+ against_this_in => cast (NULL as BLOB),
+ null_ok_in => TRUE);
+ wtplsql_skip_save := FALSE;
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'check_this_in value',
+ check_this_in => temp_blob1);
+ wt_assert.isnull (
+ msg_in => 'against_this_in value',
+ check_this_in => cast (NULL as BLOB));
+ wt_assert.this (
+ msg_in => 'last_pass = FALSE',
+ check_this_in => (temp_rec.last_pass = FALSE));
+ end t_eq;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+-----------------------------------------------------------------------
+-- This is the end of a MASSIVE Unit Test on the "EQ" assertion ---
+-----------------------------------------------------------------------
+
+
+------------------------------------------------------------
+-- ISNOTNULL string overload
+procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNOTNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is not null);
+ g_rec.last_details := 'Expected NOT NULL and got "' ||
+ substr(check_this_in,1,2000) || '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnotnull;
+
+-- ISNOTNULL boolean overload
+procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ isnotnull (msg_in => msg_in
+ ,check_this_in => boolean_to_status(check_this_in)
+ ,null_ok_in => null_ok_in
+ ,raise_exc_in => raise_exc_in);
+end isnotnull;
+
+-- ISNOTNULL CLOB overload
+procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNOTNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is not null);
+ g_rec.last_details := 'Expected NOT NULL and got "' ||
+ substr(check_this_in,1,2000) || '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnotnull;
+
+-- ISNOTNULL BLOB overload
+procedure isnotnull (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNOTNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is not null);
+ if g_rec.last_pass
+ then
+ g_rec.last_details := 'BLOB is NOT NULL';
+ else
+ g_rec.last_details := 'BLOB is NULL';
+ end if;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnotnull;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_isnotnull
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1';
+ isnotnull (
+ msg_in => 'Run Test',
+ check_this_in => 'X');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNOTNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected NOT NULL and got "X"');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => '');
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => '',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1';
+ isnotnull (
+ msg_in => 'Run Test',
+ check_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_bool);
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_bool,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1';
+ isnotnull (
+ msg_in => 'Run Test',
+ check_this_in => temp_clob1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNOTNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected NOT NULL and got "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => cast (null as CLOB));
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => cast (null as CLOB),
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1';
+ isnotnull (
+ msg_in => 'Run Test',
+ check_this_in => temp_blob1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNOTNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'BLOB is NOT NULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => cast (null as BLOB));
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnotnull (
+ msg_in => 'Not Used',
+ check_this_in => cast (null as BLOB),
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ end t_isnotnull;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- ISNULL string overload
+procedure isnull (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is null);
+ g_rec.last_details := 'Expected NULL and got "' ||
+ substr(check_this_in,1,2000) || '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnull;
+
+-- ISNULL boolean overload
+procedure isnull (
+ msg_in in varchar2,
+ check_this_in in boolean,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ isnull (msg_in => msg_in
+ ,check_this_in => boolean_to_status(check_this_in)
+ ,null_ok_in => null_ok_in
+ ,raise_exc_in => raise_exc_in);
+end isnull;
+
+-- ISNULL CLOB overload
+procedure isnull (
+ msg_in in varchar2,
+ check_this_in in CLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is null);
+ g_rec.last_details := 'Expected NULL and got "' ||
+ substr(check_this_in,1,2000) || '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnull;
+
+-- ISNULL BLOB overload
+procedure isnull (
+ msg_in in varchar2,
+ check_this_in in BLOB,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'ISNULL';
+ g_rec.last_msg := msg_in;
+ g_rec.last_pass := (check_this_in is null);
+ if g_rec.last_pass
+ then
+ g_rec.last_details := 'BLOB is NULL';
+ else
+ g_rec.last_details := 'BLOB is NOT NULL';
+ end if;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end isnull;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_isnull
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1';
+ isnull (
+ msg_in => 'Run Test',
+ check_this_in => '');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected NULL and got ""');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => 'X');
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => 'X',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1';
+ isnull (
+ msg_in => 'Run Test',
+ check_this_in => temp_bool);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => FALSE);
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => FALSE,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1';
+ isnull (
+ msg_in => 'Run Test',
+ check_this_in => cast (null as CLOB));
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected NULL and got ""');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1);
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_clob1,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1';
+ isnull (
+ msg_in => 'Run Test',
+ check_this_in => cast (null as BLOB));
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'ISNULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'BLOB is NULL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1);
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ isnull (
+ msg_in => 'Not Used',
+ check_this_in => temp_blob1,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'g_rec.last_pass',
+ check_this_in => g_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ end t_isnull;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Check a given call raises an exception
+procedure raises (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in varchar2)
+is
+ l_sqlerrm varchar2(4000);
+ l_errstack varchar2(4000);
+begin
+ begin
+ execute immediate check_call_in;
+ exception when OTHERS then
+ l_sqlerrm := SQLERRM;
+ l_errstack := substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace
+ ,1,4000);
+ end;
+ --
+ g_rec.last_assert := 'RAISES/THROWS';
+ g_rec.last_msg := msg_in;
+ if against_exc_in is null AND l_sqlerrm is null
+ then
+ -- Both are Null
+ g_rec.last_pass := TRUE;
+ elsif l_sqlerrm is null OR against_exc_in is null
+ then
+ -- If both were Null, it would have been caught above.
+ -- So, only one can be Null
+ g_rec.last_pass := FALSE;
+ else
+ -- If either was Null, it would have been caught above.
+ g_rec.last_pass := nvl(l_sqlerrm like '%' || against_exc_in || '%', FALSE);
+ end if;
+ if against_exc_in is null
+ then
+ g_rec.last_details := 'No exception was expected' ||
+ '. Exception raised was "' || l_sqlerrm ||
+ '". Exception raised by: "' || check_call_in || '".';
+ elsif l_sqlerrm is null
+ then
+ g_rec.last_details := 'Expected exception "%' || against_exc_in ||
+ '%". No exception was raised by: "' || check_call_in || '".';
+ else
+ g_rec.last_details := 'Expected exception "%' || against_exc_in ||
+ '%". Actual exception raised was "' || l_sqlerrm ||
+ '". Exception raised by: "' || check_call_in || '".';
+ end if;
+ if not g_rec.last_pass
+ then
+ g_rec.last_details :=
+ substr(g_rec.last_details || ' Error Stack: ' || l_errstack, 1, 4000);
+ end if;
+ process_assertion;
+end raises;
+
+procedure raises (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in number)
+is
+begin
+ if against_exc_in is null
+ then
+ raises (
+ msg_in => msg_in,
+ check_call_in => check_call_in,
+ against_exc_in => '');
+ else
+ raises (
+ msg_in => msg_in,
+ check_call_in => check_call_in,
+ against_exc_in => '-' || lpad(abs(against_exc_in),5,'0'));
+ end if;
+end raises;
+
+procedure throws (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in varchar2)
+is
+begin
+ raises (
+ msg_in => msg_in,
+ check_call_in => check_call_in,
+ against_exc_in => against_exc_in);
+end throws;
+
+procedure throws (
+ msg_in varchar2,
+ check_call_in in varchar2,
+ against_exc_in in number)
+is
+begin
+ raises (
+ msg_in => msg_in,
+ check_call_in => check_call_in,
+ against_exc_in => against_exc_in);
+end throws;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_raises
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Raises Tests Happy Path 1';
+ raises (
+ msg_in => 'RAISES Varchar2 Test',
+ check_call_in => 'begin wt_assert.bogus; end;',
+ against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'RAISES/THROWS');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'RAISES Varchar2 Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Raises Tests Happy Path 2';
+ raises (
+ msg_in => 'RAISES Number Test',
+ check_call_in => 'begin wt_assert.bogus; end;',
+ against_exc_in => 302);
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected exception "%-00302%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
+ -------------------------------------- WTPLSQL Testing --
+ throws (
+ msg_in => 'THROWS Varchar2 Test',
+ check_call_in => 'begin wt_assert.bogus; end;',
+ against_exc_in => 'PLS-00302: component ''BOGUS'' must be declared');
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
+ -------------------------------------- WTPLSQL Testing --
+ throws (
+ msg_in => 'THROWS Number Test',
+ check_call_in => 'begin wt_assert.bogus; end;',
+ against_exc_in => 302);
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected exception "%-00302%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Raises Tests Happy Path 3';
+ raises (
+ msg_in => 'RAISES Varchar2 No Error',
+ check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
+ against_exc_in => '');
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'No exception was expected. ' ||
+ 'Exception raised was "". ' ||
+ 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
+ -------------------------------------- WTPLSQL Testing --
+ raises (
+ msg_in => 'RAISES Number No Error',
+ check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;',
+ against_exc_in => cast (null as number));
+ temp_rec := g_rec;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'No exception was expected. ' ||
+ 'Exception raised was "". ' ||
+ 'Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Raises Tests Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ raises (
+ msg_in => 'Not Used',
+ check_call_in => 'begin wt_assert.bogus; end;',
+ against_exc_in => 'Incorrect Exception');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected exception "%Incorrect Exception%". ' ||
+ 'Actual exception raised was "ORA-%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Raises Tests Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ raises (
+ msg_in => 'Not Used',
+ check_call_in => 'begin wt_assert.set_NLS_DATE_FORMAT; end;',
+ against_exc_in => 'Incorrect Exception');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected exception "%Incorrect Exception%". ' ||
+ 'No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". ' ||
+ 'Error Stack: ');
+ end t_raises;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- EQQUERYVALUE
+procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in varchar2,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+ type rc_type is ref cursor;
+ l_rc rc_type;
+ l_rc_buff varchar2(32000);
+ l_errstack varchar2(4000);
+begin
+ g_rec.last_assert := 'EQQUERYVALUE';
+ g_rec.last_msg := msg_in;
+ open l_rc for check_query_in;
+ fetch l_rc into l_rc_buff;
+ close l_rc;
+ g_rec.last_pass := ( nvl(l_rc_buff = against_value_in, FALSE)
+ or ( l_rc_buff is null
+ and against_value_in is null
+ and null_ok_in ) );
+ g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
+ '" and got "' || substr(l_rc_buff ,1,1000) ||
+ '" for Query: ' || substr(check_query_in ,1,1000) ;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+exception when others then
+ l_errstack := substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace,1,2900);
+ g_rec.last_details := 'Exception raised for Query: ' ||
+ substr(check_query_in ,1,1000) ||
+ CHR(10) || l_errstack;
+ g_rec.last_pass := FALSE;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqqueryvalue;
+
+-- EQQUERYVALUE XMLTYPE Overload
+procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in XMLTYPE,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+ type rc_type is ref cursor;
+ l_rc rc_type;
+ l_rc_buff XMLTYPE;
+ l_errstack varchar2(4000);
+begin
+ g_rec.last_assert := 'EQQUERYVALUE';
+ g_rec.last_msg := msg_in;
+ open l_rc for check_query_in;
+ fetch l_rc into l_rc_buff;
+ close l_rc;
+ g_rec.last_pass := nvl(xmltype.getclobval(l_rc_buff) =
+ xmltype.getclobval(against_value_in), FALSE);
+ g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) ||
+ '" and got "' || substr(xmltype.getclobval(l_rc_buff ),1,1000) ||
+ '" for Query: ' || substr( check_query_in ,1,1000) ;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+exception when others then
+ l_errstack := substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace,1,2900);
+ g_rec.last_details := 'Exception raised for Query: ' ||
+ substr(check_query_in ,1,1000) ||
+ CHR(10) || l_errstack;
+ g_rec.last_pass := FALSE;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqqueryvalue;
+
+-- EQQUERYVALUE CLOB Overload
+procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in CLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+ type rc_type is ref cursor;
+ l_rc rc_type;
+ l_rc_buff CLOB;
+ l_errstack varchar2(4000);
+begin
+ g_rec.last_assert := 'EQQUERYVALUE';
+ g_rec.last_msg := msg_in;
+ open l_rc for check_query_in;
+ fetch l_rc into l_rc_buff;
+ close l_rc;
+ g_rec.last_pass := ( nvl(l_rc_buff = against_value_in, FALSE)
+ or ( l_rc_buff is null
+ and against_value_in is null
+ and null_ok_in ) );
+ g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
+ '" and got "' || substr(l_rc_buff ,1,1000) ||
+ '" for Query: ' || substr(check_query_in ,1,1000) ;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+exception when others then
+ l_errstack := substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace,1,2900);
+ g_rec.last_details := 'Exception raised for Query: ' ||
+ substr(check_query_in ,1,1000) ||
+ CHR(10) || l_errstack;
+ g_rec.last_pass := FALSE;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqqueryvalue;
+
+-- EQQUERYVALUE BLOB Overload
+procedure eqqueryvalue (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_value_in in BLOB,
+ null_ok_in in boolean := false,
+ raise_exc_in in boolean := false)
+is
+ type rc_type is ref cursor;
+ l_rc rc_type;
+ l_rc_buff BLOB;
+ compare_results number;
+ l_errstack varchar2(4000);
+begin
+ g_rec.last_assert := 'EQQUERYVALUE';
+ g_rec.last_msg := msg_in;
+ open l_rc for check_query_in;
+ fetch l_rc into l_rc_buff;
+ close l_rc;
+ compare_results := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1);
+ g_rec.last_pass := ( nvl(compare_results = 0, FALSE)
+ or ( l_rc_buff is null
+ and against_value_in is null
+ and null_ok_in ) );
+ g_rec.last_details := 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
+ substr(check_query_in ,1,2000) ||
+ ', compare_results: ' || compare_results;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+exception when others then
+ l_errstack := substr(dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace,1,2900);
+ g_rec.last_details := 'Exception raised for Query: ' ||
+ substr(check_query_in ,1,1000) ||
+ CHR(10) || l_errstack;
+ g_rec.last_pass := FALSE;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqqueryvalue;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_eqqueryvalue
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select dummy from DUAL',
+ against_value_in => 'X',
+ null_ok_in => false);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQQUERYVALUE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Expected "X" and got "X" for Query: select dummy from DUAL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select max(dummy) from DUAL where 0 = 1',
+ against_value_in => '',
+ null_ok_in => true);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select dummy from DUAL',
+ against_value_in => 'Y');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select dummy from DUAL',
+ against_value_in => 'Y',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'Garbage query that won''t work',
+ against_value_in => 'Y');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details like
+ 'Exception raised for Query: Garbage query that won''t work' ||
+ CHR(10) || 'ORA-00900: invalid SQL statement%');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select temp_xml from wt_self_test where id = 1',
+ against_value_in => temp_xml1);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQQUERYVALUE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_xml from wt_self_test where id = 1',
+ against_value_in => temp_xml2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "<?xml version="1.0" encoding="UTF-8"?>' ||
+ '<note>2</note>" and got "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_xml from wt_self_test where id = 1',
+ against_value_in => temp_xml2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'Garbage query that won''t work',
+ against_value_in => temp_xml2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details like
+ 'Exception raised for Query: Garbage query that won''t work' ||
+ CHR(10) || 'ORA-00900: invalid SQL statement%');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select temp_clob from wt_self_test where id = 1',
+ against_value_in => temp_clob1,
+ null_ok_in => false);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQQUERYVALUE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select temp_clob from wt_self_test where 0 = 1',
+ against_value_in => '',
+ null_ok_in => true);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_clob from wt_self_test where id = 1',
+ against_value_in => temp_clob2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected "This is another clob." and got "' ||
+ '<?xml version="1.0" encoding="UTF-8"?>%'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_clob from wt_self_test where id = 1',
+ against_value_in => temp_clob2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'Garbage query that won''t work',
+ against_value_in => temp_clob2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details like
+ 'Exception raised for Query: Garbage query that won''t work' ||
+ CHR(10) || 'ORA-00900: invalid SQL statement%');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select temp_blob from wt_self_test where id = 1',
+ against_value_in => temp_blob1,
+ null_ok_in => false);
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQQUERYVALUE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query:' ||
+ ' select temp_blob from wt_self_test where id = 1, compare_results: 0');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2';
+ eqqueryvalue (
+ msg_in => 'Run Test',
+ check_query_in => 'select temp_blob from wt_self_test where 0 = 1',
+ against_value_in => cast (null as BLOB),
+ null_ok_in => true);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_blob from wt_self_test where id = 1',
+ against_value_in => temp_blob2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
+ 'select temp_blob from wt_self_test where id = 1, compare_results: -1');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'select temp_blob from wt_self_test where id = 1',
+ against_value_in => temp_blob2,
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqqueryvalue (
+ msg_in => 'Not Used',
+ check_query_in => 'Garbage query that won''t work',
+ against_value_in => temp_blob2);
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details like
+ 'Exception raised for Query: Garbage query that won''t work' ||
+ CHR(10) || 'ORA-00900: invalid SQL statement%');
+ end t_eqqueryvalue;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure eqquery (
+ msg_in in varchar2,
+ check_query_in in varchar2,
+ against_query_in in varchar2,
+ raise_exc_in in boolean := false)
+is
+begin
+ g_rec.last_assert := 'EQQUERY';
+ g_rec.last_msg := msg_in;
+ compare_queries(check_query_in, against_query_in);
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqquery;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_eqquery
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1';
+ wt_assert.eqquery (
+ msg_in => 'Run Test',
+ check_query_in => 'select * from USER_TABLES',
+ against_query_in => 'select * from USER_TABLES');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQQUERY');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'EQQUERY Tests Happy Path 1b g_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Comparison Query: %'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqquery (
+ msg_in => 'Not Used',
+ check_query_in => 'select * from USER_TABLES',
+ against_query_in => 'select * from USER_TABLES where 0 = 1');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Comparison Query: %'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqquery (
+ msg_in => 'Not Used',
+ check_query_in => 'select * from USER_TABLES',
+ against_query_in => 'select * from USER_TABLES where 0 = 1',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqquery (
+ msg_in => 'Not Used',
+ check_query_in => 'select * from USER_TABLES',
+ against_query_in => 'select * from ALL_TABLES');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ '%PL/SQL: ORA-01789: query block has incorrect number of result columns%'));
+ end t_eqquery;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure eqtable (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ check_where_in in varchar2 := null,
+ against_where_in in varchar2 := null,
+ raise_exc_in in boolean := false)
+is
+ l_check_query varchar2(16000) := 'select * from ' || check_this_in;
+ l_against_query varchar2(16000) := 'select * from ' || against_this_in;
+begin
+ g_rec.last_assert := 'EQTABLE';
+ g_rec.last_msg := msg_in;
+ if check_where_in is not null
+ then
+ l_check_query := l_check_query || ' where ' || check_where_in;
+ end if;
+ if against_where_in is not null
+ then
+ l_against_query := l_against_query || ' where ' || against_where_in;
+ end if;
+ compare_queries(l_check_query, l_against_query);
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqtable;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_eqtable
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1';
+ wt_assert.eqtable (
+ msg_in => 'Run Test',
+ check_this_in => 'USER_TABLES',
+ against_this_in => 'USER_TABLES',
+ check_where_in => '',
+ against_where_in => '');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQTABLE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Comparison Query: %'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2';
+ eqtable (
+ msg_in => 'Run Test',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''' || USER || '''',
+ against_where_in => 'owner = ''' || USER || '''');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABLE Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqtable (
+ msg_in => 'Not Used',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''' || USER || '''',
+ against_where_in => '0 = 1');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Comparison Query: %'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABLE Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqtable (
+ msg_in => 'Not Used',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''' || USER || '''',
+ against_where_in => '0 = 1',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABLE Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqtable (
+ msg_in => 'Not Used',
+ check_this_in => 'USER_TABLES',
+ against_this_in => 'ALL_TABLES');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details like
+ '%PL/SQL: ORA-01789: query block has incorrect number of result columns%');
+ end t_eqtable;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure eqtabcount (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ against_this_in in varchar2,
+ check_where_in in varchar2 := null,
+ against_where_in in varchar2 := null,
+ raise_exc_in in boolean := false)
+is
+ l_query varchar2(16000) := 'select count(*) from ' || check_this_in;
+ l_cnt number;
+ l_success boolean;
+ l_check_cnt number;
+ procedure l_run_query is
+ type rc_type is ref cursor;
+ l_rc rc_type;
+ begin
+ open l_rc for l_query;
+ fetch l_rc into l_cnt;
+ close l_rc;
+ l_success := TRUE;
+ exception
+ when OTHERS
+ then
+ g_rec.last_details := SQLERRM || CHR(10) ||
+ 'FAILURE of Compare Query: ' || l_query || ';';
+ g_rec.last_pass := FALSE;
+ l_success := FALSE;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+ end l_run_query;
+begin
+ g_rec.last_assert := 'EQTABCOUNT';
+ g_rec.last_msg := msg_in;
+ --
+ l_query := 'select count(*) from ' || check_this_in;
+ if check_where_in is not null
+ then
+ l_query := l_query || ' where ' || check_where_in;
+ end if;
+ l_run_query;
+ if NOT l_success then return; end if;
+ l_check_cnt := l_cnt;
+ --
+ l_query := 'select count(*) from ' || against_this_in;
+ if against_where_in is not null
+ then
+ l_query := l_query || ' where ' || against_where_in;
+ end if;
+ l_run_query;
+ if NOT l_success then return; end if;
+ g_rec.last_pass := nvl(l_check_cnt = l_cnt, FALSE);
+ --
+ g_rec.last_details := 'Expected ' || l_cnt || ' rows from "' || against_this_in ||
+ '" and got ' || l_check_cnt || ' rows from "' || check_this_in ||
+ '"';
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end eqtabcount;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_eqtabcount
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1';
+ eqtabcount (
+ msg_in => 'Run Test',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''' || USER || '''',
+ against_where_in => 'owner = ''' || USER || '''');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'EQTABCOUNT');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected % rows from "ALL_TABLES"' ||
+ ' and got % rows from "ALL_TABLES"'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2';
+ eqtabcount (
+ msg_in => 'Run Test',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'USER_TABLES',
+ check_where_in => 'owner = ''' || USER || '''',
+ against_where_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ eqtabcount (
+ msg_in => 'Not Used',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''JOHN DOE''',
+ against_where_in => 'owner = ''' || USER || '''');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected % rows from "ALL_TABLES" and ' ||
+ 'got % rows from "ALL_TABLES"'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ eqtabcount (
+ msg_in => 'Not Used',
+ check_this_in => 'ALL_TABLES',
+ against_this_in => 'ALL_TABLES',
+ check_where_in => 'owner = ''JOHN DOE''',
+ against_where_in => 'owner = ''' || USER || '''',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3';
+ wtplsql_skip_save := TRUE;
+ eqtabcount (
+ msg_in => 'Not Used',
+ check_this_in => 'USER_TABLES',
+ against_this_in => 'USER_TAB_COLUMNS');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ 'Expected % rows from "USER_TAB_COLUMNS" and got % rows from "USER_TABLES"'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4';
+ wtplsql_skip_save := TRUE;
+ eqtabcount (
+ msg_in => 'Not Used',
+ check_this_in => 'BOGUS1',
+ against_this_in => 'BOGUS2');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.isnotnull (
+ msg_in => 'temp_rec.last_details value',
+ check_this_in => temp_rec.last_details);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => (temp_rec.last_details like
+ '%table or view does not exist%'));
+ wt_assert.this (
+ msg_in => 'temp_rec.last_details 2',
+ check_this_in => (temp_rec.last_details like
+ '%FAILURE of Compare Query%'));
+ end t_eqtabcount;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure objexists (
+ msg_in in varchar2,
+ obj_owner_in in varchar2,
+ obj_name_in in varchar2,
+ obj_type_in in varchar2 default null,
+ raise_exc_in in boolean := false)
+is
+ l_num_objects number;
+begin
+ g_rec.last_assert := 'OBJEXISTS';
+ g_rec.last_msg := msg_in;
+ select count(*) into l_num_objects
+ from all_objects
+ where object_name = obj_name_in
+ and ( obj_owner_in is null
+ or obj_owner_in = owner)
+ and ( obj_type_in is null
+ or obj_type_in = object_type);
+ g_rec.last_pass := case l_num_objects when 0 then FALSE else TRUE end;
+ g_rec.last_details := 'Number of objects found for "' ||
+ case when obj_owner_in is null then ''
+ else obj_owner_in || '.' end ||
+ obj_name_in || '"' ||
+ case when obj_type_in is null then ''
+ else '(' || obj_type_in || ')' end ||
+ ' is ' || l_num_objects;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end objexists;
+
+-- Concatenated SCHEMA_NAME.OBJECT_NAME
+procedure objexists (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+ l_pos number := instr(check_this_in, '.');
+begin
+ objexists(msg_in => msg_in
+ ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
+ ,obj_name_in => substr(check_this_in, l_pos+1, length(check_this_in)));
+end objexists;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_object_exists
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Happy Path 1';
+ objexists (
+ msg_in => 'Run Test',
+ obj_owner_in => 'SYS',
+ obj_name_in => 'DUAL');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'OBJEXISTS');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Happy Path 2';
+ objexists (
+ msg_in => 'Run Test',
+ obj_owner_in => 'SYS',
+ obj_name_in => 'DUAL',
+ obj_type_in => 'TABLE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Happy Path 3';
+ objexists (
+ msg_in => 'Run Test',
+ check_this_in => 'SYS.DUAL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Happy Path 4';
+ objexists (
+ msg_in => 'Run Test',
+ check_this_in => 'DUAL');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ objexists (
+ msg_in => 'Not Used',
+ obj_owner_in => 'JOE SMITH',
+ obj_name_in => 'BOGUS');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Number of objects found for "JOE SMITH.BOGUS" is 0');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJEXISTS Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ objexists (
+ msg_in => 'Not Used',
+ obj_owner_in => 'JOE SMITH',
+ obj_name_in => 'BOGUS',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ end t_object_exists;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure objnotexists (
+ msg_in in varchar2,
+ obj_owner_in in varchar2,
+ obj_name_in in varchar2,
+ obj_type_in in varchar2 default null,
+ raise_exc_in in boolean := false)
+is
+ l_num_objects number;
+begin
+ g_rec.last_assert := 'OBJNOTEXISTS';
+ g_rec.last_msg := msg_in;
+ select count(*) into l_num_objects
+ from all_objects
+ where object_name = obj_name_in
+ and ( obj_owner_in is null
+ or obj_owner_in = owner)
+ and ( obj_type_in is null
+ or obj_type_in = object_type);
+ g_rec.last_pass := case l_num_objects when 0 then TRUE else FALSE end;
+ g_rec.last_details := 'Number of objects found for "' ||
+ case when obj_owner_in is null then ''
+ else obj_owner_in || '.' end ||
+ obj_name_in || '"' ||
+ case when obj_type_in is null then ''
+ else '(' || obj_type_in || ')' end ||
+ ' is ' || l_num_objects;
+ g_rec.raise_exception := raise_exc_in;
+ process_assertion;
+end objnotexists;
+
+-- Concatenated SCHEMA_NAME.OBJECT_NAME
+procedure objnotexists (
+ msg_in in varchar2,
+ check_this_in in varchar2,
+ null_ok_in in boolean := false, -- Not Used, utPLSQL V1 API
+ raise_exc_in in boolean := false)
+is
+ l_pos number := instr(check_this_in, '.');
+begin
+ objnotexists(msg_in => msg_in
+ ,obj_owner_in => substr(check_this_in, 1, l_pos-1)
+ ,obj_name_in => substr(check_this_in, l_pos+1, length(check_this_in)));
+end objnotexists;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_object_not_exists
+ is
+ l_found_exception BOOLEAN;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1';
+ objnotexists (
+ msg_in => 'Run Test',
+ obj_owner_in => 'BOGUS',
+ obj_name_in => 'THING123');
+ temp_rec := g_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => TRUE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_assert',
+ check_this_in => temp_rec.last_assert,
+ against_this_in => 'OBJNOTEXISTS');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_msg',
+ check_this_in => temp_rec.last_msg,
+ against_this_in => 'Run Test');
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Number of objects found for "BOGUS.THING123" is 0');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2';
+ objnotexists (
+ msg_in => 'Run Test',
+ obj_owner_in => 'BOGUS',
+ obj_name_in => 'THING123',
+ obj_type_in => 'PACKAGE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3';
+ objnotexists (
+ msg_in => 'Run Test',
+ check_this_in => 'BOGUS.THING123');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1';
+ wtplsql_skip_save := TRUE;
+ objnotexists (
+ msg_in => 'Not Used',
+ obj_owner_in => 'SYS',
+ obj_name_in => 'DUAL');
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_details',
+ check_this_in => temp_rec.last_details,
+ against_this_in => 'Number of objects found for "SYS.DUAL" is 1');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2';
+ wtplsql_skip_save := TRUE;
+ begin
+ objnotexists (
+ msg_in => 'Not Used',
+ obj_owner_in => 'SYS',
+ obj_name_in => 'DUAL',
+ raise_exc_in => TRUE);
+ l_found_exception := FALSE;
+ exception when ASSERT_FAILURE_EXCEPTION then
+ l_found_exception := TRUE;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ temp_rec := g_rec;
+ wtplsql_skip_save := FALSE;
+ wt_assert.eq (
+ msg_in => 'temp_rec.last_pass',
+ check_this_in => temp_rec.last_pass,
+ against_this_in => FALSE);
+ wt_assert.eq (
+ msg_in => 'RAISE_EXC_IN Test, Exception Raised?',
+ check_this_in => l_found_exception,
+ against_this_in => TRUE);
+ end t_object_not_exists;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ -- Can't profile this package because all the "assert" tests
+ -- pause profiling before they execute.
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'WT_ASSERT:PACKAGE BODY';
+ hook.g_run_assert_hook := FALSE;
+ select temp_clob, temp_nclob, temp_xml, temp_blob
+ into temp_clob1, temp_nclob1, temp_xml1, temp_blob1
+ from wt_self_test where id = 1;
+ -------------------------------------- WTPLSQL Testing --
+ t_boolean_to_status;
+ t_process_assertion;
+ t_compare_queries;
+ t_nls_settings;
+ t_last_values;
+ t_reset_globals;
+ t_this;
+ t_eq;
+ -------------------------------------- WTPLSQL Testing --
+ t_isnotnull;
+ t_isnull;
+ t_raises;
+ t_eqqueryvalue;
+ t_eqquery;
+ t_eqtable;
+ t_eqtabcount;
+ t_object_exists;
+ t_object_not_exists;
+ -------------------------------------- WTPLSQL Testing --
+ hook.g_run_assert_hook := TRUE;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_assert;
+
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+UTASSERT
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_ASSERT
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+E540BEB4-86FF-0BEC-4B75-E54681F8A22B
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_ASSERT
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_ASSERT
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+E540BEB4-86FF-0BEC-4B75-E54681F8A22B
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E5574115-D3BA-C77B-8636-9843AEC95537.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E5574115-D3BA-C77B-8636-9843AEC95537.xml
new file mode 100644
index 0000000..4b75b5a
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Package/seg_0/E5574115-D3BA-C77B-8636-9843AEC95537.xml
@@ -0,0 +1,268 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+HOOK
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE WTP.HOOK
+ authid definer
+as
+
+ procedure run
+ (in_hook_name in varchar2);
+
+ procedure init;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ g_run_assert_hook boolean := TRUE;
+ g_test_hook_msg varchar2(4000);
+ --
+ procedure test_hook
+ (in_msg in varchar2);
+ procedure WTPLSQL_RUN;
+ $END
+
+end hook;
+
+wtp@DEVPDB_localhost
+WTP
+HOOK
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PACKAGE BODY WTP.HOOK
+as
+
+ TYPE run_nt_type is table
+ of hooks%ROWTYPE;
+ TYPE run_aa_type is table
+ of run_nt_type
+ index by varchar2(20);
+ g_run_aa run_aa_type;
+
+----------------------
+-- Private Procedures
+----------------------
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure run
+ (in_hook_name in varchar2)
+is
+ l_error_stack varchar2(32000);
+begin
+ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+ $THEN
+ if NOT g_run_assert_hook
+ AND in_hook_name = 'after_assertion'
+ then
+ return;
+ end if;
+ $END ------%WTPLSQL_end_ignore_lines%------
+ if NOT g_run_aa.EXISTS(in_hook_name)
+ then
+ --dbms_output.put_line('No hook for ' || in_hook_name);
+ return;
+ end if;
+ for i in 1 .. g_run_aa(in_hook_name).COUNT
+ loop
+ begin
+ execute immediate g_run_aa(in_hook_name)(i).run_string;
+ exception when OTHERS then
+ l_error_stack := 'Hook Error in "' || in_hook_name ||
+ '", SEQ ' || g_run_aa(in_hook_name)(i).seq ||
+ '.' || CHR(10) ||
+ dbms_utility.format_error_stack ||
+ dbms_utility.format_error_backtrace;
+ core_data.run_error(l_error_stack);
+ end;
+ end loop;
+end run;
+
+------------------------------------------------------------
+procedure init
+is
+ l_run_nt run_nt_type;
+begin
+ g_run_aa.DELETE;
+ for buff in (
+ select hook_name
+ from hooks
+ group by hook_name )
+ loop
+ select * bulk collect into l_run_nt
+ from hooks
+ where hook_name = buff.hook_name
+ order by hooks.seq;
+ if SQL%FOUND
+ then
+ g_run_aa(buff.hook_name) := l_run_nt;
+ end if;
+ end loop;
+end init;
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ -------------------------------------- WTPLSQL Testing --
+ procedure test_hook
+ (in_msg in varchar2)
+ is
+ begin
+ g_test_hook_msg := in_msg;
+ end test_hook;
+ -------------------------------------- WTPLSQL Testing --
+ procedure WTPLSQL_RUN
+ is
+ TYPE hooks_nt_type is table of hooks%ROWTYPE;
+ l_hooks_ntSAVE hooks_nt_type;
+ TYPE hname_nt_type is table of hooks.hook_name%TYPE;
+ l_hname_nt hname_nt_type;
+ l_hooks_rec hooks%ROWTYPE;
+ l_err_msgSAVE core_data.g_run_rec.error_message%TYPE;
+ l_err_msgTEST core_data.g_run_rec.error_message%TYPE;
+ num_recs number;
+ begin
+ wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY';
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Setup';
+ g_run_assert_hook := FALSE;
+ select count(*) into num_recs from hooks;
+ wt_assert.isnotnull
+ (msg_in => 'Number of records before setup'
+ ,check_this_in => num_recs);
+ -------------------------------------- WTPLSQL Testing --
+ l_hname_nt := hname_nt_type('before_test_all'
+ ,'before_test_run'
+ ,'execute_test_runner'
+ ,'after_assertion'
+ ,'after_test_run'
+ ,'after_test_all'
+ ,'ad_hoc_report');
+ select * bulk collect into l_hooks_ntSAVE from hooks;
+ delete from hooks;
+ -------------------------------------- WTPLSQL Testing --
+ l_hooks_rec.seq := 1;
+ l_hooks_rec.description := 'WTPLSQL Self Test';
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ l_hooks_rec.hook_name := l_hname_nt(i);
+ l_hooks_rec.run_string := 'begin hook.test_hook(''' ||
+ l_hname_nt(i) || '''); end;';
+ insert into hooks values l_hooks_rec;
+ end loop;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => l_hname_nt.COUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'All Hooks On';
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ g_test_hook_msg := '';
+ g_run_assert_hook := TRUE;
+ hook.run(l_hname_nt(i));
+ g_run_assert_hook := FALSE;
+ wt_assert.eq
+ (msg_in => l_hname_nt(i) || ' is active'
+ ,check_this_in => g_test_hook_msg
+ ,against_this_in => l_hname_nt(i));
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'All Hooks Off';
+ delete from hooks;
+ commit;
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records 2'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ g_test_hook_msg := '';
+ hook.run(l_hname_nt(i));
+ wt_assert.isnull
+ (msg_in => l_hname_nt(i) || ' is not active'
+ ,check_this_in => g_test_hook_msg);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Hooks Sad Path 1';
+ l_hooks_rec.seq := 1;
+ l_hooks_rec.description := 'WTPLSQL Self Test';
+ l_hooks_rec.hook_name := 'ad_hoc_report';
+ l_hooks_rec.run_string := 'declare n1 number; begin n1:=1/0; end;';
+ insert into hooks values l_hooks_rec;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => 1);
+ init;
+ wt_assert.isnull
+ (msg_in => 'core_data.g_run_rec.error_message'
+ ,check_this_in => core_data.g_run_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ l_err_msgSAVE := core_data.g_run_rec.error_message;
+ core_data.g_run_rec.error_message := '';
+ wt_assert.raises
+ (msg_in => 'Test Exception Handler'
+ ,check_call_in => 'begin hook.run(''ad_hoc_report''); end;'
+ ,against_exc_in => '');
+ l_err_msgTEST := core_data.g_run_rec.error_message;
+ core_data.g_run_rec.error_message := l_err_msgSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'Confirm core_data.run_error'
+ ,check_this_in => l_err_msgTEST);
+ wt_assert.this
+ (msg_in => 'l_err_msgTEST like ''Hook Error in "ad_hoc_report", SEQ 1.' || '\n' ||
+ 'ORA-01476: divisor is equal to zero' || '\n' ||
+ 'ORA-06512: at line 1%'''
+ ,check_this_in => l_err_msgTEST like 'Hook Error in "ad_hoc_report", SEQ 1.' || CHR(10) ||
+ 'ORA-01476: divisor is equal to zero' || CHR(10) ||
+ 'ORA-06512: at line 1%');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Teardown';
+ delete from hooks;
+ forall i in 1 .. l_hooks_ntSAVE.COUNT
+ insert into hooks values l_hooks_ntSAVE(i);
+ commit;
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of records after teardown'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => num_recs);
+ g_run_assert_hook := TRUE;
+ end WTPLSQL_RUN;
+
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+------------------------------------------------------------
+------%WTPLSQL_begin_ignore_lines%------ Can't Test This
+begin
+ init;
+end hook;
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml
new file mode 100644
index 0000000..dbf1b54
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/47E390DE-0671-C4B1-8428-0F45CBEE18F8.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:08:09 UTC
+Main
+MDSYS
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml
new file mode 100644
index 0000000..5678519
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/SType/seg_0/F72C39E0-D1CA-8821-2AD7-A1E95A37D3D1.xml
@@ -0,0 +1,6 @@
+
+
+duane
+2024-04-10 19:08:09 UTC
+Main
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/9ABA10BC-E32C-519C-DEC0-04F084280A2E.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/9ABA10BC-E32C-519C-DEC0-04F084280A2E.xml
new file mode 100644
index 0000000..4133f4c
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/9ABA10BC-E32C-519C-DEC0-04F084280A2E.xml
@@ -0,0 +1,10 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+255
+65536
+2147483645
+1048576
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/CB5DC202-4437-7272-A4FF-0AA23BAB0E6F.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/CB5DC202-4437-7272-A4FF-0AA23BAB0E6F.xml
new file mode 100644
index 0000000..0e84a58
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Segment/seg_0/CB5DC202-4437-7272-A4FF-0AA23BAB0E6F.xml
@@ -0,0 +1,11 @@
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+2
+255
+65536
+2147483645
+1048576
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/34ED7000-05C9-7E39-BA89-0D9F3EE57147.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/34ED7000-05C9-7E39-BA89-0D9F3EE57147.xml
new file mode 100644
index 0000000..e57ecd8
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/34ED7000-05C9-7E39-BA89-0D9F3EE57147.xml
@@ -0,0 +1,14 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASES_SEQ
+duane
+2024-04-10 19:09:11 UTC
+Main
+20
+1
+9999999999999999999999999999
+1
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/76C4919A-C6EC-E9CB-295E-FC5F7A9D6CBB.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/76C4919A-C6EC-E9CB-295E-FC5F7A9D6CBB.xml
new file mode 100644
index 0000000..e030886
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/76C4919A-C6EC-E9CB-295E-FC5F7A9D6CBB.xml
@@ -0,0 +1,14 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_DBOUTS_SEQ
+duane
+2024-04-10 19:09:11 UTC
+Main
+20
+1
+9999999999999999999999999999
+1
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/C9725AFA-3D17-2B47-2FC4-82A3C54A04E7.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/C9725AFA-3D17-2B47-2FC4-82A3C54A04E7.xml
new file mode 100644
index 0000000..94dbe93
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/C9725AFA-3D17-2B47-2FC4-82A3C54A04E7.xml
@@ -0,0 +1,14 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+PLSQL_PROFILER_RUNNUMBER
+duane
+2024-04-10 19:09:11 UTC
+Main
+1
+9999999999999999999999999999
+1
+YES
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/D21D0B42-D3AB-93D4-7A95-C16EB182CCFE.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/D21D0B42-D3AB-93D4-7A95-C16EB182CCFE.xml
new file mode 100644
index 0000000..58ea05b
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/D21D0B42-D3AB-93D4-7A95-C16EB182CCFE.xml
@@ -0,0 +1,15 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNS_SEQ
+duane
+2024-04-10 19:09:11 UTC
+Main
+20
+1
+9999999999999999999999999999
+1
+YES
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/F71B0A5C-BFA1-1D6A-A12C-8EED7B7B0785.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/F71B0A5C-BFA1-1D6A-A12C-8EED7B7B0785.xml
new file mode 100644
index 0000000..53c279d
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Sequence/seg_0/F71B0A5C-BFA1-1D6A-A12C-8EED7B7B0785.xml
@@ -0,0 +1,15 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNNERS_SEQ
+duane
+2024-04-10 19:09:11 UTC
+Main
+20
+1
+9999999999999999999999999999
+1
+YES
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/52B10B9D-540A-14A5-4425-5F33BEF76415.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/52B10B9D-540A-14A5-4425-5F33BEF76415.xml
new file mode 100644
index 0000000..f7b7cd6
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/52B10B9D-540A-14A5-4425-5F33BEF76415.xml
@@ -0,0 +1,43 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_AD_HOC_REPORT
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PROCEDURE WTP.WT_AD_HOC_REPORT
+ authid current_user
+ -- AUTHID CURRENT_USER is required for assertions with
+ -- dynamic PL/SQL execution.
+is
+begin
+ dbms_output.put_line(wt_assert.g_rec.last_msg);
+ dbms_output.put_line(' Assertion ' || wt_assert.g_rec.last_assert ||
+ case wt_assert.last_pass
+ when TRUE then ' PASSED.'
+ else ' FAILED.'
+ end);
+ if wt_assert.g_testcase is not null
+ then
+ dbms_output.put_line(' Testcase: ' || wt_assert.g_testcase);
+ end if;
+ dbms_output.put_line( ' ' || wt_assert.g_rec.last_details);
+end wt_ad_hoc_report;
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_AD_HOC_REPORT
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_AD_HOC_REPORT
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+52B10B9D-540A-14A5-4425-5F33BEF76415
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/81A99C6A-CD5F-82BB-64DD-096AB242711A.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/81A99C6A-CD5F-82BB-64DD-096AB242711A.xml
new file mode 100644
index 0000000..a3343dd
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/81A99C6A-CD5F-82BB-64DD-096AB242711A.xml
@@ -0,0 +1,113 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+JUNIT_XML_PERSIST_ALL
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PROCEDURE WTP.JUNIT_XML_PERSIST_ALL
+is
+ procedure p (in_line in varchar2) is
+ begin
+ DBMS_OUTPUT.PUT_LINE(in_line);
+ end p;
+begin
+ p('<?xml version="1.0" encoding="UTF-8"?>');
+ p('<!-- http://dmdiet.com - Adapted to SQLDeveloper Unit Test Utility -->');
+ p('<!-- http://nelsonwells.net/2012/09/how-jenkins-ci-parses-and-displays-junit-output/ -->');
+ p('<!-- Jenkins identifies the failed tests as {package}.{class}.{test}. -->');
+ p('<testsuites>');
+ for suites in (
+ select run.start_dtm
+ ,run.end_dtm
+ ,run.id
+ ,tr.owner || '.' || tr.name SUITE_NAME
+ ,nvl(db.owner, tr.owner) PACKAGE_NAME
+ ,case when db.name || db.type is null
+ then 'TEST_RUNNER'
+ else db.name || ':' || db.type
+ end CLASS_NAME
+ ,run.tc_cnt
+ ,run.tc_fail
+ ,extract(day from (run.end_dtm -
+ run.start_dtm) * 86400000)
+ TOT_INTERVAL_MSEC
+ ,run.error_message
+ from wt_test_runs run
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id
+ left join wt_dbouts db
+ on db.id = run.dbout_id
+ where run.is_last_run = wt_test_run.get_last_run_flag
+ order by run.start_dtm, run.id )
+ loop
+ p(' <testsuite name="' || suites.suite_name ||
+ '" tests="' || suites.tc_cnt ||
+ '" failures="' || suites.tc_fail ||
+ '" time="' || suites.tot_interval_msec ||
+ '" timestamp="' || to_char(suites.start_dtm,'YYYY-MM-DD"T"HH24:MI:SS') ||
+ '">' );
+ for cases in (
+ select run.id
+ ,tc.testcase
+ ,tcr.testcase_id
+ ,tcr.asrt_cnt ASSERTS
+ ,tcr.asrt_fail FAILURES
+ ,nvl(tcr.asrt_tot_msec
+ ,suites.tot_interval_msec) TOT_INTERVAL_MSEC
+ from wt_test_runs run
+ left join wt_testcase_runs tcr
+ on tcr.test_run_id = run.id
+ left join wt_testcases tc
+ on tc.id = tcr.testcase_id
+ where run.id = suites.id
+ order by testcase )
+ loop
+ if nvl(cases.failures,1) = 0
+ and suites.error_message is null
+ then
+ p(' <testcase name="' || nvl(cases.testcase,'NULL') ||
+ '" classname="' || suites.suite_name ||
+ '" time="' || cases.tot_interval_msec || '"/>');
+ else
+ p(' <testcase name="' || nvl(cases.testcase,'NULL') ||
+ '" classname="' || suites.package_name || '.' || suites.class_name ||
+ '" time="' || cases.tot_interval_msec || '">');
+ p(' <error message="' || nvl(to_char(cases.failures),'No') || ' assertion failures. ' ||
+ suites.error_message || '">');
+ -- Print each of the non-passing results
+ for asrts in (
+ select wtr.result_seq
+ ,wtr.status
+ ,wtr.interval_msec
+ ,wtr.message
+ ,wtr.assertion
+ ,wtr.details
+ from wt_results wtr
+ where wtr.test_run_id = suites.id
+ and ( ( cases.testcase_id is null
+ and wtr.testcase_id is null)
+ or wtr.testcase_id = cases.testcase_id)
+ and wtr.status != 'PASS'
+ order by wtr.result_seq )
+ loop
+ p(lpad(asrts.result_seq,4) || ': ' ||
+ rpad(asrts.status,4) || ' ' ||
+ lpad(asrts.interval_msec,4) || 'ms ' ||
+ asrts.message || '. ' ||
+ asrts.assertion || ' - ' ||
+ replace(replace(asrts.details
+ ,CHR(13),'\r')
+ ,CHR(10),'\n') || '.' );
+ end loop;
+ p(' </error>');
+ p(' </testcase>');
+ end if;
+ end loop;
+ end loop;
+ p(' </testsuite>');
+ p('</testsuites>');
+end junit_xml_persist_all;
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/C4884317-FB22-4CE6-0CA7-1154121979D9.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/C4884317-FB22-4CE6-0CA7-1154121979D9.xml
new file mode 100644
index 0000000..6d947e7
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/StProc/seg_0/C4884317-FB22-4CE6-0CA7-1154121979D9.xml
@@ -0,0 +1,37 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_EXECUTE_TEST_RUNNER
+duane
+2024-04-10 19:09:28 UTC
+Main
+
+CREATE OR REPLACE PROCEDURE WTP.WT_EXECUTE_TEST_RUNNER
+ authid current_user
+ -- AUTHID CURRENT_USER is required for assertions with
+ -- dynamic PL/SQL execution.
+is
+ sql_txt varchar2(4000);
+begin
+ sql_txt := 'begin "' || core_data.g_run_rec.test_runner_name ||
+ '".' || wtplsql.C_RUNNER_ENTRY_POINT || '; end;';
+ --dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+end wt_execute_test_runner;
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_EXECUTE_TEST_RUNNER
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_EXECUTE_TEST_RUNNER
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+C4884317-FB22-4CE6-0CA7-1154121979D9
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/TSpace/seg_0/D5F08164-B74B-C1FD-B26F-24B803D8279B.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/TSpace/seg_0/D5F08164-B74B-C1FD-B26F-24B803D8279B.xml
new file mode 100644
index 0000000..a9a6fcd
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/TSpace/seg_0/D5F08164-B74B-C1FD-B26F-24B803D8279B.xml
@@ -0,0 +1,17 @@
+
+
+wtp@DEVPDB_localhost
+USERS
+duane
+2024-04-10 19:09:11 UTC
+Main
+65536
+2147483645
+0
+LOCAL
+65536
+NOCOMPRESS
+NO
+SMALLFILE
+NO
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml
new file mode 100644
index 0000000..aabdab5
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml
@@ -0,0 +1,83 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+0
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml
new file mode 100644
index 0000000..dd83a16
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml
@@ -0,0 +1,109 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+NOCACHE
+NO
+YES
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+NOCACHE
+8192
+TEMP_CLOB
+NO
+KEEP_DUPLICATES
+YES
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+SECUREFILE
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+NOCACHE
+8192
+TEMP_NCLOB
+NO
+KEEP_DUPLICATES
+YES
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+SECUREFILE
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+NOCACHE
+8192
+TEMP_BLOB
+NO
+KEEP_DUPLICATES
+YES
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+SECUREFILE
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+CC6EA31D-8C6D-43CA-48AD-647942BF5D40
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml
new file mode 100644
index 0000000..c29f13b
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml
@@ -0,0 +1,110 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+3BC086E6-141B-F03D-5CC3-72D78263FAFD
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml
new file mode 100644
index 0000000..d5af127
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml
@@ -0,0 +1,87 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+DB57788D-3B52-806E-A715-3DD110D30DC7
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml
new file mode 100644
index 0000000..290d6ad
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml
@@ -0,0 +1,71 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+57364B35-063C-7D55-AB08-72AA47779E52
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+D60F8FA2-B8FA-3E87-0E6C-E1AB31EEDFF3
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml
new file mode 100644
index 0000000..1891337
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml
@@ -0,0 +1,81 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+systimestamp
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+wtp@DEVPDB_localhost
+PUBLIC
+WT_VERSION
+duane
+2024-04-10 19:09:28 UTC
+Main
+WT_VERSIONS
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+YES
+PUBLIC
+7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+29A8968B-73C4-A947-E56A-CB653A6D0182
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml
new file mode 100644
index 0000000..0e0530e
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml
@@ -0,0 +1,138 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+279A4402-57A7-30E7-A5C2-9FA6CE0E5B86
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+5854E86D-CA12-D05E-5A4F-703318A938A3
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml
new file mode 100644
index 0000000..f3f13ef
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml
@@ -0,0 +1,189 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+B507F811-AF7E-FE87-42B9-7D0724206D16
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+85ABE586-CE1F-F626-A3E3-FFEA98E00E26
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml
new file mode 100644
index 0000000..ac5bca8
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml
@@ -0,0 +1,105 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+6AF8B7A9-46A4-BE5E-A760-85F2174DD48A
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml
new file mode 100644
index 0000000..cfc5beb
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml
@@ -0,0 +1,92 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:26 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml
new file mode 100644
index 0000000..b3edf1f
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml
@@ -0,0 +1,85 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml
new file mode 100644
index 0000000..bda7d6b
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml
@@ -0,0 +1,60 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+93AA493D-C723-42F3-1B2F-B9D20027DF7F
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml
new file mode 100644
index 0000000..da81f65
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml
@@ -0,0 +1,76 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+AC6B7B7D-E083-B836-BC78-86E1476C5BF0
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+F270B202-046E-38BE-3A39-3285F13DBBCA
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml
new file mode 100644
index 0000000..d6b2bee
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml
@@ -0,0 +1,89 @@
+
+
+duane
+2024-04-10 19:09:16 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+YES
+DISABLE
+9ABA10BC-E32C-519C-DEC0-04F084280A2E
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+false
+oracle_loader
+
+NO
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+duane
+2024-04-10 19:09:17 UTC
+Main
+
+
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+duane
+2024-04-10 19:09:21 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+2C2E601F-2BF6-032F-AD32-F023AFB88417
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
+
+duane
+2024-04-10 19:09:23 UTC
+Main
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+2A8838C5-C51F-648F-3E04-0142CD1D810B
+CB5DC202-4437-7272-A4FF-0AA23BAB0E6F
+SORTED
+BY INDEX NAME
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Trigger/seg_0/606CC829-B100-400E-EE10-15915642CD1D.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Trigger/seg_0/606CC829-B100-400E-EE10-15915642CD1D.xml
new file mode 100644
index 0000000..4b43762
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/Trigger/seg_0/606CC829-B100-400E-EE10-15915642CD1D.xml
@@ -0,0 +1,19 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_SELF_TEST$TEST
+duane
+2024-04-10 19:09:26 UTC
+Main
+INSERT
+
+BEFORE
+0B8CEE14-5EF4-002A-AC5B-E55C89A47256
+47D50FCD-FE02-67DD-23DD-EFF91FD5D711
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/0B8CEE14-5EF4-002A-AC5B-E55C89A47256.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/0B8CEE14-5EF4-002A-AC5B-E55C89A47256.xml
new file mode 100644
index 0000000..e6138c1
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/0B8CEE14-5EF4-002A-AC5B-E55C89A47256.xml
@@ -0,0 +1,20 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+duane
+2024-04-10 19:09:11 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+CREATE JOB, CREATE TYPE, CREATE TRIGGER, CREATE PROCEDURE, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE VIEW, CREATE PUBLIC SYNONYM, CREATE TABLE, CREATE SESSION
+
+
+duane
+2024-04-10 19:09:11 UTC
+Main
+536870912
+D5F08164-B74B-C1FD-B26F-24B803D8279B
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/MDSYS.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/MDSYS.xml
new file mode 100644
index 0000000..ab50a69
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/MDSYS.xml
@@ -0,0 +1,8 @@
+
+
+duane
+2024-04-10 19:08:09 UTC
+Main
+true
+true
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/PUBLIC.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/PUBLIC.xml
new file mode 100644
index 0000000..fff60f4
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/User/seg_0/PUBLIC.xml
@@ -0,0 +1,157 @@
+
+
+duane
+2024-04-10 19:08:09 UTC
+Main
+true
+true
+
+
+duane
+2024-04-10 19:09:31 UTC
+Main
+SELECT
+D21D0B42-D3AB-93D4-7A95-C16EB182CCFE
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+758A13CE-831B-0FF3-AF1D-6EFCB98A56C9
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+9DDC7252-C57D-1FBB-D73B-1B2B31CF0854
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+75C40BBC-950A-B117-05CF-FF327E9C0952
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+C619958B-4EFE-7A79-1530-39139BD2978B
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, INSERT, SELECT
+9636F0E1-B48A-756B-7277-A09DA3C8A191
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+SELECT
+7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E
+
+
+duane
+2024-04-10 19:09:34 UTC
+Main
+EXECUTE
+52B10B9D-540A-14A5-4425-5F33BEF76415
+
+
+duane
+2024-04-10 19:09:34 UTC
+Main
+EXECUTE
+C4884317-FB22-4CE6-0CA7-1154121979D9
+
+
+duane
+2024-04-10 19:09:35 UTC
+Main
+0BE8DADB-1C62-A689-AFC7-E019ACC9401C
+EXECUTE
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150
+
+
+duane
+2024-04-10 19:09:35 UTC
+Main
+E540BEB4-86FF-0BEC-4B75-E54681F8A22B
+EXECUTE
+
+
+duane
+2024-04-10 19:09:35 UTC
+Main
+678B0BFB-EF32-C534-B075-F0B5F2416CA1
+EXECUTE
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+A729999D-C3F8-5C34-5F9E-8616ED91107F
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+B1B78CE3-596A-EE16-4161-D349F1B06CF5
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+CF8C8B20-F299-4674-1B96-161EB7C5E9A0
+
+
+duane
+2024-04-10 19:09:32 UTC
+Main
+SELECT
+EE143981-963F-4366-4DDB-29FA08800B6F
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, SELECT
+DA7F3AD5-D951-192B-23AE-A1549FB69116
+
+
+duane
+2024-04-10 19:09:33 UTC
+Main
+DELETE, INSERT, SELECT
+8B85014B-3DC9-977A-759E-DFE1810940A6
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml
new file mode 100644
index 0000000..71ca238
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml
new file mode 100644
index 0000000..bf39236
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml
new file mode 100644
index 0000000..055d905
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml
new file mode 100644
index 0000000..0e4ba1d
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml
new file mode 100644
index 0000000..d8a17f9
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml
new file mode 100644
index 0000000..b3f6ac7
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml
new file mode 100644
index 0000000..f0af2aa
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/phys/01F6E6D1-3988D1813575/View/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml
@@ -0,0 +1,7 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+F3F68D51-50F9-4B34-B38E-4A24C8F25A04
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/schema/seg_0/F3F68D51-50F9-4B34-B38E-4A24C8F25A04.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/schema/seg_0/F3F68D51-50F9-4B34-B38E-4A24C8F25A04.xml
new file mode 100644
index 0000000..82f93ab
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/schema/seg_0/F3F68D51-50F9-4B34-B38E-4A24C8F25A04.xml
@@ -0,0 +1,6 @@
+
+
+duane
+2024-04-10 19:09:12 UTC
+Main
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/subviews/BE494CF6-1875-7125-7D99-7559C7F01672.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/subviews/BE494CF6-1875-7125-7D99-7559C7F01672.xml
new file mode 100644
index 0000000..5466490
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/subviews/BE494CF6-1875-7125-7D99-7559C7F01672.xml
@@ -0,0 +1,194 @@
+
+
+duane
+duane
+2024-04-10 19:09:11 UTC
+false
+true
+false
+false
+false
+false
+false
+-1
+false
+1
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+false
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+false
+-16777216
+1
+
+
+
+
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml
new file mode 100644
index 0000000..e2f0cac
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/1DEC1727-6653-3CF8-958B-90000528613A.xml
@@ -0,0 +1,182 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml
new file mode 100644
index 0000000..38c5337
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/47D50FCD-FE02-67DD-23DD-EFF91FD5D711.xml
@@ -0,0 +1,121 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml
new file mode 100644
index 0000000..0e9754c
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/5EC59CF5-A3B7-D15B-B334-0DEBC25C7FB1.xml
@@ -0,0 +1,254 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml
new file mode 100644
index 0000000..3c24e1e
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/758A13CE-831B-0FF3-AF1D-6EFCB98A56C9.xml
@@ -0,0 +1,187 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml
new file mode 100644
index 0000000..bb92b65
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/75C40BBC-950A-B117-05CF-FF327E9C0952.xml
@@ -0,0 +1,102 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml
new file mode 100644
index 0000000..417fdfa
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/7BDB22F5-B7AD-B5AE-A800-A707BAF1DB1E.xml
@@ -0,0 +1,129 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml
new file mode 100644
index 0000000..b54a6c4
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/8B85014B-3DC9-977A-759E-DFE1810940A6.xml
@@ -0,0 +1,321 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml
new file mode 100644
index 0000000..059b827
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9636F0E1-B48A-756B-7277-A09DA3C8A191.xml
@@ -0,0 +1,457 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml
new file mode 100644
index 0000000..fdd0da4
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9DDC7252-C57D-1FBB-D73B-1B2B31CF0854.xml
@@ -0,0 +1,233 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml
new file mode 100644
index 0000000..32ba696
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/9E263B07-E38C-E935-0A24-90CB87282FB8.xml
@@ -0,0 +1,212 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml
new file mode 100644
index 0000000..d73d76b
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/AD852798-2151-9B8D-72B3-69C9049EC985.xml
@@ -0,0 +1,183 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml
new file mode 100644
index 0000000..9ccfddf
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C5FD4ACF-3E8D-0C48-7FDC-820373D68467.xml
@@ -0,0 +1,126 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml
new file mode 100644
index 0000000..0e8b0bb
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/C619958B-4EFE-7A79-1530-39139BD2978B.xml
@@ -0,0 +1,121 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml
new file mode 100644
index 0000000..f323db6
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/table/seg_0/DA7F3AD5-D951-192B-23AE-A1549FB69116.xml
@@ -0,0 +1,152 @@
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml
new file mode 100644
index 0000000..9e4f065
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/0D3F7B3A-0C1A-E082-30AF-94CC2F8DA150.xml
@@ -0,0 +1,605 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_DBOUT_RUNS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+TEST_RUN_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUN_ID
+NUMBER (38)
+TEST_RUN_ID
+false
+21D3050F-F203-BB95-67D1-C5928CC1A212
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+DBOUT_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_ID
+NUMBER (38)
+DBOUT_ID
+false
+7F636DE0-677F-1B19-1079-48C0D498AD7D
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+DBOUT_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_OWNER
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+DBOUT_OWNER
+false
+06E82655-F87C-C9C7-64B0-2D58D23E8F80
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+DBOUT_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_NAME
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+DBOUT_NAME
+false
+8B807635-368C-F677-724E-DA46FF4DC43A
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+DBOUT_TYPE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_TYPE
+VARCHAR2 (1 BYTE)
+DBOUT_TYPE
+false
+2388280C-DB94-5809-CC50-3D28CC81ED50
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+TEST_RUNNER_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_ID
+VARCHAR2 (4000 BYTE)
+TEST_RUNNER_ID
+false
+14F097CA-2FC9-72CA-44AB-4C6405899B87
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+TEST_RUNNER_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_OWNER
+NUMBER (38)
+TEST_RUNNER_OWNER
+false
+F7E17E4F-72FB-2237-B81A-454CB77CF9AE
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+TEST_RUNNER_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_NAME
+NUMBER (6)
+TEST_RUNNER_NAME
+false
+FD80BDD1-F571-43E2-E44D-A9FD53AB7594
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+START_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+START_DTM
+NUMBER (4,1)
+START_DTM
+false
+FD42894C-C7E7-35DC-77EB-D2DA314771C6
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+END_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+END_DTM
+NUMBER (6)
+END_DTM
+false
+EA42B83F-7825-C69A-3199-23F2758A4F1E
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+IS_LAST_RUN
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+IS_LAST_RUN
+NUMBER (6)
+IS_LAST_RUN
+false
+3D3EAABA-89BF-2CDD-A7B8-B6FC127E1130
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+ERROR_MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ERROR_MESSAGE
+NUMBER (6)
+ERROR_MESSAGE
+false
+814FF55F-DAEA-A4F8-2C0A-B2A69A2F9E69
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+PROFILER_RUNID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+PROFILER_RUNID
+NUMBER (6)
+PROFILER_RUNID
+false
+C5DFF22B-A984-C67B-A2F5-456CA679934C
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+TRIGGER_OFFSET
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TRIGGER_OFFSET
+NUMBER (6)
+TRIGGER_OFFSET
+false
+B3EC6BA3-EB9C-0367-8ED8-B6A1C43CF4CB
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+COVERAGE_PCT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+COVERAGE_PCT
+NUMBER (6)
+COVERAGE_PCT
+false
+2650D4C2-6698-9AAC-F4AC-09325BEEA077
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+PROFILED_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+PROFILED_LINES
+NUMBER (11)
+PROFILED_LINES
+false
+2359EF30-7E13-93F6-4E5D-B1C46A5302E4
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXECUTED_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXECUTED_LINES
+NUMBER (11)
+EXECUTED_LINES
+false
+7CB8A6EA-5D09-A112-F9CF-BFD197514992
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+IGNORED_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+IGNORED_LINES
+NUMBER (11)
+IGNORED_LINES
+false
+B3496CED-FABA-40B4-EE1E-34FCF625A1F2
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXCLUDED_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXCLUDED_LINES
+NUMBER (11)
+EXCLUDED_LINES
+false
+51162AEE-1419-9012-1569-0840DE11E099
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+NOTEXEC_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+NOTEXEC_LINES
+NUMBER (6)
+NOTEXEC_LINES
+false
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+UNKNOWN_LINES
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+UNKNOWN_LINES
+NUMBER (6)
+UNKNOWN_LINES
+false
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXEC_MIN_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_MIN_USEC
+NUMBER (11)
+EXEC_MIN_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXEC_AVG_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_AVG_USEC
+NUMBER (11)
+EXEC_AVG_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXEC_MAX_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_MAX_USEC
+NUMBER (11)
+EXEC_MAX_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_DBOUT_RUNS_VW
+EXEC_TOT_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_TOT_USEC
+NUMBER (11)
+EXEC_TOT_USEC
+false
+
+
+
+
+true
+WTP
+WT_TEST_RUNS
+
+
+true
+WTP
+WT_DBOUTS
+
+
+true
+WTP
+WT_TEST_RUNNERS
+
+
+true
+WTP
+WT_DBOUT_RUNS
+
+
+DBOUT_ID
+WTP
+WT_TEST_RUNS
+
+
+TEST_RUNNER_ID
+WTP
+WT_TEST_RUNS
+
+
+START_DTM
+WTP
+WT_TEST_RUNS
+
+
+END_DTM
+WTP
+WT_TEST_RUNS
+
+
+IS_LAST_RUN
+WTP
+WT_TEST_RUNS
+
+
+ERROR_MESSAGE
+WTP
+WT_TEST_RUNS
+
+
+PROFILER_RUNID
+WTP
+WT_DBOUT_RUNS
+
+
+TRIGGER_OFFSET
+WTP
+WT_DBOUT_RUNS
+
+
+COVERAGE_PCT
+WTP
+WT_DBOUT_RUNS
+
+
+PROFILED_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+EXECUTED_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+IGNORED_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+EXCLUDED_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+NOTEXEC_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+UNKNOWN_LINES
+WTP
+WT_DBOUT_RUNS
+
+
+EXEC_MIN_USEC
+WTP
+WT_DBOUT_RUNS
+
+
+EXEC_AVG_USEC
+WTP
+WT_DBOUT_RUNS
+
+
+EXEC_MAX_USEC
+WTP
+WT_DBOUT_RUNS
+
+
+EXEC_TOT_USEC
+WTP
+WT_DBOUT_RUNS
+
+
+TEST_RUN_ID
+WTP
+WT_DBOUT_RUNS
+
+
+OWNER
+WTP
+WT_TEST_RUNNERS
+
+
+NAME
+WTP
+WT_DBOUTS
+
+
+ID
+WTP
+WT_DBOUTS
+
+
+OWNER
+WTP
+WT_DBOUTS
+
+
+NAME
+WTP
+WT_TEST_RUNNERS
+
+
+TYPE
+WTP
+WT_DBOUTS
+
+
+ID
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNS
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml
new file mode 100644
index 0000000..69295fc
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/6ED7D361-B23F-43AA-FDAB-BAAFCF1EFECE.xml
@@ -0,0 +1,172 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_SCHEDULER_JOBS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+LOG_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+LOG_ID
+NUMBER
+LOG_ID
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+START_DATE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+START_DATE
+TIMESTAMP(9) WITH TIME ZONE
+START_DATE
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+JOB_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+JOB_NAME
+VARCHAR2 (1044 BYTE)
+JOB_NAME
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+STATUS
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+STATUS
+VARCHAR2 (30 BYTE)
+STATUS
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+INST
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+INST
+NUMBER
+INST
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+SESSION_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+SESSION_ID
+NUMBER
+SESSION_ID
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+OS_PID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+OS_PID
+NUMBER
+OS_PID
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+ERROR_NUM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ERROR_NUM
+NUMBER
+ERROR_NUM
+false
+
+
+wtp@DEVPDB_localhost
+WT_SCHEDULER_JOBS_VW
+ADDITIONAL_INFO
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ADDITIONAL_INFO
+VARCHAR2 (4000 BYTE)
+ADDITIONAL_INFO
+false
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml
new file mode 100644
index 0000000..62f309e
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/97E53EBE-3CA8-2E65-0D8F-7B66E933E2D7.xml
@@ -0,0 +1,51 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_QUAL_TEST_RUNNERS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_QUAL_TEST_RUNNERS_VW
+OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+OWNER
+VARCHAR2 (128 BYTE)
+OWNER
+false
+
+
+wtp@DEVPDB_localhost
+WT_QUAL_TEST_RUNNERS_VW
+PACKAGE_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+PACKAGE_NAME
+VARCHAR2 (128 BYTE)
+PACKAGE_NAME
+false
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml
new file mode 100644
index 0000000..cbc15fb
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/A729999D-C3F8-5C34-5F9E-8616ED91107F.xml
@@ -0,0 +1,468 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_PROFILES_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+TEST_RUN_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUN_ID
+NUMBER (38)
+TEST_RUN_ID
+false
+21D3050F-F203-BB95-67D1-C5928CC1A212
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+DBOUT_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_ID
+NUMBER (38)
+DBOUT_ID
+false
+7F636DE0-677F-1B19-1079-48C0D498AD7D
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+DBOUT_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_OWNER
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+DBOUT_OWNER
+false
+06E82655-F87C-C9C7-64B0-2D58D23E8F80
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+DBOUT_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_NAME
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+DBOUT_NAME
+false
+8B807635-368C-F677-724E-DA46FF4DC43A
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+DBOUT_TYPE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DBOUT_TYPE
+VARCHAR2 (1 BYTE)
+DBOUT_TYPE
+false
+2388280C-DB94-5809-CC50-3D28CC81ED50
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+TEST_RUNNER_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_ID
+VARCHAR2 (4000 BYTE)
+TEST_RUNNER_ID
+false
+14F097CA-2FC9-72CA-44AB-4C6405899B87
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+TEST_RUNNER_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_OWNER
+NUMBER (6)
+TEST_RUNNER_OWNER
+false
+884B2B12-D77B-8588-BA5F-B4C490C13F42
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+TEST_RUNNER_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_NAME
+VARCHAR2 (4 BYTE)
+TEST_RUNNER_NAME
+false
+EC7C07AC-1657-1B4B-D18C-258D1BB6F66D
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+START_DTM
+duane
+2024-04-10 19:09:12 UTC
+Main
+true
+false
+START_DTM
+NUMBER (9)
+START_DTM
+false
+3734B96A-DE31-456A-0323-BBA1702870BE
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+END_DTM
+duane
+2024-04-10 19:09:12 UTC
+Main
+true
+false
+END_DTM
+NUMBER
+END_DTM
+false
+7D001A71-7FEB-9F08-7608-46FE6B96404D
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+IS_LAST_RUN
+duane
+2024-04-10 19:09:12 UTC
+Main
+true
+false
+IS_LAST_RUN
+NUMBER
+IS_LAST_RUN
+false
+20B5B5E4-6E5E-A189-0264-ED60FED9F0ED
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+ERROR_MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+Main
+true
+false
+ERROR_MESSAGE
+NUMBER
+ERROR_MESSAGE
+false
+9736387F-262C-D108-E534-ECE3AF554846
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+LINE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+LINE
+VARCHAR2 (4000 BYTE)
+LINE
+false
+1A522A73-09A9-DADE-B9C7-033795B2BB73
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+STATUS
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+STATUS
+VARCHAR2 (4 BYTE)
+STATUS
+false
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+EXEC_CNT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_CNT
+NUMBER (9)
+EXEC_CNT
+false
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+EXEC_TOT_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_TOT_USEC
+NUMBER
+EXEC_TOT_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+EXEC_MIN_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_MIN_USEC
+NUMBER
+EXEC_MIN_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+EXEC_MAX_USEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXEC_MAX_USEC
+NUMBER
+EXEC_MAX_USEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_PROFILES_VW
+TEXT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEXT
+VARCHAR2 (4000 BYTE)
+TEXT
+false
+
+
+
+
+true
+WTP
+WT_TEST_RUNS
+
+
+true
+WTP
+WT_DBOUTS
+
+
+true
+WTP
+WT_TEST_RUNNERS
+
+
+true
+WTP
+WT_PROFILES
+
+
+DBOUT_ID
+WTP
+WT_TEST_RUNS
+
+
+TEST_RUNNER_ID
+WTP
+WT_TEST_RUNS
+
+
+START_DTM
+WTP
+WT_TEST_RUNS
+
+
+END_DTM
+WTP
+WT_TEST_RUNS
+
+
+IS_LAST_RUN
+WTP
+WT_TEST_RUNS
+
+
+ERROR_MESSAGE
+WTP
+WT_TEST_RUNS
+
+
+LINE
+WTP
+WT_PROFILES
+
+
+STATUS
+WTP
+WT_PROFILES
+
+
+EXEC_CNT
+WTP
+WT_PROFILES
+
+
+EXEC_TOT_USEC
+WTP
+WT_PROFILES
+
+
+EXEC_MIN_USEC
+WTP
+WT_PROFILES
+
+
+EXEC_MAX_USEC
+WTP
+WT_PROFILES
+
+
+TEXT
+WTP
+WT_PROFILES
+
+
+OWNER
+WTP
+WT_DBOUTS
+
+
+NAME
+WTP
+WT_TEST_RUNNERS
+
+
+TYPE
+WTP
+WT_DBOUTS
+
+
+OWNER
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNS
+
+
+NAME
+WTP
+WT_DBOUTS
+
+
+TEST_RUN_ID
+WTP
+WT_PROFILES
+
+
+ID
+WTP
+WT_DBOUTS
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml
new file mode 100644
index 0000000..0836911
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/B1B78CE3-596A-EE16-4161-D349F1B06CF5.xml
@@ -0,0 +1,431 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_RESULTS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TEST_RUN_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUN_ID
+NUMBER (38)
+TEST_RUN_ID
+false
+7F636DE0-677F-1B19-1079-48C0D498AD7D
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TEST_RUNNER_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_ID
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TEST_RUNNER_ID
+false
+06E82655-F87C-C9C7-64B0-2D58D23E8F80
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TEST_RUNNER_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_OWNER
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TEST_RUNNER_OWNER
+false
+8B807635-368C-F677-724E-DA46FF4DC43A
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TEST_RUNNER_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_NAME
+VARCHAR2 (1 BYTE)
+TEST_RUNNER_NAME
+false
+2388280C-DB94-5809-CC50-3D28CC81ED50
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+START_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+START_DTM
+VARCHAR2 (4000 BYTE)
+START_DTM
+false
+14F097CA-2FC9-72CA-44AB-4C6405899B87
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+END_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+END_DTM
+NUMBER (8)
+END_DTM
+false
+F09577B1-5488-FDF0-6C04-A17041D4C3E5
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+IS_LAST_RUN
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+IS_LAST_RUN
+NUMBER (38)
+IS_LAST_RUN
+false
+AE50B8BB-70DA-3595-258F-F8F47A8A25B3
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+ERROR_MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ERROR_MESSAGE
+VARCHAR2 (128 BYTE)
+ERROR_MESSAGE
+false
+4638A115-B74D-2A1B-C113-F8116DF5F2C9
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+RESULT_SEQ
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+RESULT_SEQ
+TIMESTAMP
+RESULT_SEQ
+false
+9773D5F2-EA7D-6F19-139E-313C84DE7204
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TESTCASE_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TESTCASE_ID
+NUMBER (12,3)
+TESTCASE_ID
+false
+BEE5EB59-2962-C94F-DF33-48E0E7BC7A76
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+TESTCASE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TESTCASE
+VARCHAR2 (15 BYTE)
+TESTCASE
+false
+E7810FCB-8D8B-B8B0-C2AA-AF2CDCA2BF7E
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+EXECUTED_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+EXECUTED_DTM
+VARCHAR2 (4 BYTE)
+EXECUTED_DTM
+false
+44EB5585-77F9-08CD-BE79-CEEEDB61BE32
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+INTERVAL_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+INTERVAL_MSEC
+VARCHAR2 (200 BYTE)
+INTERVAL_MSEC
+false
+F8D51E92-AC6D-8A48-246B-C1FDF3FE7CBA
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+ASSERTION
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASSERTION
+VARCHAR2 (4000 BYTE)
+ASSERTION
+false
+77033B55-FF0A-7D0D-6F92-1941DAD3329B
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+STATUS
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+STATUS
+VARCHAR2 (4 BYTE)
+STATUS
+false
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+MESSAGE
+VARCHAR2 (200 BYTE)
+MESSAGE
+false
+
+
+wtp@DEVPDB_localhost
+WT_RESULTS_VW
+DETAILS
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+DETAILS
+VARCHAR2 (4000 BYTE)
+DETAILS
+false
+
+
+
+
+true
+WTP
+WT_TEST_RUNS
+
+
+true
+WTP
+WT_TEST_RUNNERS
+
+
+true
+WTP
+WT_RESULTS
+
+
+true
+WTP
+WT_TESTCASES
+
+
+TEST_RUNNER_ID
+WTP
+WT_TEST_RUNS
+
+
+START_DTM
+WTP
+WT_TEST_RUNS
+
+
+END_DTM
+WTP
+WT_TEST_RUNS
+
+
+IS_LAST_RUN
+WTP
+WT_TEST_RUNS
+
+
+ERROR_MESSAGE
+WTP
+WT_TEST_RUNS
+
+
+RESULT_SEQ
+WTP
+WT_RESULTS
+
+
+TESTCASE_ID
+WTP
+WT_RESULTS
+
+
+TESTCASE
+WTP
+WT_TESTCASES
+
+
+EXECUTED_DTM
+WTP
+WT_RESULTS
+
+
+INTERVAL_MSEC
+WTP
+WT_RESULTS
+
+
+ASSERTION
+WTP
+WT_RESULTS
+
+
+STATUS
+WTP
+WT_RESULTS
+
+
+MESSAGE
+WTP
+WT_RESULTS
+
+
+DETAILS
+WTP
+WT_RESULTS
+
+
+NAME
+WTP
+WT_TEST_RUNNERS
+
+
+OWNER
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNS
+
+
+TEST_RUN_ID
+WTP
+WT_RESULTS
+
+
+ID
+WTP
+WT_TESTCASES
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml
new file mode 100644
index 0000000..8262bbf
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/CF8C8B20-F299-4674-1B96-161EB7C5E9A0.xml
@@ -0,0 +1,410 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TESTCASE_RUNS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TEST_RUN_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUN_ID
+NUMBER (38)
+TEST_RUN_ID
+false
+56E444F2-E134-E369-242C-027796EDD9D8
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TESTCASE_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TESTCASE_ID
+NUMBER (38)
+TESTCASE_ID
+false
+86C08030-DA4E-772E-88A8-13EB703339AC
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TESTCASE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TESTCASE
+VARCHAR2 (128 BYTE)
+TESTCASE
+false
+4638A115-B74D-2A1B-C113-F8116DF5F2C9
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TEST_RUNNER_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_ID
+NUMBER (38)
+TEST_RUNNER_ID
+false
+7F636DE0-677F-1B19-1079-48C0D498AD7D
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TEST_RUNNER_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_OWNER
+VARCHAR2 (1 BYTE)
+TEST_RUNNER_OWNER
+false
+2388280C-DB94-5809-CC50-3D28CC81ED50
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+TEST_RUNNER_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_NAME
+VARCHAR2 (4000 BYTE)
+TEST_RUNNER_NAME
+false
+14F097CA-2FC9-72CA-44AB-4C6405899B87
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+IS_LAST_RUN
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+IS_LAST_RUN
+NUMBER (3)
+IS_LAST_RUN
+false
+785E9A33-BFB2-9A04-F467-02225F041330
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ERROR_MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ERROR_MESSAGE
+NUMBER (7)
+ERROR_MESSAGE
+false
+A3E3D619-85BD-3862-2393-A7803E9CAA5E
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_YIELD_PCT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_YIELD_PCT
+NUMBER (7)
+ASRT_YIELD_PCT
+false
+09945C69-5818-0DCF-AF02-C460B6C213D4
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_CNT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_CNT
+NUMBER (7)
+ASRT_CNT
+false
+D9FA8939-98AA-5CFA-BB8D-5DE3E36748D9
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_FAIL
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_FAIL
+NUMBER (10)
+ASRT_FAIL
+false
+87CBD83F-AE2D-3B16-6590-4724E552B6A2
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_PASS
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_PASS
+NUMBER (10)
+ASRT_PASS
+false
+F1931CFF-1796-6D94-C335-2194F623F7D8
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_MIN_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_MIN_MSEC
+NUMBER (10)
+ASRT_MIN_MSEC
+false
+4FFF72CB-9634-B8C0-F6A2-4FF0D364EEA0
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_AVG_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_AVG_MSEC
+NUMBER (10)
+ASRT_AVG_MSEC
+false
+88F9BA4A-EEE8-FF50-34BD-75C3EE390D17
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_MAX_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_MAX_MSEC
+NUMBER (10)
+ASRT_MAX_MSEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_TESTCASE_RUNS_VW
+ASRT_TOT_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_TOT_MSEC
+NUMBER (10)
+ASRT_TOT_MSEC
+false
+
+
+
+
+true
+WTP
+WT_TESTCASE_RUNS
+
+
+true
+WTP
+WT_TESTCASES
+
+
+true
+WTP
+WT_TEST_RUNS
+
+
+true
+WTP
+WT_TEST_RUNNERS
+
+
+TEST_RUN_ID
+WTP
+WT_TESTCASE_RUNS
+
+
+TESTCASE_ID
+WTP
+WT_TESTCASE_RUNS
+
+
+TESTCASE
+WTP
+WT_TESTCASES
+
+
+TEST_RUNNER_ID
+WTP
+WT_TEST_RUNS
+
+
+IS_LAST_RUN
+WTP
+WT_TEST_RUNS
+
+
+ERROR_MESSAGE
+WTP
+WT_TEST_RUNS
+
+
+ASRT_YIELD_PCT
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_CNT
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_FAIL
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_PASS
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_MIN_MSEC
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_AVG_MSEC
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_MAX_MSEC
+WTP
+WT_TESTCASE_RUNS
+
+
+ASRT_TOT_MSEC
+WTP
+WT_TESTCASE_RUNS
+
+
+NAME
+WTP
+WT_TEST_RUNNERS
+
+
+OWNER
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNS
+
+
+ID
+WTP
+WT_TESTCASES
+
+
+
diff --git a/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml
new file mode 100644
index 0000000..c6edc29
--- /dev/null
+++ b/docs/design/Main/rel/A1ED17DA-FD6A141ADE1D/view/seg_0/EE143981-963F-4366-4DDB-29FA08800B6F.xml
@@ -0,0 +1,495 @@
+
+
+wtp@DEVPDB_localhost
+WTP
+WT_TEST_RUNS_VW
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+
+true
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TEST_RUN_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUN_ID
+NUMBER (38)
+TEST_RUN_ID
+false
+7F636DE0-677F-1B19-1079-48C0D498AD7D
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TEST_RUNNER_ID
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_ID
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TEST_RUNNER_ID
+false
+06E82655-F87C-C9C7-64B0-2D58D23E8F80
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TEST_RUNNER_OWNER
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_OWNER
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TEST_RUNNER_OWNER
+false
+8B807635-368C-F677-724E-DA46FF4DC43A
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TEST_RUNNER_NAME
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TEST_RUNNER_NAME
+NUMBER (6,1)
+TEST_RUNNER_NAME
+false
+DE47BDD7-CA5C-AD25-4400-41F836A77276
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+START_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+START_DTM
+VARCHAR2 (1 BYTE)
+START_DTM
+false
+2388280C-DB94-5809-CC50-3D28CC81ED50
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+END_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+END_DTM
+VARCHAR2 (4000 BYTE)
+END_DTM
+false
+14F097CA-2FC9-72CA-44AB-4C6405899B87
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+RUNNER_SEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+RUNNER_SEC
+NUMBER (7)
+RUNNER_SEC
+false
+9844421F-2EA0-03A4-7F95-401414E59693
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+IS_LAST_RUN
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+IS_LAST_RUN
+NUMBER (7)
+IS_LAST_RUN
+false
+BF959A81-53A3-0A6E-1EBA-CEC53B9DFA2B
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ERROR_MESSAGE
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ERROR_MESSAGE
+NUMBER (4,1)
+ERROR_MESSAGE
+false
+EF31F39F-6B76-0EE1-FC15-D9C8CFEBBCF7
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TC_CNT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TC_CNT
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TC_CNT
+false
+C958FE2A-C541-3988-1D37-DA8793C76B17
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TC_FAIL
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TC_FAIL
+TIMESTAMP (3) WITH LOCAL TIME ZONE
+TC_FAIL
+false
+64DFF1A1-1CEC-8750-3DA8-014AA4CADF81
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+TC_YIELD_PCT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+TC_YIELD_PCT
+NUMBER (7)
+TC_YIELD_PCT
+false
+69643D58-A7AF-3575-7785-40708E6E0BEA
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_FST_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_FST_DTM
+NUMBER (7)
+ASRT_FST_DTM
+false
+DF54ADB3-7D87-99BF-A174-C837C3612109
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_LST_DTM
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_LST_DTM
+NUMBER (4,1)
+ASRT_LST_DTM
+false
+513FE627-D229-8A70-3F6E-5E945B859135
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_CNT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_CNT
+NUMBER (10)
+ASRT_CNT
+false
+F211C557-545E-F492-8277-AF1E06162B54
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_FAIL
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_FAIL
+NUMBER (10)
+ASRT_FAIL
+false
+970B1C8F-6CC0-BE58-15A9-35F363011C52
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_YIELD_PCT
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_YIELD_PCT
+NUMBER (10)
+ASRT_YIELD_PCT
+false
+41F0E99A-89C6-4044-22B7-CD435D5B764E
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_MIN_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_MIN_MSEC
+NUMBER (10)
+ASRT_MIN_MSEC
+false
+712EECEC-B5ED-D2F6-E366-14646B9D972A
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_AVG_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_AVG_MSEC
+NUMBER (10)
+ASRT_AVG_MSEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_MAX_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_MAX_MSEC
+NUMBER (10)
+ASRT_MAX_MSEC
+false
+
+
+wtp@DEVPDB_localhost
+WT_TEST_RUNS_VW
+ASRT_TOT_MSEC
+duane
+2024-04-10 19:09:12 UTC
+
+Main
+true
+false
+ASRT_TOT_MSEC
+NUMBER (10)
+ASRT_TOT_MSEC
+false
+
+
+
+
+true
+WTP
+WT_TEST_RUNS
+
+
+true
+WTP
+WT_TEST_RUNNERS
+
+
+TEST_RUNNER_ID
+WTP
+WT_TEST_RUNS
+
+
+START_DTM
+WTP
+WT_TEST_RUNS
+
+
+END_DTM
+WTP
+WT_TEST_RUNS
+
+
+RUNNER_SEC
+WTP
+WT_TEST_RUNS
+
+
+IS_LAST_RUN
+WTP
+WT_TEST_RUNS
+
+
+ERROR_MESSAGE
+WTP
+WT_TEST_RUNS
+
+
+TC_CNT
+WTP
+WT_TEST_RUNS
+
+
+TC_FAIL
+WTP
+WT_TEST_RUNS
+
+
+TC_YIELD_PCT
+WTP
+WT_TEST_RUNS
+
+
+ASRT_FST_DTM
+WTP
+WT_TEST_RUNS
+
+
+ASRT_LST_DTM
+WTP
+WT_TEST_RUNS
+
+
+ASRT_CNT
+WTP
+WT_TEST_RUNS
+
+
+ASRT_FAIL
+WTP
+WT_TEST_RUNS
+
+
+ASRT_YIELD_PCT
+WTP
+WT_TEST_RUNS
+
+
+ASRT_MIN_MSEC
+WTP
+WT_TEST_RUNS
+
+
+ASRT_AVG_MSEC
+WTP
+WT_TEST_RUNS
+
+
+ASRT_MAX_MSEC
+WTP
+WT_TEST_RUNS
+
+
+ASRT_TOT_MSEC
+WTP
+WT_TEST_RUNS
+
+
+NAME
+WTP
+WT_TEST_RUNNERS
+
+
+OWNER
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNNERS
+
+
+ID
+WTP
+WT_TEST_RUNS
+
+
+
diff --git a/docs/design/README.md b/docs/design/README.md
new file mode 100644
index 0000000..043db06
--- /dev/null
+++ b/docs/design/README.md
@@ -0,0 +1,8 @@
+
+### Files and Directories
+
+File Name | Description
+-------------------------------|------------
+Core_Call_Tree_Diagrams.odg | LibreOffice Draw File for Core Process Call Trees
+Core_Call_Tree_Diagrams.pdf | Core Process Call Tree (Graph) Diagrams
+Core_ER_Diagrams.pdf | Core Entity-Relationship Diagrams
diff --git a/docs/images/Example wtPLSQL Test Results.PNG b/docs/images/Example wtPLSQL Test Results.PNG
new file mode 100644
index 0000000..73348e1
Binary files /dev/null and b/docs/images/Example wtPLSQL Test Results.PNG differ
diff --git a/docs/index_leap-day.htm b/docs/index_leap-day.htm
new file mode 100644
index 0000000..ffe99a0
--- /dev/null
+++ b/docs/index_leap-day.htm
@@ -0,0 +1,127 @@
+
+layout: default
+Text can be bold, italic, or strikethrough.
+Link to another page.
+There should be whitespace between paragraphs.
+There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project.
+
+This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere.
+
+
+This is a blockquote following a header.
+When something is important enough, you do it even if the odds are not in your favor.
+
+
+// Javascript code with syntax highlighting.
+var fun = function lang(l) {
+ dateformat.i18n = require('./lang/' + l)
+ return true;
+}
+# Ruby code with syntax highlighting
+GitHubPages::Dependencies.gems.each do |gem, version|
+ s.add_dependency(gem, "= #{version}")
+end
+
+
+- This is an unordered list following a header.
+- This is an unordered list following a header.
+- This is an unordered list following a header.
+
+
+
+- This is an ordered list following a header.
+- This is an ordered list following a header.
+- This is an ordered list following a header.
+
+
+
+
+
+
+
+
+| ok |
+good swedish fish |
+nice |
+
+
+| out of stock |
+good and plenty |
+nice |
+
+
+| ok |
+good oreos |
+hmm |
+
+
+| ok |
+good zoute drop |
+yumm |
+
+
+
+There's a horizontal rule below this.
+
+Here is an unordered list:
+
+- Item foo
+- Item bar
+- Item baz
+- Item zip
+
+And an ordered list:
+
+- Item one
+- Item two
+- Item three
+- Item four
+
+And a nested list:
+
+- level 1 item
+
+- level 2 item
+- level 2 item
+
+- level 3 item
+- level 3 item
+
+
+- level 1 item
+
+- level 2 item
+- level 2 item
+- level 2 item
+
+- level 1 item
+
+- level 2 item
+- level 2 item
+
+- level 1 item
+
+Small image
+
+Large image
+
+Definition lists can be used with HTML syntax.
+
+- Name
+- Godzilla
+- Born
+- 1952
+- Birthplace
+- Japan
+- Color
+- Green
+
+
+Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.
+
+The final element.
+
diff --git a/docs/md-to-htm.lua b/docs/md-to-htm.lua
index dbaa04e..cf11419 100644
--- a/docs/md-to-htm.lua
+++ b/docs/md-to-htm.lua
@@ -1,4 +1,4 @@
-# md-to-htm.lua
+-- md-to-htm.lua
-- Adapted from answer by JW https://stackoverflow.com/users/4321/jw
-- at https://stackoverflow.com/questions/40993488
function Link(el)
diff --git a/docs/md-to-htm.sh b/docs/md-to-htm.sh
new file mode 100644
index 0000000..40809cb
--- /dev/null
+++ b/docs/md-to-htm.sh
@@ -0,0 +1,10 @@
+
+# pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o %1.htm %1.md
+
+ls *.md | while read FILE
+do
+ # /%md - Match pattern at end of expansion
+ # /htm - Replace match with "htm"
+ #echo "${FILE/%md/htm}" "${FILE}"
+ pandoc -f gfm -t html --lua-filter=md-to-htm.lua -o "${FILE/%md/htm}" "${FILE}"
+done
diff --git a/docs/utPLSQL-V2-Comparison.htm b/docs/utPLSQL-V2-Comparison.htm
index eea1d07..f585630 100644
--- a/docs/utPLSQL-V2-Comparison.htm
+++ b/docs/utPLSQL-V2-Comparison.htm
@@ -3,9 +3,9 @@ utPLSQL V2 Comparison
This comparison assumes a familiarity with utPLSQL V1/V2. The differences between wtPLSQL and utPLSQL V2 will be the focus.
Test Transience
-utPLSQL V2 included a focus on test transience by requiring "setup" and "tear down" procedures in a test package. wtPLSQL has no requirement. wtPLSQL also does not prevent any setup or tear down procedures from a test runner package.
+utPLSQL V2 included a focus on test transience by requiring "setup" and "tear down" procedures in a test package. wtPLSQL has no requirement. wtPLSQL also does not prevent any setup or tear down procedures from a test runner package.
Non-Sequenced Testing
-utPLSQL V2 did not include any specific order of test procedures in a test package. By default, wtPLSQL orders the test procedures because these test procedures will be listed in sequence in the test runner package. (Everything in the test runner package must be called by the "WTPLSQL_RUN" procedure.)
+utPLSQL V2 did not include any specific order of test procedures in a test package. By default, wtPLSQL orders the test procedures because these test procedures will be listed in sequence in the test runner package. (Everything in the test runner package must be called by the "WTPLSQL_RUN" procedure.)
UTL_FILE Setup
Much of the utPLSQL V2 functionality was centered on the UTL_FILE package. UTL_FILE was used to
@@ -16,31 +16,85 @@ UTL_FILE Setup
The configuration of UTL_FILE was one of the difficult parts of installing utPLSQL V2. Removing UTL_FILE from wtPLSQL core allows for a much simpler installation. Also, much of the functionality performed by UTL_FILE can be done easier with modern reporting and development tools. Comparing Files
Record Comparison
-In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. This package has not been included in the wtPSQL core to avoid problems. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate installation allows these special database permissions to be addressed directly.
+In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. To avoid problems, this functionality has not been included in the wtPSQL core. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate add-on allows these special database permissions to be addressed only if needed.
Test Procedure Prefixes
-From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests." In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages.
+From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests."
+In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages.
utPLSQL Trace
-utPLSQL V2 has a trace facility that could be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner as needed. Additionally, the simplicity of wtPLSQL execution eliminates the need for tracing.
+utPLSQL V2 has a trace facility that can be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner.
utConfig
The utConfig package is no longer used in wtPLSQL. There are 29 settings in the utConfig package in utPLSQL V2. The only remaining settings are in the following packages.
-
-- WT_ASSERT Settings
-
-- g_testcase - Name of the current test case
-- set_NLS_DATE_FORMAT - Default format for date data type
-- set_NLS_TIMESTAMP_FORMAT - Default format for timestamp data type
-- set_NLS_TIMESTAMP_TZ_FORMAT - Default format for timestamp with time zone data type
-
-- WT_TEXT_REPORT Settings
-
-- g_single_line_output - Remove/replace new line characters in test result output.
-- g_date_format - Default format for date data type
-
-
+
+
+
+
+
+
+| g_testcase |
+Name of the current test case |
+
+
+| set_NLS_DATE_FORMAT |
+Default format for date data type |
+
+
+| set_NLS_TIMESTAMP_FORMAT |
+Default format for timestamp data type |
+
+
+| set_NLS_TIMESTAMP_TZ_FORMAT |
+Default format for timestamp with time zone data type |
+
+
+
+
+
+
+
+
+
+
+
+| g_single_line_output |
+Remove/replace new line characters in test result output |
+
+
+| g_date_format |
+Default format for date data type |
+
+
+
+
+
+
+
+
+
+
+
+| g_single_line_output |
+Remove/replace new line characters in test result output |
+
+
+| g_date_format |
+Default format for date data type |
+
+
+
utOutput
-utOutput in utPLSQL V2 has been replaced by WT_TEXT_REPORT in wtPLSQL. Unlike utOutput, WT_TEXT_REPORT is not called automatically, if assertions are executed as part of a test runner package. Alternatively, WT_TEST_RPEORT is used to automatically produce output for as-hoc assertions that are executed outside of a test runner package.
+utOutput in utPLSQL V2 has been replaced by WT_CORE_REPORT and WT_PERSIST_REPORT in wtPLSQL. Like utPLSQL V2, wtPLSQL Core calls WT_CORE_REPORT (using a hook) after each Test Runner is complete. Unlike utPLSQL V2, neither WT_CORE_REPORT or WT_PERSIST_REPORT are called automatically after the Persist add-on is installed. However, the WT_CORE_REPORT hook can be recreated to restore this functionality.
+WT_TEXT_REPORT is used to format the results of an ad-hoc assertion that is not part of a Test Runner call tree (call graph). The results of ad-hoc assertions are always sent to DBMS_OUTPUT.
Custom Reporter
-There is no custom reporter. The definition of the wtPLSQL tables is defined so reporting tools can be used to create custom reports.
+wtPLSQL has no custom reporter. An alternative to the WT_CORE_REPORTer or the WT_PERSIST_REPORTer is a user written PL/SQL program. If the Persist add-on is installed, all test results are available in database tables. Reporting tools can be used to create custom reports from database tables.
Links
- utPLSQL V2.3.1 Website
diff --git a/docs/utPLSQL-V2-Comparison.md b/docs/utPLSQL-V2-Comparison.md
index 2f368e7..1a3653f 100644
--- a/docs/utPLSQL-V2-Comparison.md
+++ b/docs/utPLSQL-V2-Comparison.md
@@ -21,30 +21,47 @@ Much of the utPLSQL V2 functionality was centered on the UTL_FILE package. UTL_F
The configuration of UTL_FILE was one of the difficult parts of installing utPLSQL V2. Removing UTL_FILE from wtPLSQL core allows for a much simpler installation. Also, much of the functionality performed by UTL_FILE can be done easier with modern reporting and development tools. Comparing Files
### Record Comparison
-In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. This package has not been included in the wtPSQL core to avoid problems. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate installation allows these special database permissions to be addressed directly.
+In utPLSQL V2, the "utRecEq" package is used to to generate functions to compare record types. To avoid problems, this functionality has not been included in the wtPSQL core. Generating the functions needed to make the comparison require special database permissions. Separating this package into a separate add-on allows these special database permissions to be addressed only if needed.
### Test Procedure Prefixes
-From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests." In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages.
+From the utPLSQL V2 documentation: "The unit test prefix is very important in utPLSQL; the utility uses the prefix to associate source code to be tested with the test package. The prefix also allows utPLSQL to automatically identify the programs within a test package that are to be executed as unit tests."
+
+In wtPLSQL, these prefixes are not required. The lack of these prefixes greatly simplifies the setup of test runners. However, the prefixes can be used with wtPLSQL by building them into test runner packages.
### utPLSQL Trace
-utPLSQL V2 has a trace facility that could be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner as needed. Additionally, the simplicity of wtPLSQL execution eliminates the need for tracing.
+utPLSQL V2 has a trace facility that can be turned on and off. Because the test runner in wtPLSQL is in control of testing and because the test runner is user written, any desired tracing can be added to the test runner.
### utConfig
The utConfig package is no longer used in wtPLSQL. There are 29 settings in the utConfig package in utPLSQL V2. The only remaining settings are in the following packages.
-* WT_ASSERT Settings
- * g_testcase - Name of the current test case
- * set_NLS_DATE_FORMAT - Default format for date data type
- * set_NLS_TIMESTAMP_FORMAT - Default format for timestamp data type
- * set_NLS_TIMESTAMP_TZ_FORMAT - Default format for timestamp with time zone data type
-* WT_TEXT_REPORT Settings
- * g_single_line_output - Remove/replace new line characters in test result output.
- * g_date_format - Default format for date data type
+
+WT_ASSERT Setting | Description
+----------------------------|------------
+g_testcase | Name of the current test case
+set_NLS_DATE_FORMAT | Default format for date data type
+set_NLS_TIMESTAMP_FORMAT | Default format for timestamp data type
+set_NLS_TIMESTAMP_TZ_FORMAT | Default format for timestamp with time zone data type
+
+
+
+WT_CORE_REPORT Setting | Description
+-----------------------|------------
+g_single_line_output | Remove/replace new line characters in test result output
+g_date_format | Default format for date data type
+
+
+
+WT_PERSIST_REPORT Setting | Description
+--------------------------|------------
+g_single_line_output | Remove/replace new line characters in test result output
+g_date_format | Default format for date data type
### utOutput
-utOutput in utPLSQL V2 has been replaced by WT_TEXT_REPORT in wtPLSQL. Unlike utOutput, WT_TEXT_REPORT is not called automatically, if assertions are executed as part of a test runner package. Alternatively, WT_TEST_RPEORT is used to automatically produce output for as-hoc assertions that are executed outside of a test runner package.
+utOutput in utPLSQL V2 has been replaced by WT_CORE_REPORT and WT_PERSIST_REPORT in wtPLSQL. Like utPLSQL V2, wtPLSQL Core calls WT_CORE_REPORT (using a hook) after each Test Runner is complete. Unlike utPLSQL V2, neither WT_CORE_REPORT or WT_PERSIST_REPORT are called automatically after the Persist add-on is installed. However, the WT_CORE_REPORT hook can be recreated to restore this functionality.
+
+WT_TEXT_REPORT is used to format the results of an ad-hoc assertion that is not part of a Test Runner call tree (call graph). The results of ad-hoc assertions are always sent to DBMS_OUTPUT.
### Custom Reporter
-There is no custom reporter. The definition of the wtPLSQL tables is defined so reporting tools can be used to create custom reports.
+wtPLSQL has no custom reporter. An alternative to the WT_CORE_REPORTer or the WT_PERSIST_REPORTer is a user written PL/SQL program. If the Persist add-on is installed, all test results are available in database tables. Reporting tools can be used to create custom reports from database tables.
### Links
* [utPLSQL V2.3.1 Website](https://utplsql.org/moving/2016/07/07/version-2-3-1-released.html)
diff --git a/docs/utPLSQL-V3-Comparison.htm b/docs/utPLSQL-V3-Comparison.htm
index 5380208..8451f23 100644
--- a/docs/utPLSQL-V3-Comparison.htm
+++ b/docs/utPLSQL-V3-Comparison.htm
@@ -1,26 +1,18 @@
Website Home Page
utPLSQL V3 Comparison
-Under Construction
-Abbreviations:
-
-- "ut3" - utPLSQL V3
-- "wt" - wtPLSQL
-
-The Basics
-"ut3" is a comprehensive project. Its capabilities are a large and diverse. It is supported by many people around the world. If your development environment includes a wide variety of platforms and technologies, this is the best project for you.
-"wt" is an Oracle database focused project. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database.
-Goals
-The "ut3" project "follows industry standards and best patterns of modern Unit Testing frameworks like JUnit and RSpec".
-The "wt" project avoids "unit testing" by adopting practices for "white box testing".
-Customization
-The "ut3" project incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization.
-The "wt" project is centered on one platform with a very simple implementation. It is easier to customize smaller, simpler systems.
+utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality. wtPLSQL has a different focus than utPLSQL V3.
+utPLSQL V3
+utPLSQL V3 is a comprehensive project. Its capabilities are large and diverse. It incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization. It is supported by many people around the world.
+If your development environment includes a wide variety of platforms and technologies, you should consider using utPLSQL V3.
+wtPLSQL
+wtPLSQL is Oracle database focused. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database. Because it is centered on the Oracle database, it is a very simple implementation. With hooks and add-ons, it easy to customize.
+If your development environment is heavily invested in PL/SQL and the Oracle database, wtPLSQL is built for you.
Testing Methodologies
There is a longer discussion about unit testing methodologies in the About wtPSQL Page.
Fundamentally, the Oracle database is a relational database. The relational database is based on transaction processing. Data is stored and shared in a precise manner between processes.
JUnit testing is OO (Object Oriented programming) based. Encapsulation is a core part of OO. Data sharing is done through APIs (Application Programmatic Interfaces), i.e. no fundamental data persistence.
-The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases.
+The principle of "store and share" is the opposite of data encapsulation. As a result, OO testing approaches are inappropriate for relational databases.
Here are several differences in testing methodologies between relational databases and Object Oriented.
Testing Persistence of Data
@@ -29,7 +21,7 @@ Testing Persistence of Data
Isolation of Tests
-- Object Oriented - Use fakes or mocks to avoid any "integration" testing.
+- Object Oriented - Use fakes or mocks to avoid any "integration" testing.
- Relational Database - Isolating PL/SQL code from database CRUD (Create, Retrieve, Update, Delete) defeats the purpose of most PL/SQL testing.
Test Transience
@@ -43,9 +35,8 @@ Non-Sequenced Testing
- Relational Database - Testing with integrity constraints on complex persisted data and/or complex data operations can be simpler with test sequencing.
Test Driven Development (TDD/RSpec)
-In the fast-paced development cycle, defining how the software accomplishes the needs of the business is the typical focus. This is also called "happy path" functionality. Conversely, error handling and error recovery (sad path) requirements typically don't accomplish business needs. That is to say, sad path testing focuses on things going badly, not on things going well. Unfortunately, efforts to develop and define sad path requirements are typically avoided.
-TDD places no value on 100% code coverage. TDD typically avoids testing sad path testing during development.
-White box testing is centered on 100% code coverage. "Happy path" and "sad path" testing are typically required to achieve 100% code coverage.
+In the fast-paced development cycle, defining how the software accomplishes the needs of the business is the typical focus. This is also called "happy path" functionality. Conversely, error handling and error recovery (sad path) requirements typically don't accomplish business needs. That is to say, sad path testing focuses on things going badly, not on things going well. Unfortunately, efforts to develop and define sad path requirements are typically avoided.
+White box testing is centered on 100% code coverage. "Happy path" and "sad path" testing are typically required to achieve 100% code coverage.
Here is more discussion on Test Driven Development
Links
diff --git a/docs/utPLSQL-V3-Comparison.md b/docs/utPLSQL-V3-Comparison.md
index f637d2f..fc5043a 100644
--- a/docs/utPLSQL-V3-Comparison.md
+++ b/docs/utPLSQL-V3-Comparison.md
@@ -3,26 +3,20 @@
# utPLSQL V3 Comparison
---
-Under Construction
-Abbreviations:
-* "ut3" - utPLSQL V3
-* "wt" - wtPLSQL
+utPLSQL V3 is an excellent choice for unit testing. It is well supported and includes extensive functionality. wtPLSQL has a different focus than utPLSQL V3.
-## The Basics
-"ut3" is a comprehensive project. Its capabilities are a large and diverse. It is supported by many people around the world. If your development environment includes a wide variety of platforms and technologies, this is the best project for you.
+## utPLSQL V3
-"wt" is an Oracle database focused project. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database.
+utPLSQL V3 is a comprehensive project. Its capabilities are large and diverse. It incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization. It is supported by many people around the world.
-## Goals
-The "ut3" project ["follows industry standards and best patterns of modern Unit Testing frameworks like JUnit and RSpec"](https://github.com/utPLSQL/utPLSQL).
+If your development environment includes a wide variety of platforms and technologies, you should consider using utPLSQL V3.
-The "wt" project avoids "unit testing" by adopting practices for ["white box testing"](https://github.com/DDieterich/wtPLSQL/wiki/About-wtPLSQL#white-box-testing).
+## wtPLSQL
-## Customization
-The "ut3" project incorporates a wide variety of technologies and platforms. It also has a large and diverse set of capabilities that will reduce the need for customization.
+wtPLSQL is Oracle database focused. It is built entirely with PL/SQL and Application Express. All testing and reporting is done in the database. Because it is centered on the Oracle database, it is a very simple implementation. With hooks and add-ons, it easy to customize.
-The "wt" project is centered on one platform with a very simple implementation. It is easier to customize smaller, simpler systems.
+If your development environment is heavily invested in PL/SQL and the Oracle database, wtPLSQL is built for you.
## Testing Methodologies
There is a longer discussion about unit testing methodologies in the [About wtPSQL Page](https://github.com/DDieterich/wtPLSQL/wiki/About-wtPLSQL#unit-testing).
diff --git a/grbsrc/ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw b/grbsrc/ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw
new file mode 100644
index 0000000..39113ef
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw
@@ -0,0 +1,51 @@
+
+--
+-- Create ODBCAPTURE.AQ_SYSTEM_PRIVS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."AQ_SYSTEM_PRIVS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.AQ_SYSTEM_PRIVS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."AQ_SYSTEM_PRIVS_VW" ("GRANTEE", "PRIVILEGE", "DBMS_AQ_PRIV", "ADMIN_OPTION", "COMMON", "INHERITED") AS
+ select grantee
+ ,privilege
+ ,case privilege
+ when 'ENQUEUE ANY QUEUE' then 'ENQUEUE_ANY'
+ when 'DEQUEUE ANY QUEUE' then 'DEQUEUE_ANY'
+ when 'MANAGE ANY QUEUE' then 'MANAGE_ANY'
+ else 'ERROR: Unknown Privilege ' || privilege
+ end DBMS_AQ_PRIV
+ ,admin_option
+ ,common
+ ,inherited
+ from dba_sys_privs
+ where privilege like '% ANY QUEUE';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.AQ_SYSTEM_PRIVS_VW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/COMMON_UTIL.pbody b/grbsrc/ODBCAPTURE/COMMON_UTIL.pbody
new file mode 100644
index 0000000..26376df
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/COMMON_UTIL.pbody
@@ -0,0 +1,359 @@
+
+--
+-- Create ODBCAPTURE.COMMON_UTIL Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.COMMON_UTIL
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ODBCAPTURE"."COMMON_UTIL"
+as
+
+------------------------------------------------------------
+-- Set DBMS_METADATA Transformation Parameters
+procedure dbms_metadata_settings
+is
+begin
+ -- http://docs.oracle.com/database/121/ARPLS/d_metada.htm#ARPLS66910
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'TABLESPACE' ,false);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE' ,false);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES' ,false);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PARTITIONING' ,false);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'LOB_STORAGE' ,'NO_CHANGE');
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'TABLE_COMPRESSION_CLAUSE','NONE');
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS_AS_ALTER' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'REF_CONSTRAINTS' ,false);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'OID' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SIZE_BYTE_KEYWORD' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'FORCE' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR' ,true);
+ dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY' ,true);
+end dbms_metadata_settings;
+
+------------------------------------------------------------
+-- RPAD changed to include truncate.
+-- This function brings back the old functionality.
+function old_rpad
+ (in_expr1 in varchar2
+ ,in_n in number
+ ,in_expr2 in varchar2 default null)
+ return varchar2
+is
+begin
+ if in_expr1 is null or length(in_expr1) >= in_n
+ then
+ return in_expr1;
+ end if;
+ return rpad(in_expr1, in_n, nvl(in_expr2,' '));
+end old_rpad;
+
+------------------------------------------------------------
+-- Return RECYCLE_BIN_NAME_MATCH for SQL Queries
+function get_RECYCLE_BIN_NAME_MATCH
+ return varchar2
+is
+begin
+ return RECYCLE_BIN_NAME_MATCH;
+end get_RECYCLE_BIN_NAME_MATCH;
+
+------------------------------------------------------------
+-- Return a string that will split the metadata at the comma
+-- in case the string is longer than MAX_SQL_LEN
+function vw_split_str
+ (in_str IN CLOB)
+ return CLOB
+is
+ olen number; -- Original Length of IN_STR
+ ptr number; -- Current Position in IN_STR
+ out_str CLOB; -- Output String
+ oset number; -- Line Cut-off at the comma closer to the "in_max_len"
+begin
+ olen := length(in_str);
+ ptr := 1;
+ out_str := '';
+ while olen - ptr + 1 > common_util.MAX_SQL_LEN
+ loop
+ oset := instr(substr(in_str, ptr, common_util.MAX_SQL_LEN), LF, -1);
+ if oset <= 0
+ then
+ oset := instr(substr(in_str, ptr, common_util.MAX_SQL_LEN), ',', -1);
+ if oset <= 0
+ then
+ raise_application_error(-20000
+ ,substr('Unable to find "," in string: ' ||
+ substr(in_str, ptr, common_util.MAX_SQL_LEN)
+ ,1,4000 ) );
+ end if;
+ out_str := out_str || substr(substr(in_str, ptr, common_util.MAX_SQL_LEN), 1, oset) || LF;
+ else
+ out_str := out_str || substr(substr(in_str, ptr, common_util.MAX_SQL_LEN), 1, oset);
+ end if;
+ ptr := ptr + oset;
+ end loop;
+ return(out_str || substr(in_str, ptr, common_util.MAX_SQL_LEN));
+end vw_split_str;
+
+------------------------------------------------------------
+-- Return a string with the "@" and "^P" characters escaped
+-- Must escape "@". Otherwise, SQL*Plus will attempt to run a script
+-- CHR(16) is also called "^P", Control-P, and DLE
+function escape_at_sign
+ (in_str IN CLOB)
+ return CLOB
+is
+begin
+ -- Must Escape the "^P" before escaping the other characters
+ RETURN REGEXP_replace
+ (in_str
+ , '('||LF||'[[:space:]]*)@'
+ ,'\1'||CHR(16)||'@' );
+end escape_at_sign;
+
+------------------------------------------------------------
+-- External function for CLOB Replacements
+--
+-- ORA-03001 from SUBSTR on output from getclobval from a binary XML (Doc ID 2016996.1)
+-- The LOB returned by getClobVal() is an abstract CSX LOB
+--
+function clob_replace
+ (in_clob in clob
+ ,in_search_string in varchar2
+ ,in_replacement_string in varchar2)
+ return clob
+is
+ l_clob clob;
+begin
+ -- This avoids a ORA-22275 "invalid LOB locator specified"
+ if nvl(DBMS_LOB.GETLENGTH(in_clob),0) <= 0
+ then
+ return l_clob;
+ end if;
+ DBMS_LOB.CREATETEMPORARY(lob_loc => l_clob
+ ,cache => TRUE
+ ,dur => DBMS_LOB.CALL);
+ DBMS_LOB.COPY (dest_lob => l_clob
+ ,src_lob => in_clob
+ ,amount => 2147483647 -- 2Gb - 1
+ ,dest_offset => 1
+ ,src_offset => 1);
+ return replace(l_clob, in_search_string, in_replacement_string);
+end clob_replace;
+
+------------------------------------------------------------
+-- External function for SQL Queries
+--
+-- Function to get the object name filter result
+--
+function get_object_filter_result
+ (in_fltr_str in varchar2
+ ,in_object_name in varchar2)
+ return varchar2
+is
+ l_bool boolean;
+ fltr_str varchar2(32000):=null;
+begin
+ fltr_str :=in_fltr_str;
+ if substr(fltr_str,1,2) = '\!'
+ then
+ -- Set the "NOT" and remove the "\!"
+ fltr_str := 'begin :1 := not regexp_like(:2, ''' || substr(fltr_str,3) || '''); end;';
+ else
+ -- Use the fltr_str without changes
+ fltr_str := 'begin :1 := regexp_like(:2, ''' || fltr_str || '''); end;';
+ end if;
+ -- Test the filter, Don't care about the default user
+ begin
+ execute immediate fltr_str using out l_bool, in in_object_name;
+ exception when others then
+ raise_application_error(-20000, 'Unable to process the following statement:' || CHR(10) ||
+ fltr_str || CHR(10) ||
+ 'in_object_name: ' || in_object_name || CHR(10) ||
+ SQLERRM);
+ end;
+ if l_bool
+ then
+ -- Test result is approved!
+ return 'Y';
+ end if;
+ -- Test result is not approved!
+ return 'N';
+end get_object_filter_result;
+
+------------------------------------------------------------
+-- Check potential filenames for invalid Windows characters
+--
+--http://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
+-- < (less than)
+-- > (greater than)
+-- : (colon)
+-- " (double quote)
+-- / (forward slash)
+-- \ (backslash)
+-- | (vertical bar or pipe)
+-- ? (question mark)
+-- * (asterisk)
+--
+procedure check_filenames
+ (in_install_type in varchar2)
+is
+begin
+ for buff in (
+ select obj.object_owner || '.' || obj.object_name || '(' || obj.object_type || ')' oname
+ from dba_objects_tab obj
+ join otype_conf otl
+ on otl.name_check_otype = obj.object_type
+ where ( obj.object_type != 'TYPE'
+ or obj.object_name not like SYS_TYPE_SPEC_BODY_MATCH escape '\')
+ and regexp_like (obj.object_name, '[<>:"/\|?*]')
+ and obj.object_name not like RECYCLE_BIN_NAME_MATCH escape '\'
+ order by obj.object_owner, obj.object_name, obj.object_type)
+ loop
+ raise_application_error (-20000,
+ 'Found Forbidden Windows Filename Character in ' || buff.oname);
+ end loop;
+ -- Several Object Types have Sub-Object Types.
+ -- Also this is not necessary for Linux. It is only a problem for Windows
+ for buff in (
+ select obj.object_owner
+ ,upper(obj.object_name) object_name
+ ,obj.object_type
+ ,count(*) num_names
+ from dba_objects_tab obj
+ where obj.object_owner_install_type = in_install_type
+ and obj.object_type in (select otl.name_check_otype from otype_conf otl)
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like SYS_TYPE_SPEC_BODY_MATCH escape '\')
+ and obj.object_name not like RECYCLE_BIN_NAME_MATCH escape '\'
+ group by obj.object_owner, upper(obj.object_name), obj.object_type
+ having count(*) > 1
+ order by obj.object_owner, upper(obj.object_name), obj.object_type)
+ loop
+ raise_application_error (-20000,
+ 'Schema ' || buff.object_owner || ' has ' ||
+ buff.num_names || ' ' ||
+ buff.object_type || 's with a name like ' ||
+ buff.object_name );
+ end loop;
+end check_filenames;
+
+-------------------------------------------
+-- (Public) Refresh Original Data Tables
+-------------------------------------------
+procedure refresh_data_tables
+is
+ procedure do_it (in_text varchar2) is
+ dbi_beg_secs number := dbms_utility.get_time;
+ begin
+ execute immediate in_text;
+ dbms_output.put_line('SUCCESS(' || to_char(SQL%ROWCOUNT,'B9999') ||
+ ' rows in ' || substr(to_char((dbms_utility.get_time -
+ dbi_beg_secs
+ )/100
+ ,'B99.9')
+ ,2 -- Remove Leading space (sign is not needed)
+ ,100) ||
+ ' sec): ' || in_text );
+ exception when others then
+ raise_application_error (-20000, SQLERRM || CHR(10) ||
+ 'FAILED: ' || in_text);
+ end do_it;
+ procedure update_install_type_timing is
+ dbi_beg_secs number := dbms_utility.get_time;
+ num_rows pls_integer := 0;
+ begin
+ for buff in (select install_type from type_conf)
+ loop
+ insert into install_type_timing (from_install_type, install_timing, to_install_type)
+ with qcur as (
+ select buff.install_type INSTALL_GROUP
+ ,'CURRENT' HIERARCHY_DIRECTION
+ ,tc.install_type
+ from type_conf tc
+ connect by nocycle prior tc.install_type_parent = tc.install_type
+ start with tc.install_type = buff.install_type
+ ), qfut as (
+ select buff.install_type INSTALL_GROUP
+ ,'FUTURE' HIERARCHY_DIRECTION
+ ,tc.install_type
+ from type_conf tc
+ connect by nocycle tc.install_type_parent = prior tc.install_type
+ start with tc.install_type = buff.install_type
+ )
+ select install_group, hierarchy_direction, install_type from qcur
+ UNION
+ select install_group, hierarchy_direction, install_type from qfut
+ where install_type != buff.install_type
+ UNION
+ select buff.install_type INSTALL_GROUP
+ ,'CURRENT' HIERARCHY_DIRECTION
+ ,'sys' INSTALL_TYPE
+ from dual;
+ num_rows := num_rows + SQL%ROWCOUNT;
+ end loop;
+ dbms_output.put_line('SUCCESS(' || to_char(num_rows,'B9999') ||
+ ' rows in ' || substr(to_char((dbms_utility.get_time -
+ dbi_beg_secs
+ )/100
+ ,'B99.9')
+ ,2 -- Remove Leading space (sign is not needed)
+ ,100) ||
+ ' sec): update_install_type_timing');
+ exception when others then
+ raise_application_error (-20000, 'update_install_type_timing FAILED: ' || SQLERRM);
+ end update_install_type_timing;
+begin
+ dbms_output.put_line('Running ' || $$PLSQL_UNIT || '.refresh_data_tables');
+ do_it('truncate table zx_priv_all_tab');
+ do_it('truncate table zx_obj_install_tab');
+ do_it('truncate table obj_install_comments_tab');
+ do_it('truncate table obj_install_trigger_tab');
+ do_it('truncate table obj_install_synonym_tab');
+ do_it('truncate table obj_install_data_load_tab');
+ do_it('truncate table obj_install_index_tab');
+ do_it('truncate table obj_install_fkey_tab');
+ do_it('truncate table obj_install_context_tab');
+ do_it('truncate table obj_install_object_tab');
+ do_it('truncate table dba_dependencies_tab');
+ do_it('truncate table dba_tab_privs_tab');
+ do_it('truncate table dba_objects_tab');
+ do_it('truncate table install_type_timing');
+ do_it('purge dba_recyclebin');
+ update_install_type_timing;
+ do_it('insert into dba_objects_tab select * from dba_objects_view');
+ do_it('insert into dba_tab_privs_tab select * from dba_tab_privs_view');
+ do_it('insert into dba_dependencies_tab select * from dba_dependencies_view');
+ do_it('insert into obj_install_object_tab select * from obj_install_object_view');
+ do_it('insert into obj_install_context_tab select * from obj_install_context_view');
+ do_it('insert into obj_install_fkey_tab select * from obj_install_fkey_view');
+ do_it('insert into obj_install_index_tab select * from obj_install_index_view');
+ do_it('insert into obj_install_data_load_tab select * from obj_install_data_load_view');
+ do_it('insert into obj_install_synonym_tab select * from obj_install_synonym_view');
+ do_it('insert into obj_install_trigger_tab select * from obj_install_trigger_view');
+ do_it('insert into obj_install_comments_tab select * from obj_install_comments_view');
+ do_it('insert into zx_obj_install_tab select * from zx_obj_install_view');
+ do_it('insert into zx_priv_all_tab select * from zx_priv_all_view');
+ commit;
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''DBA_OBJECTS_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''DBA_TAB_PRIVS_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''DBA_DEPENDENCIES_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_OBJECT_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_CONTEXT_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_FKEY_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_INDEX_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_DATA_LOAD_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_SYNONYM_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_TRIGGER_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''OBJ_INSTALL_COMMENTS_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''ZX_OBJ_INSTALL_TAB'', cascade => TRUE); end;');
+ do_it('begin sys.dbms_stats.gather_table_stats(ownname => ''ODBCAPTURE'', tabname => ''ZX_PRIV_ALL_TAB'', cascade => TRUE); end;');
+ commit;
+end refresh_data_tables;
+
+
+end common_util;
+/
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/COMMON_UTIL.pspec b/grbsrc/ODBCAPTURE/COMMON_UTIL.pspec
new file mode 100644
index 0000000..7ce87b7
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/COMMON_UTIL.pspec
@@ -0,0 +1,98 @@
+
+--
+-- Create ODBCAPTURE.COMMON_UTIL Package
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.COMMON_UTIL
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "ODBCAPTURE"."COMMON_UTIL" AUTHID DEFINER
+as
+
+ -- Base64 Encoding Header
+ B64_ENCODE_HEADER CONSTANT varchar2(30) := '(Base64 with Linefeeds)';
+ -- Maximum Line Length for SQL*Plus
+ MAX_SQL_LEN CONSTANT integer := 2499-2; -- Allow 2 EOL characters
+ -- Maximum Line Length for SQL*Loader Data File
+ MAX_LDR_LEN CONSTANT integer := 32767-2; -- Allow 2 EOL characters
+ -- Maximum Line Length for UNIX/Linux scripts
+ MAX_UNX_LEN CONSTANT integer := 32000-2; -- Allow 2 EOL characters
+ -- Maximum Line Length for Windows scripts
+ MAX_WIN_LEN CONSTANT integer := 8191-2; -- Allow 2 EOL characters
+ -- Part of TPS/TPB Name Filter
+ SYS_TYPE_SPEC_BODY_MATCH CONSTANT varchar2(10) := 'SYSTP%==';
+ -- Recycle Bin Name Filter
+ RECYCLE_BIN_NAME_MATCH CONSTANT varchar2(10) := 'BIN$%';
+ -- Materialized View Automatic Index Prefix
+ MVIEW_AUTO_INDEX_PREFIX CONSTANT varchar2(10) := 'I_SNAP$_';
+ -- SYS_PLSQL Pipelined Type Objects: Created and granted with pipeline package/function
+ PIPELINE_TYPE_MATCH CONSTANT varchar2(20) := 'SYS\_PLSQL\_%';
+ -- https://blogs.oracle.com/db/entry/oracle_support_master_note_for_troubleshooting_advanced_queuing_and_oracle_streams_propagation_issue
+ QUEUE_VIEW_TYPE_MATCH CONSTANT varchar2(20) := 'QT%\_BUFFER';
+ -- Advanced Queue Table and View Name Regular Expression (Prefix and Suffix)
+ -- ^ - anchor to the start of the line
+ -- AQ[$][_]{0,1} - Matches 'AQ$' or 'AQ$_'
+ QUEUE_NAME_PREFIX_REGEXP CONSTANT varchar2(20) := '^AQ[$][_]{0,1}';
+ -- ([_][FHIRST]){0,1} - Matches '', '_F', '_H', '_I', '_R', '_S', or '_T'
+ -- $ - anchor to the end of the line
+ QUEUE_NAME_SUFFIX_REGEXP CONSTANT varchar2(20) := '([_][A-Z]){0,1}$';
+ -- Only for removal of storage clause from SQL
+ STORAGE_CLAUSE_MATCH CONSTANT varchar2(30) := ' storage_clause => %';
+
+ LF constant varchar2(1) := CHR(10);
+ CRTN constant varchar2(1) := CHR(13);
+
+ c_dirname_prefix CONSTANT varchar2(100) := 'DEV_';
+ c_dirname_suffix CONSTANT varchar2(100) := '';
+
+ c_install_prefix CONSTANT varchar2(100) := 'aaa_install_';
+ c_install_suffix CONSTANT varchar2(100) := '';
+
+ procedure dbms_metadata_settings;
+
+ function old_rpad
+ (in_expr1 in varchar2
+ ,in_n in number
+ ,in_expr2 in varchar2 default null)
+ return varchar2;
+
+ function get_RECYCLE_BIN_NAME_MATCH
+ return varchar2;
+
+ function vw_split_str
+ (in_str IN CLOB)
+ return CLOB;
+
+ function escape_at_sign
+ (in_str IN CLOB)
+ return CLOB;
+
+ function clob_replace
+ (in_clob in clob
+ ,in_search_string in varchar2
+ ,in_replacement_string in varchar2)
+ return clob;
+
+ function get_object_filter_result
+ (in_fltr_str in varchar2
+ ,in_object_name in varchar2)
+ return varchar2;
+
+ procedure check_filenames
+ (in_install_type in varchar2);
+
+ procedure refresh_data_tables;
+
+end common_util;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab
new file mode 100644
index 0000000..e5c024e
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab
@@ -0,0 +1,39 @@
+
+--
+-- Create ODBCAPTURE.DBA_DEPENDENCIES_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_TAB
+
+ CREATE TABLE "ODBCAPTURE"."DBA_DEPENDENCIES_TAB"
+ ( "OBJECT_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "OBJECT_OWNER" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "OBJECT_NAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "OBJECT_TYPE" VARCHAR2(19 BYTE),
+ "REFERENCED_OWNER" VARCHAR2(128 BYTE),
+ "REF_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "REFERENCED_NAME" VARCHAR2(128 BYTE),
+ "REFERENCED_TYPE" VARCHAR2(19 BYTE),
+ "REFERENCED_LINK_NAME" VARCHAR2(128 BYTE),
+ "DEPENDENCY_TYPE" VARCHAR2(4 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind
new file mode 100644
index 0000000..2f4820c
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind
@@ -0,0 +1,23 @@
+
+--
+-- Create Indexes for ODBCAPTURE.DBA_DEPENDENCIES_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_TAB_IDX2
+
+ CREATE INDEX "ODBCAPTURE"."DBA_DEPENDENCIES_TAB_IDX2" ON "ODBCAPTURE"."DBA_DEPENDENCIES_TAB" ("REFERENCED_OWNER", "REFERENCED_NAME", "REFERENCED_TYPE")
+ ;
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."DBA_DEPENDENCIES_TAB_IX1" ON "ODBCAPTURE"."DBA_DEPENDENCIES_TAB" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw
new file mode 100644
index 0000000..d928451
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw
@@ -0,0 +1,55 @@
+
+--
+-- Create ODBCAPTURE.DBA_DEPENDENCIES_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."DBA_DEPENDENCIES_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."DBA_DEPENDENCIES_VIEW" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "REFERENCED_OWNER", "REF_OWNER_INSTALL_TYPE", "REFERENCED_NAME", "REFERENCED_TYPE", "REFERENCED_LINK_NAME", "DEPENDENCY_TYPE") AS
+ select scd.install_type OBJECT_OWNER_INSTALL_TYPE
+ ,dep.owner OBJECT_OWNER
+ ,dep.name OBJECT_NAME
+ ,dep.type OBJECT_TYPE
+ ,dep.referenced_owner
+ ,scr.install_type REF_OWNER_INSTALL_TYPE
+ ,dep.referenced_name
+ ,dep.referenced_type
+ ,dep.referenced_link_name
+ ,dep.dependency_type
+ from schema_conf scd
+ join dba_dependencies dep
+ on dep.owner = scd.username
+ join schema_conf scr
+ on scr.username = dep.referenced_owner
+ -- Exclude 'sys' and 'pub' database objects
+ where scd.install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_DEPENDENCIES_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tab b/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tab
new file mode 100644
index 0000000..542fc24
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tab
@@ -0,0 +1,35 @@
+
+--
+-- Create ODBCAPTURE.DBA_OBJECTS_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_OBJECTS_TAB
+
+ CREATE TABLE "ODBCAPTURE"."DBA_OBJECTS_TAB"
+ ( "OBJECT_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_OWNER" VARCHAR2(128 BYTE),
+ "OBJECT_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(23 BYTE),
+ "TABLE_FLAG" VARCHAR2(3 BYTE),
+ "SELTYPE" VARCHAR2(4 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_OBJECTS_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tabind b/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tabind
new file mode 100644
index 0000000..1a886c7
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_OBJECTS_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.DBA_OBJECTS_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.DBA_OBJECTS_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."DBA_OBJECTS_TAB_IX1" ON "ODBCAPTURE"."DBA_OBJECTS_TAB" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_OBJECTS_VIEW.vw b/grbsrc/ODBCAPTURE/DBA_OBJECTS_VIEW.vw
new file mode 100644
index 0000000..14595a9
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_OBJECTS_VIEW.vw
@@ -0,0 +1,126 @@
+
+--
+-- Create ODBCAPTURE.DBA_OBJECTS_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."DBA_OBJECTS_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_OBJECTS_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."DBA_OBJECTS_VIEW" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "TABLE_FLAG", "SELTYPE") AS
+ select sc.install_type OBJECT_OWNER_INSTALL_TYPE
+ ,obj.owner OBJECT_OWNER
+ ,obj.object_name
+ ,obj.object_type
+ ,case when tab.table_name is not null then 'TAB'
+ when xml.table_name is not null then 'XML'
+ when nt.table_name is not null then 'NT'
+ else NULL
+ end TABLE_FLAG
+ ,'BASE' SELTYPE
+ from schema_conf sc
+ join dba_objects obj
+ on obj.owner = sc.username
+ left join dba_tables tab
+ on tab.owner = obj.owner
+ and tab.table_name = obj.object_name
+ and obj.object_type = 'TABLE'
+ left join dba_xml_tables xml
+ on xml.owner = obj.owner
+ and xml.table_name = obj.object_name
+ and obj.object_type = 'TABLE'
+ left join dba_nested_tables nt
+ on nt.owner = obj.owner
+ and nt.table_name = obj.object_name
+ and obj.object_type = 'TABLE'
+ where sc.install_type not in ('sys', 'pub')
+ group by obj.owner
+ ,sc.install_type
+ ,obj.object_name
+ ,obj.object_type
+ ,case when tab.table_name is not null then 'TAB'
+ when xml.table_name is not null then 'XML'
+ when nt.table_name is not null then 'NT'
+ else NULL
+ end
+UNION ALL
+select sco.install_type OBJECT_OWNER_INSTALL_TYPE
+ ,syn.owner OBJECT_OWNER
+ ,syn.synonym_name OBJECT_NAME
+ ,'SYNONYM' OBJECT_TYPE
+ ,NULL TABLE_FLAG
+ ,'PUB' SELTYPE
+ from schema_conf sco
+ join dba_synonyms syn
+ on syn.owner = sco.username
+ join schema_conf sct
+ on sct.username = syn.table_owner
+ and sct.install_type not in ('sys','pub')
+ where sco.install_type = 'pub' -- Public Synonyms
+UNION ALL
+select sco.install_type OBJECT_OWNER_INSTALL_TYPE
+ ,priv.owner OBJECT_OWNER
+ ,priv.table_name OBJECT_NAME
+ ,priv.type OBJECT_TYPE
+ ,case when tab.table_name is not null then 'TAB'
+ when xml.table_name is not null then 'XML'
+ when nt.table_name is not null then 'NT'
+ else NULL
+ end TABLE_FLAG
+ ,'SYS' SELTYPE
+ from schema_conf sco
+ join dba_tab_privs priv
+ on priv.owner = sco.username
+ join schema_conf sct
+ on sct.username = priv.grantee
+ and sct.install_type not in ('sys','pub')
+ left join dba_tables tab
+ on tab.owner = priv.owner
+ and tab.table_name = priv.table_name
+ and priv.type = 'TABLE'
+ left join dba_xml_tables xml
+ on xml.owner = priv.owner
+ and xml.table_name = priv.table_name
+ and priv.type = 'TABLE'
+ left join dba_nested_tables nt
+ on nt.owner = priv.owner
+ and nt.table_name = priv.table_name
+ and priv.type = 'TABLE'
+ where sco.install_type = 'sys' -- 'sys' priv.table owners
+ group by priv.owner
+ ,sco.install_type
+ ,priv.table_name
+ ,priv.type
+ ,case when tab.table_name is not null then 'TAB'
+ when xml.table_name is not null then 'XML'
+ when nt.table_name is not null then 'NT'
+ else NULL
+ end;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_OBJECTS_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab
new file mode 100644
index 0000000..8496b50
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab
@@ -0,0 +1,41 @@
+
+--
+-- Create ODBCAPTURE.DBA_TAB_PRIVS_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_TAB_PRIVS_TAB
+
+ CREATE TABLE "ODBCAPTURE"."DBA_TAB_PRIVS_TAB"
+ ( "OBJECT_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_OWNER" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(24 BYTE),
+ "OBJECT_NAME" VARCHAR2(128 BYTE),
+ "PRIVILEGE" VARCHAR2(40 BYTE),
+ "GRANTEE" VARCHAR2(128 BYTE),
+ "GRANTEE_UOR_TYPE" CHAR(4 BYTE),
+ "GRANTEE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "GRANTABLE" VARCHAR2(3 BYTE),
+ "HIERARCHY" VARCHAR2(3 BYTE),
+ "COMMON" VARCHAR2(3 BYTE),
+ "INHERITED" VARCHAR2(3 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_TAB_PRIVS_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind
new file mode 100644
index 0000000..e071084
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.DBA_TAB_PRIVS_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.DBA_TAB_PRIVS_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."DBA_TAB_PRIVS_TAB_IX1" ON "ODBCAPTURE"."DBA_TAB_PRIVS_TAB" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw
new file mode 100644
index 0000000..4638729
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw
@@ -0,0 +1,62 @@
+
+--
+-- Create ODBCAPTURE.DBA_TAB_PRIVS_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."DBA_TAB_PRIVS_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.DBA_TAB_PRIVS_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."DBA_TAB_PRIVS_VIEW" ("OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_TYPE", "OBJECT_NAME", "PRIVILEGE", "GRANTEE", "GRANTEE_UOR_TYPE", "GRANTEE_INSTALL_TYPE", "GRANTABLE", "HIERARCHY", "COMMON", "INHERITED") AS
+ select obj.object_owner_install_type
+ ,priv.owner OBJECT_OWNER
+ ,priv.type OBJECT_TYPE
+ ,priv.table_name OBJECT_NAME
+ ,priv.privilege
+ ,priv.grantee
+ ,gsl.uor_type GRANTEE_UOR_TYPE
+ ,gsl.install_type GRANTEE_INSTALL_TYPE
+ ,priv.grantable
+ ,priv.hierarchy
+ ,priv.common
+ ,priv.inherited
+ from dba_objects_tab obj
+ join dba_tab_privs priv
+ on priv.owner = obj.object_owner
+ and priv.table_name = obj.object_name
+ join uor_install_view gsl
+ on gsl.user_or_role = priv.grantee
+ where ( gsl.install_type not in ('sys','pub') -- No Grants to 'sys' or 'pub' grantees
+ OR ( gsl.install_type = 'pub' -- Grants to 'pub'
+ and obj.object_owner_install_type not in ('sys','pub') ) -- But not owned by 'sys' or 'pub'
+ OR ( gsl.install_type = 'pub' -- Grants to 'pub'
+ and priv.type = 'DIRECTORY') -- Directories are owned by 'SYS'
+ );
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DBA_TAB_PRIVS_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DLOAD_CONF.cdl b/grbsrc/ODBCAPTURE/DLOAD_CONF.cdl
new file mode 100644
index 0000000..3430689
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DLOAD_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.DLOAD_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'DLOAD_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'DLOAD_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."DLOAD_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/DLOAD_CONF.ctl data=ODBCAPTURE/DLOAD_CONF.csv log=ODBCAPTURE/DLOAD_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/DLOAD_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/grbsrc/ODBCAPTURE/DLOAD_CONF.csv b/grbsrc/ODBCAPTURE/DLOAD_CONF.csv
new file mode 100644
index 0000000..04918eb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DLOAD_CONF.csv
@@ -0,0 +1,7 @@
+"USERNAME","TABLE_NAME","INSTALL_TYPE","BEFORE_SELECT_SQL","WHERE_CLAUSE","ORDER_BY_COLUMNS","AFTER_ORDER_BY_SQL","NOTES"
+"ODBCAPTURE","DLOAD_CONF","grbsrc",,"install_type in ('sys','pub','grbsrc')","USERNAME, TABLE_NAME, INSTALL_TYPE",,
+"ODBCAPTURE","OBJECT_CONF","grbsrc",,"install_type in ('sys','pub','grbsrc')","USERNAME, INSTALL_OTYPE, INSTALL_TYPE",,
+"ODBCAPTURE","OTYPE_CONF","grbsrc",,,"INSTALL_OTYPE",,
+"ODBCAPTURE","ROLE_CONF","grbsrc",,"install_type in ('sys','pub','grbsrc')","ROLENAME, INSTALL_TYPE",,
+"ODBCAPTURE","SCHEMA_CONF","grbsrc",,"install_type in ('sys','pub','grbsrc')","USERNAME",,
+"ODBCAPTURE","TYPE_CONF","grbsrc",,"install_type in ('sys','pub','grbsrc')","INSTALL_TYPE",,
diff --git a/grbsrc/ODBCAPTURE/DLOAD_CONF.ctl b/grbsrc/ODBCAPTURE/DLOAD_CONF.ctl
new file mode 100644
index 0000000..89a6ffb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DLOAD_CONF.ctl
@@ -0,0 +1,14 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."DLOAD_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,TABLE_NAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,BEFORE_SELECT_SQL CHAR(4000)
+ ,WHERE_CLAUSE CHAR(4000)
+ ,ORDER_BY_COLUMNS CHAR(4000)
+ ,AFTER_ORDER_BY_SQL CHAR(4000)
+ ,NOTES CHAR(1024)
+ )
diff --git a/grbsrc/ODBCAPTURE/DLOAD_CONF.tab b/grbsrc/ODBCAPTURE/DLOAD_CONF.tab
new file mode 100644
index 0000000..9a7ead3
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DLOAD_CONF.tab
@@ -0,0 +1,49 @@
+
+--
+-- Create ODBCAPTURE.DLOAD_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.DLOAD_CONF
+
+ CREATE TABLE "ODBCAPTURE"."DLOAD_CONF"
+ ( "USERNAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "TABLE_NAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "BEFORE_SELECT_SQL" VARCHAR2(4000 BYTE),
+ "WHERE_CLAUSE" VARCHAR2(4000 BYTE),
+ "ORDER_BY_COLUMNS" VARCHAR2(4000 BYTE) NOT NULL ENABLE,
+ "AFTER_ORDER_BY_SQL" VARCHAR2(4000 BYTE),
+ "NOTES" VARCHAR2(1024 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."DLOAD_CONF" ADD CONSTRAINT "DLOAD_CONF_PK" PRIMARY KEY ("USERNAME", "TABLE_NAME", "INSTALL_TYPE")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.DLOAD_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."USERNAME" IS 'Name of the database schema (Primary Key Column 1). Value must be in SCHEMA_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."TABLE_NAME" IS 'Name of the database table/view (Primary Key Column 2).';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."INSTALL_TYPE" IS 'Name of the database schema (Primary Key Column 3). Value must be in TYPE_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."BEFORE_SELECT_SQL" IS 'Any SQL before " select * from owner.table " for the selected data load to capture (Optional).';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."WHERE_CLAUSE" IS 'WHERE clause for the selected data load to capture (Optional). Do not add the WHERE keyword';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."ORDER_BY_COLUMNS" IS 'ORDER BY columns for the selected data load to capture. List the column names as they would appear in an ORDER BY clause.';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."AFTER_ORDER_BY_SQL" IS 'Any SQL after the ORDER BY clause for the selected data load to capture (Optional). Do not add ";" at the end.';
+ COMMENT ON COLUMN "ODBCAPTURE"."DLOAD_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON TABLE "ODBCAPTURE"."DLOAD_CONF" IS 'DATA LOAD filter for each table/view in a schema for an install type.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/DLOAD_CONF.tabfk b/grbsrc/ODBCAPTURE/DLOAD_CONF.tabfk
new file mode 100644
index 0000000..b6718cb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/DLOAD_CONF.tabfk
@@ -0,0 +1,23 @@
+
+--
+-- Create Foreign Keys for ODBCAPTURE.DLOAD_CONF TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.DLOAD_CONF_FK1
+
+ ALTER TABLE "ODBCAPTURE"."DLOAD_CONF" ADD CONSTRAINT "DLOAD_CONF_FK1" FOREIGN KEY ("USERNAME")
+ REFERENCES "ODBCAPTURE"."SCHEMA_CONF" ("USERNAME") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.DLOAD_CONF_FK2
+
+ ALTER TABLE "ODBCAPTURE"."DLOAD_CONF" ADD CONSTRAINT "DLOAD_CONF_FK2" FOREIGN KEY ("INSTALL_TYPE")
+ REFERENCES "ODBCAPTURE"."TYPE_CONF" ("INSTALL_TYPE") ENABLE;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pbody b/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pbody
new file mode 100644
index 0000000..1c4176e
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pbody
@@ -0,0 +1,4406 @@
+
+--
+-- Create ODBCAPTURE.GRAB_SCRIPTS Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.GRAB_SCRIPTS
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ODBCAPTURE"."GRAB_SCRIPTS"
+as
+
+ g_install_type type_conf.install_type%TYPE;
+ g_schema_name varchar2(128);
+
+--
+-- Table of Functions/Procedures
+--
+-- Script Handling Utilities
+-- -) function script_is_open
+-- -) PROCEDURE script_close_all
+-- -) function script_open
+-- -) procedure script_put
+-- -) procedure script_put_line
+-- -) PROCEDURE script_new_line
+-- -) PROCEDURE script_close
+-- -) procedure big_put_line
+-- -) procedure rem_qt_storage
+-- Script Generating Procedures
+-- -) procedure get_object_grants - Create Object Based Grant
+-- -) procedure get_synonyms - Create Object Based Synonym
+-- -) procedure cr_acl - Create XDB ACL
+-- -) procedure cr_aq - Create Advanced Queue
+-- -) procedure cr_aqt - Create Advanced Queue Table
+-- -) procedure cr_common
+-- -) Create FUNCTION
+-- -) Create PACKAGE_BODY
+-- -) Create PACKAGE_SPEC
+-- -) Create PROCEDURE
+-- -) Create SCHEDULER_JOB
+-- -) Create SCHEDULER_PROGRAM
+-- -) Create SCHEDULER_SCHEDULE
+-- -) Create SEQUENCE
+-- -) Create TYPE_BODY
+-- -) Create TYPE_SPEC
+-- -) procedure cr_cdl - Create Consolidated Data Load
+-- -) PROCEDURE cr_ctx - Create Context
+-- -) procedure cr_dbtrg - Create Database Trigger
+-- -) procedure cr_dblnk - Create Database Link
+-- -) procedure cr_dir - Create Directory
+-- -) procedure cr_fk - Create Foreign Key
+-- -) procedure cr_grnt - Create "Delayed" Grant
+-- -) procedure cr_ind - Create Index
+-- -) procedure cr_install_master - Create Master Call Script
+-- -) procedure cr_install_schemas - Create Schema/Owner Call Script
+-- -) procedure cr_install_sys - Create SYS Call Script
+-- -) procedure cr_install_system - Create SYSTEM Call Script
+-- -) procedure cr_mvw - Create Materialized View
+-- -) procedure cr_pjava - Create Java Source
+-- -) procedure cr_rol - Create Role
+-- -) procedure cr_schtrg - Create Schema Trigger
+-- -) procedure cr_syn - Create "Delayed" Synonym
+-- -) procedure cr_tab - Create Table
+-- -) procedure cr_trg - Create Table/View Trigger
+-- -) procedure cr_usr - Create User
+-- -) procedure cr_vw - Create View
+-- Setup and Main Control
+-- -) procedure initialize
+-- -) procedure set_schema_name
+-- -) procedure gen_installs
+-- -) procedure gen_schemas
+-- PUBLIC API
+-- -) procedure all_scripts
+-- -) procedure write_scripts
+-- -) procedure clear_buffers
+-- -) function get_version
+--
+
+
+------------------------------------------------------------
+--- Script Handling Utilities ---
+------------------------------------------------------------
+
+
+-----------------------------------------------------
+-- Check if a Script File is Open
+function script_is_open
+ (file in sf_ptr_type)
+ return boolean
+is
+begin
+ return sf_aa.exists(file.inst_type)
+ and sf_aa(file.inst_type).exists(file.inst_ord)
+ and sf_aa(file.inst_type)(file.inst_ord).exists(file.file_id)
+ and sf_aa(file.inst_type)(file.inst_ord)(file.file_id).is_open = 'Y';
+end script_is_open;
+
+-----------------------------------------------------
+-- Close all Script Files
+PROCEDURE script_close_all
+is
+ inst_ord pls_integer;
+ file_id pls_integer;
+begin
+ if NOT sf_aa.EXISTS(g_install_type)
+ then
+ return;
+ end if;
+ -- Install Order Loop
+ inst_ord := sf_aa(g_install_type).FIRST;
+ <>
+ loop
+ -- File ID
+ file_id := sf_aa(g_install_type)(inst_ord).FIRST;
+ <>
+ loop
+ --
+ if sf_aa(g_install_type)(inst_ord)(file_id).is_open = 'Y'
+ then
+ sf_aa(g_install_type)(inst_ord)(file_id).is_open := 'N';
+ dbms_output.put_line('SCRIPT_CLOSE_ALL: inst_type: ' || g_install_type ||
+ ', inst_ord: ' || inst_ord ||
+ ', file_id: ' || file_id ||
+ ' was open.' );
+ end if;
+ --
+ exit FILE_LOOP when file_id = sf_aa(g_install_type)(inst_ord).LAST;
+ file_id := sf_aa(g_install_type)(inst_ord).NEXT(file_id);
+ end loop; --FILE_LOOP
+ --
+ exit DIR_LOOP when inst_ord = sf_aa(g_install_type).LAST;
+ inst_ord := sf_aa(g_install_type).NEXT(inst_ord);
+ end loop; --DIR_LOOP
+end script_close_all;
+
+-----------------------------------------------------
+-- Open a Script File
+function script_open
+ (in_filename in varchar2
+ ,in_otype in varchar2
+ ,in_max_linesize in binary_integer default 1024)
+ return sf_ptr_type
+is
+ sf_ptr sf_ptr_type;
+ schema_name varchar2(128);
+ filename varchar2(500);
+ init_sf_aa boolean;
+ ----------------------------------------
+ -- Find the Install Order for the in_otype
+ procedure get_install_order is
+ begin
+ sf_ptr.inst_ord := null;
+ if in_otype = 'INSTALL_SCRIPT'
+ then
+ sf_ptr.inst_ord := -999;
+ return;
+ end if;
+ select install_order into sf_ptr.inst_ord
+ from otype_conf
+ where install_otype = in_otype;
+ exception when OTHERS
+ then
+ script_close_all;
+ raise_application_error(-20000, 'in_otype "' || in_otype ||
+ '" not found in OTYPE_CONF in script_open function' || LF ||
+ SQLERRM);
+ end get_install_order;
+ ----------------------------------------
+ -- Find the File ID for the sf_ptr.inst_ord, and filename
+ procedure get_file_id is
+ file_id pls_integer;
+ begin
+ -- Find Filename in Script File Array
+ file_id := sf_aa(g_install_type)(sf_ptr.inst_ord).FIRST;
+ loop
+ if ( sf_aa(g_install_type)(sf_ptr.inst_ord)(file_id).schema_name = schema_name
+ OR ( sf_aa(g_install_type)(sf_ptr.inst_ord)(file_id).schema_name is null
+ AND schema_name is null) )
+ AND sf_aa(g_install_type)(sf_ptr.inst_ord)(file_id).filename = filename
+ then
+ sf_ptr.file_id := file_id;
+ if script_is_open(sf_ptr)
+ then
+ raise_application_error(-20000, 'Script Name: "' || g_install_type ||
+ '/' || schema_name ||
+ '/' || filename ||
+ '" (OTYPE: ' || in_otype ||
+ ') is already open.');
+ end if;
+ exit;
+ end if;
+ --
+ exit when file_id = sf_aa(g_install_type)(sf_ptr.inst_ord).LAST;
+ file_id := sf_aa(g_install_type)(sf_ptr.inst_ord).NEXT(file_id);
+ end loop;
+ end get_file_id;
+begin
+ sf_ptr.inst_type := g_install_type;
+ -- Set the Schema Name
+ schema_name := case when g_schema_name is null then NULL
+ when g_schema_name = 'PUBLIC' then 'SYSTEM'
+ else g_schema_name
+ end;
+ -- Get the Install Order to sf_ptr
+ get_install_order;
+ -- Starting from Oracle Database release 19c, version 19.3, file names
+ -- with the $ character will no longer run on Windows.
+ if instr(in_filename,'$') != 0
+ then
+ dbms_output.put_line(' Warning: Changed "$" to "_" in filename: ' || in_filename);
+ end if;
+ -- Windows also has trouble with "%" in a script name
+ -- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Database-Object-Names-and-Qualifiers.html
+ -- Quoted identifiers can contain any characters and punctuations marks as well as spaces
+ if instr(in_filename,'%') != 0
+ then
+ dbms_output.put_line(' Warning: Changed "%" to "_" in filename: ' || in_filename);
+ end if;
+ -- Set Filename
+ filename := replace(replace(in_filename,'$','_'),'%','_');
+ dbms_output.put_line('Script Open: ' || g_install_type ||
+ '/' || schema_name ||
+ '/' || filename );
+ -- Find File ID
+ sf_ptr.file_id := null;
+ if sf_aa.EXISTS(g_install_type)
+ AND sf_aa(g_install_type).EXISTS(sf_ptr.inst_ord)
+ then
+ -- Get the File ID for sf_ptr
+ get_file_id;
+ if sf_ptr.file_id is not null
+ then
+ sf_ptr.num_lines := sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).num_buffers;
+ init_sf_aa := FALSE;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).is_open := 'Y';
+ else
+ sf_ptr.file_id := sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord).COUNT + 1;
+ sf_ptr.num_lines := 1;
+ init_sf_aa := TRUE;
+ end if;
+ else
+ sf_ptr.file_id := 1;
+ sf_ptr.num_lines := 1;
+ init_sf_aa := TRUE;
+ end if;
+ if init_sf_aa
+ then
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).max_linesize := in_max_linesize;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).total_bytes := 0;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).num_buffers := 1;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).is_open := 'Y';
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).schema_name := schema_name;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).filename := filename;
+ sf_aa(sf_ptr.inst_type)(sf_ptr.inst_ord)(sf_ptr.file_id).buffer_aa(1).len := 0;
+ end if;
+ return sf_ptr;
+end script_open;
+
+-----------------------------------------------------
+-- Add Characters to a Script File
+procedure script_put
+ (file IN OUT NOCOPY sf_ptr_type
+ ,buffer IN VARCHAR2)
+is
+ SEARCH_STRING CONSTANT varchar2(30) := '[^' || chr(1) || '-' || chr(127) || ']';
+ len number(5);
+ ascii_buffer varchar2(32767);
+begin
+ --
+ if nvl(lengthb(buffer),0) <= 0
+ then
+ return;
+ end if;
+ ascii_buffer := regexp_replace(buffer, SEARCH_STRING, '?');
+ len := length(ascii_buffer);
+ --dbms_output.put_line('/'||file.inst_ord||'/'||file.file_id||'('||file.num_lines||')len='||len||
+ -- '('||sf_aa(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).len||')');
+ --
+ if sf_aa(file.inst_type)(file.inst_ord)(file.file_id).max_linesize >
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).len + len
+ then
+ --
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).buffer :=
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).buffer || ascii_buffer;
+ --
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).len :=
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).len + len;
+ --
+ else
+ --
+ file.num_lines := file.num_lines + 1;
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).num_buffers := file.num_lines;
+ --
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).buffer := ascii_buffer;
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).buffer_aa(file.num_lines).len := len;
+ --
+ end if;
+ --
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).total_bytes :=
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).total_bytes + len;
+ --
+exception when others then
+ raise_application_error(-20000,
+ substr('script_put error: len = ' || len || LF ||
+ ' sf_aa('||file.inst_type||')('||file.inst_ord||')('||file.file_id||').buffer_aa('||file.num_lines||').len = ' ||
+ sf_aa( file.inst_type )( file.inst_ord )( file.file_id ).buffer_aa( file.num_lines ).len || LF ||
+ ' sf_aa('||file.inst_type||')('||file.inst_ord||')('||file.file_id||').max_linesize = ' ||
+ sf_aa( file.inst_type )( file.inst_ord )( file.file_id ).max_linesize || LF ||
+ SQLERRM || LF || dbms_utility.format_error_backtrace || dbms_utility.format_call_stack ||
+ '|' || ascii_buffer || '|'
+ ,1,2000));
+end script_put;
+
+-----------------------------------------------------
+-- Add a Line to a Script File
+procedure script_put_line
+ (file IN OUT NOCOPY sf_ptr_type
+ ,buffer IN VARCHAR2)
+is
+begin
+ script_put(file, buffer || LF);
+end script_put_line;
+
+-----------------------------------------------------
+-- Add a Line to a Script File
+PROCEDURE script_new_line
+ (file IN OUT NOCOPY sf_ptr_type
+ ,lines IN NATURAL default 1)
+is
+ buff varchar2(4000);
+begin
+ for i in 1 .. lines
+ loop
+ buff := buff || LF;
+ end loop;
+ script_put(file, buff);
+end script_new_line;
+
+-----------------------------------------------------
+-- Close a Script File
+PROCEDURE script_close
+ (file IN OUT NOCOPY sf_ptr_type)
+is
+begin
+ sf_aa(file.inst_type)(file.inst_ord)(file.file_id).is_open := 'N';
+end script_close;
+
+------------------------------------------------------------
+-- Big Put Line, because UTL_FILE can't
+--
+-- Line Cut Test
+--
+-- To reset the test:
+-- 1) Delete the "previous line was cut-off" line.
+-- 2) Rejoin the "the rest of the line" line to the
+-- "This line is longer than" line.
+-- 3) The next run of GRAB_SCRIPTS.schemas('gen','ODBCAPTURE')
+-- should separate these lines at 2499 characters
+-- again, and add the "previous line was cut-off" line.
+--
+-- This line is longer than 2499 characters. "The previous line was cut-off at NNNN chracters." should appear below -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+---------- The previous line was cut-off at 2497 chracters. ----------
+------------ This is the rest of the line that is longer than 2499 characters ----------
+--
+procedure big_put_line
+ (in_fh in out NOCOPY sf_ptr_type
+ ,in_loc in varchar2
+ ,in_txt in CLOB
+ ,in_max_len in number)
+is
+ orig_len number; -- Original Length of IN_TXT
+ ptr number; -- Current Position in IN_TXT
+ ptr_len number; -- Length of IN_TXT from PTR, including PTR
+ oset number; -- Candidate Offset from PTR
+ oset_len number; -- Length of IN_TXT from PTR to OSET,
+ -- including PTR but excluding OSET
+begin
+ orig_len := DBMS_LOB.GETLENGTH(in_txt);
+ oset := 0;
+ loop
+ -- Update PTR
+ ptr := oset + 1;
+ ptr_len := orig_len - ptr + 1;
+ -- Find a linefeed.
+ oset := instr(in_txt, LF, ptr);
+ -- Exit if there are no more LF and the remaining line is small enough.
+ -- Need to process all LF. So, don't exit loop until here.
+ exit when oset = 0 and ptr_len <= in_max_len;
+ -- oset_len does not include LF
+ oset_len := oset - ptr;
+ -- Allow for empty line
+ if oset_len between 0 and in_max_len
+ then
+ -- This line is small enough. Write it and go to next iteration.
+ if substr(in_txt, oset-1, 1) = CRTN
+ then
+ -- Remove the CRTN and the LF.
+ script_put_line(in_fh, substr(in_txt, ptr, oset_len-1));
+ else
+ script_put_line(in_fh, substr(in_txt, ptr, oset_len));
+ end if;
+ else
+ -- This line is not small enough.
+ -- Cut the line at "in_max_len" characters
+ oset := in_max_len + ptr - 1;
+ script_put_line(in_fh, substr(in_txt, ptr, in_max_len));
+ -- Add a comment about the cut
+ script_put_line(in_fh, '---------- The previous line was cut-off at ' ||
+ in_max_len || ' characters. ----------' );
+ -- Raise an exception
+ --raise_application_error
+ -- (-20000, substr('Line too long, exceeds ' ||
+ -- in_max_len || ' characters at location "' ||
+ -- substr(in_loc, 1, 150) || '"' || LF ||
+ -- substr(in_txt, ptr)
+ -- ,1,2000) );
+ end if;
+ end loop;
+ -- The remaining IN_TXT is shorter then IN_MAX_LEN
+ script_put_line(in_fh, substr(in_txt, ptr));
+end big_put_line;
+
+------------------------------------------------------------
+-- Remove Storage Parameter from DBMS_AQADM.create_queue_table
+procedure rem_qt_storage
+ (in_fh in out NOCOPY sf_ptr_type
+ ,in_loc in varchar2
+ ,in_txt in CLOB
+ ,in_max_len in number)
+is
+ len number := length(in_txt);
+ ptr number := 1; -- Current Position in IN_TXT
+ oset number; -- Offset from PTR to next LF
+begin
+ while ptr <= len
+ loop
+ oset := instr(substr(in_txt, ptr),LF);
+ if oset = 0
+ then
+ big_put_line(in_fh, in_loc, substr(in_txt, ptr), in_max_len);
+ ptr := len + 1;
+ else
+ if substr(in_txt, ptr, oset-1) not like common_util.STORAGE_CLAUSE_MATCH escape '\'
+ then
+ big_put_line(in_fh, in_loc, substr(in_txt, ptr, oset-1), in_max_len);
+ end if;
+ end if;
+ ptr := ptr + oset;
+ end loop;
+end rem_qt_storage;
+
+
+------------------------------------------------------------
+--- Script Generating Procedures ---
+------------------------------------------------------------
+
+
+------------------------------------------------------------
+-- Get Object Grants for CURRENT, FUTURE is handled in cr_grnt
+procedure get_object_grants
+ (in_fh in out NOCOPY sf_ptr_type
+ ,in_object_name in varchar2
+ ,in_object_type in varchar2)
+is
+ --
+ -- Oracle Database 12c Release 1 Database SQL Language Reference
+ -- "on_object_clause"
+ -- Users, directory schema objects, editions, data mining models, Java
+ -- source and resource schema objects, and SQL translation profiles
+ -- are identified separately because they reside in separate namespaces.
+ --
+ -- See Also: http://docs.oracle.com/database/121/SQLRF/sql_elements008.htm#SQLRF51129
+ --
+ -- An in_object_type of "USER" is not yet implemented.
+ --
+ sql_txt varchar2(32767);
+begin
+ script_put_line(in_fh, '');
+ script_put_line(in_fh, '-- Grants');
+-- Performance: DBMS_METADATA.get_dependent_dll('OBJECT_GRANT') is VERY SLOW
+-- script_put_line(in_fh, '--DBMS_METADATA:' || g_schema_name ||
+-- '.' || in_object_name );
+-- big_put_line(in_fh, dbms_metadata.get_dependent_ddl(object_type => 'OBJECT_GRANT'
+-- ,base_object_name => in_object_name
+-- ,base_object_schema => g_schema_name) );
+-- Note: EXECPTION BLOCK BELOW
+ for buff in (select grantee
+ ,privilege
+ ,object_type
+ ,max(grantable) GRANTABLE
+ from priv_obj_install_vw
+ where install_type = g_install_type
+ and install_type_selector = 'OBJECT' -- Grantee installed before this Object
+ and object_owner = g_schema_name
+ and object_name = in_object_name
+ and object_type = in_object_type
+ group by grantee
+ ,privilege
+ ,object_type
+ order by grantee
+ ,privilege
+ ,object_type)
+ loop
+ -- Directories are handled by "cr_dir""
+ --when 'DIRECTORY' then 'DIRECTORY '
+ -- The following grants are not implemented in OTYPE_CONF
+ -- https://docs.oracle.com/database/121/SQLRF/statements_9014.htm#SQLRF01603
+ --when '(Data Mining) MODEL' then 'MINING MODEL '
+ --when 'SQL TRANSLATION PROFILE' then 'SQL TRANSLATION PROFILE '
+ sql_txt := 'grant ' || buff.privilege || -- This list taken from SQL definition of DBA_TAB_PRIVS
+ ' on ' || case buff.object_type when 'JAVA CLASS' then 'JAVA SOURCE "' || g_schema_name || '"."'
+ when 'JAVA SOURCE' then 'JAVA SOURCE "' || g_schema_name || '"."'
+ when 'JAVA RESOURCE' then 'JAVA RESOURCE "' || g_schema_name || '"."'
+ when 'EDITION' then 'EDITION "'
+ when 'USER' then 'USER "'
+ else '"' || g_schema_name || '"."'
+ end || in_object_name ||
+ '" to "' || buff.grantee || '"';
+ -- "with hierarchy option" has not yet been implemented
+ if buff.grantable = 'YES'
+ then
+ sql_txt := sql_txt || ' with grant option';
+ end if;
+ script_put_line(in_fh, sql_txt || ';');
+ end loop;
+ script_put_line(in_fh, '');
+--exception
+-- when DBMS_METADATA.object_not_found2
+-- then
+-- script_put_line(in_fh, '');
+end get_object_grants;
+
+------------------------------------------------------------
+-- Get CURRENT synonyms. FUTURE synonyms are handled in cr_syn
+procedure get_synonyms
+ (in_fh in out NOCOPY sf_ptr_type
+ ,in_object_name in varchar2
+ ,in_object_type in varchar2
+ ,in_max_len in number)
+is
+begin
+ script_put_line(in_fh, '');
+ script_put_line(in_fh, '-- Synonyms');
+ for buff in (select synonym_owner, synonym_name
+ from obj_install_synonym_tab
+ where install_type = g_install_type
+ and install_type_selector = 'SYNONYM' -- Target installed before this Synonym
+ and target_owner = g_schema_name
+ and target_name = in_object_name
+ and target_type = in_object_type
+ order by synonym_owner, synonym_name)
+ loop
+ script_put_line(in_fh, '');
+ script_put_line(in_fh, '--DBMS_METADATA:' || buff.synonym_owner ||
+ '.' || buff.synonym_name );
+ -- Includes DB_LINK in Synonym
+ big_put_line(in_fh, buff.synonym_owner || '.' || buff.synonym_name || ' Synonym'
+ ,dbms_metadata.get_ddl(object_type => 'SYNONYM'
+ ,name => buff.synonym_name
+ ,schema => buff.synonym_owner)
+ ,in_max_len);
+ end loop;
+ script_put_line(in_fh, '');
+end get_synonyms;
+
+------------------------------------------------------------
+-- Create XDB Access Control Lists
+procedure cr_acl
+is
+ --
+ -- Note about ACLs
+ --
+ -- These are RAS ACLs:
+ -- -) DBA_XS_ACLS
+ -- -) DBA_XS_ACES
+ -- These are XDB ACLs:
+ -- -) DBA_HOST_ACLS
+ -- -) DBA_HOST_ACES
+ -- The DBA_ACL_NAME_MAP table maps XDB ACLs to RAS ACLs.
+ --
+ -- DBMS_METADATA.GET_DDL will not work with "XS_ACL"
+ -- DBMS_METADATA.FETCH_CLOB is missing host names.
+ -- The DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE calls must be produced
+ -- without using DBMS_METADATA.
+ --DECLARE
+ -- l_DDL_handle NUMBER;
+ -- l_XForm_handle NUMBER;
+ -- l_clob CLOB;
+ --BEGIN
+ -- l_DDL_handle := DBMS_METADATA.OPEN(object_type => 'XS_ACL');
+ -- DBMS_METADATA.SET_COUNT(handle => l_DDL_handle
+ -- ,value => 10);
+ -- DBMS_METADATA.SET_FILTER(handle => l_DDL_handle
+ -- ,name => 'SCHEMA'
+ -- ,value => 'SYS');
+ -- DBMS_METADATA.SET_FILTER(handle => l_DDL_handle
+ -- ,name => 'NAME'
+ -- ,value => 'NETWORK_ACL_3CA7D022F7DCA526E054A0369FA25254');
+ -- l_XForm_handle := DBMS_METADATA.ADD_TRANSFORM (handle => l_DDL_handle
+ -- ,name => 'DDL');
+ -- DBMS_METADATA.SET_TRANSFORM_PARAM(l_XForm_handle, 'SQLTERMINATOR', TRUE);
+ -- l_clob := DBMS_METADATA.FETCH_CLOB(handle => l_DDL_handle
+ -- ,cache_lob => TRUE);
+ -- DBMS_OUTPUT.PUT_LINE('length: ' || length(l_clob));
+ -- DBMS_OUTPUT.PUT_LINE(l_clob);
+ -- DBMS_METADATA.CLOSE(handle => l_DDL_handle);
+ --END;
+ --/
+ --
+ -- Execution of the above DBMS_METADATA produces this DBMS_OUTPUT:
+ --DECLARE
+ -- ace_list XS$ACE_LIST;
+ --BEGIN
+ -- ace_list := XS$ACE_LIST(
+ -- XS$ACE_TYPE(
+ -- privilege_list => XS$NAME_LIST('"CONNECT"'),
+ -- principal_name=>'"TXN_CUST"',
+ -- principal_type=>XS_ACL.PTYPE_DB,
+ -- start_date => to_timestamp_tz('16-SEP-16 09.42.47.423377 PM',
+ -- 'DD-MON-YY HH.MI.SS.FF PM TZH:TZM')),
+ -- XS$ACE_TYPE(
+ -- privilege_list => XS$NAME_LIST('"CONNECT"'),
+ -- principal_name=>'"TXN_CUST"',
+ -- principal_type=>XS_ACL.PTYPE_DB));
+ --
+ -- xs_acl.create_acl(
+ -- name=>'"SYS"."NETWORK_ACL_3CA7D022F7DCA526E054A0369FA25254"',
+ -- ace_list=>ace_list,
+ -- sec_class=>'"SYS"."NETWORK_SC"',
+ -- description=>'ACL for BOS File Ready');
+ --END;
+ --/
+ --
+ --
+ -- Oracle Database Security Guide 12c Release 1 (12.1)
+ -- E48135-15, September 2016
+ -- Chapter 6 Managing Fine-Grained Access in PL/SQL Packages and Types
+ -- Upgraded Applications That Depend on Packages That Use External Network Services
+ -- http://docs.oracle.com/database/121/DBSEG/fine_grained_access.htm#DBSEG99984
+ --
+ -- GRANT_TYPE: 'GRANT'
+ -- PRIVILEGE: 'CONNECT','RESOLVE'
+ -- resolve: Resolves a network host name or IP address through the UTL_INADDR package
+ -- connect: Grants the user permission to connect to a network service at a host through
+ -- the UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, and DBMS_LDAP packages, or the HttpUriType type
+ -- INVERTED_PRINCIPAL: 'NO'
+ --
+ -- Regular Expression: ^(.*[/][/][^/]+)[/].*$
+ -- .*[/][/][^/]+ - Zero or more chacters followed by 2 slashes
+ -- followed by one or more non-slash characters
+ -- (.*[/][/][^/]+) - Capture above match for replacement as "\1"
+ -- ^(.*[/][/][^/]+) - Above match must start and begining of line
+ -- [/].*$ - A slash character followed by zero or more characters
+ -- ending at the end of line
+ -- If there is no match, p.value is returned unchanged.
+ -- It there is a match, only "\1" is returned.
+ -- This essentially removes any path string from a URL.
+ --
+ -- ACE HOST mask conversion to Regular Expressions
+ -- replace(STRING,'.','[.]') - Replaces all dots with a bracketed dot
+ -- replace(STRING,'*','.*') - Replaces all stars with "dot star"
+ --
+ -- Regular Expression: ^.*[:]([0-9]+).*$
+ -- ^.*[:] - Zero or more characters from begining of line
+ -- to the first single colon character
+ -- [0-9]+ - A number with one or more digits
+ -- ([0-9]+) - Capture the number for replacement as "\1"
+ -- .*$ - Zero or more characters ending at the end of line
+ -- If there is no match, p.value is returned unchanged.
+ -- If there is a match, only "\1" is returned.
+ -- This essentially returns the port number from the URL.
+ --
+ OTYPE CONSTANT varchar2(100) := 'XDB_ACL';
+ fh sf_ptr_type; -- object script file handle
+ old_file varchar2(1000) := 'This is not a real file name !@#$%^';
+ old_range varchar2(1000) := 'This is not a host port range !@#$%^';
+ change_flag boolean := TRUE;
+ ----------------------------------------
+begin
+ dbms_output.put_line('OTYPE: ' || OTYPE || ', g_install_type: ' || g_install_type ||
+ ', g_schema_name: ' || g_schema_name || ', xs_acl.ptype_db: ' || xs_acl.ptype_db);
+ for buff in (select replace(xdbacl_host,'*','_') || '.' || ext FILE_NAME
+ ,xdbacl_host ACL_HOST
+ ,lower_port
+ ,upper_port
+ ,xdbacl_host || ' from port ' || lower_port || ' to ' || upper_port
+ HOST_PORT_RANGE
+ ,grantee PRINCIPAL
+ ,privilege
+ ,install_type_selector
+ from priv_obj_xdbacl_view
+ where install_type = g_install_type
+ group by replace(xdbacl_host,'*','_') || '.' || ext
+ ,xdbacl_host
+ ,lower_port
+ ,upper_port
+ ,grantee
+ ,privilege
+ ,install_type_selector
+ order by replace(xdbacl_host,'*','_') || '.' || ext
+ ,xdbacl_host
+ ,lower_port
+ ,upper_port
+ ,grantee
+ ,privilege
+ ,install_type_selector)
+ loop
+ if old_file != buff.file_name
+ then
+ old_file := buff.file_name;
+ change_flag := TRUE;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+ fh := script_open(in_filename => buff.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create XDB ACL/ACE');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Only XDB ACLs with the following are included:');
+ script_put_line(fh, '-- PRINCIPAL_TYPE = ''DATABASE'' (xs_acl.ptype_db)');
+ script_put_line(fh, '-- GRANT_TYPE = ''GRANT''');
+ script_put_line(fh, '-- INVERTED_PRINICIPAL = ''NO''');
+ script_put_line(fh, '-- PRIVILEGE is not null');
+ script_put_line(fh, '-- Start Dates and End Dates are ignored (set to NULL).');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_type_selector || '" XDB ACL');
+ end if;
+ if old_range != buff.host_port_range
+ then
+ old_range := buff.host_port_range;
+ change_flag := TRUE;
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create XDB ACL/ACE for ' || buff.host_port_range || ' ');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ end if;
+ if change_flag
+ then
+ change_flag := FALSE;
+ for buf2 in (select xdbacl_host ACL_HOST
+ ,lower_port
+ ,upper_port
+ ,grantee PRINCIPAL
+ ,privilege
+ from priv_obj_xdbacl_view
+ where install_type = 'pub'
+ and xdbacl_host = buff.acl_host
+ and ( lower_port = buff.lower_port
+ OR (buff.lower_port is null
+ AND lower_port is null ) )
+ and ( upper_port = buff.upper_port
+ OR (buff.upper_port is null
+ AND upper_port is null ) )
+ group by xdbacl_host
+ ,lower_port
+ ,upper_port
+ ,grantee
+ ,privilege
+ order by xdbacl_host
+ ,lower_port
+ ,upper_port
+ ,grantee
+ ,privilege)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE');
+ script_put_line(fh, ' (host => ''' || buf2.acl_host || '''');
+ if upper(buf2.privilege) != 'RESOLVE'
+ then
+ -- Oracle 12c Release 1 Database PL/SQL Packages and Types Reference
+ -- 101 DBMS_NETWORK_ACL_ADMIN
+ -- An ACE with a "resolve" privilege can be appended only to a host''s ACL without a port range.
+ script_put_line(fh, ' ,lower_port => ' || nvl(to_char(buf2.lower_port),'NULL'));
+ script_put_line(fh, ' ,upper_port => ' || nvl(to_char(buf2.upper_port),'NULL'));
+ end if;
+ script_put_line(fh, ' ,ace => xs$ace_type');
+ script_put_line(fh, ' (privilege_list => xs$name_list(''' || buf2.privilege || ''')');
+ script_put_line(fh, ' ,granted => TRUE');
+ script_put_line(fh, ' ,inverted => FALSE');
+ script_put_line(fh, ' ,principal_name => ''' || buf2.principal || '''');
+ script_put_line(fh, ' ,principal_type => xs_acl.ptype_db');
+ script_put_line(fh, ' ,start_date => NULL');
+ script_put_line(fh, ' ,end_date => NULL));');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ end if;
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE');
+ script_put_line(fh, ' (host => ''' || buff.acl_host || '''');
+ if upper(buff.privilege) != 'RESOLVE'
+ then
+ -- Oracle 12c Release 1 Database PL/SQL Packages and Types Reference
+ -- 101 DBMS_NETWORK_ACL_ADMIN
+ -- An ACE with a "resolve" privilege can be appended only to a host''s ACL without a port range.
+ script_put_line(fh, ' ,lower_port => ' || nvl(to_char(buff.lower_port),'NULL'));
+ script_put_line(fh, ' ,upper_port => ' || nvl(to_char(buff.upper_port),'NULL'));
+ end if;
+ script_put_line(fh, ' ,ace => xs$ace_type');
+ script_put_line(fh, ' (privilege_list => xs$name_list(''' || buff.privilege || ''')');
+ script_put_line(fh, ' ,granted => TRUE');
+ script_put_line(fh, ' ,inverted => FALSE');
+ script_put_line(fh, ' ,principal_name => ''' || buff.principal || '''');
+ script_put_line(fh, ' ,principal_type => xs_acl.ptype_db');
+ script_put_line(fh, ' ,start_date => NULL');
+ script_put_line(fh, ' ,end_date => NULL));');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_acl;
+
+------------------------------------------------------------
+-- Create Advanced Queues
+procedure cr_aq
+is
+ --
+ -- The following comments are applicable for AQ Notifications (Subscribers)
+ --
+ --TYPE aq$_agent AS OBJECT
+ --( name varchar2(30), -- M_IDEN, name of a message producer or consumer
+ -- address varchar2(1024), -- address where message must be sent
+ -- protocol number) -- protocol for communication, must be 0
+ --
+ --TYPE aq$_reg_info AS OBJECT (
+ -- name VARCHAR2(128), -- name of the subscription
+ -- namespace NUMBER, -- namespace of the subscription
+ -- callback VARCHAR2(4000), -- callback function
+ -- context RAW(2000), -- context for the callback func.
+ -- *** anyctx *** SYS.ANYDATA, -- anydata ctx for callback func
+ -- ctxtype NUMBER, -- raw/anydata context
+ -- qosflags NUMBER, -- QOS flags
+ -- payloadcbk VARCHAR2(4000), -- payload callback
+ -- timeout NUMBER, -- registration expiration
+ -- ntfn_grouping_class NUMBER, -- ntfn grouping class
+ -- ntfn_grouping_value NUMBER, -- ntfn grouping value
+ -- ntfn_grouping_type NUMBER, -- ntfn grouping type
+ -- ntfn_grouping_start_time TIMESTAMP WITH TIME ZONE, -- grp start time
+ -- ntfn_grouping_repeat_count NUMBER) -- ntfn grp repeat count
+ --
+ -- Not Implementing "anyctx"
+ -- "anyctx" is for Streams Only:
+ --https://docs.oracle.com/database/121/REFRN/GUID-0976B325-BCA0-4205-9E3A-0E9D88BA1FDD.htm#REFRN23657
+ -- Streams is Deprecated:
+ --https://docs.oracle.com/database/121/UPGRD/deprecated.htm#UPGRD60159
+ -- ' ,anyctx => ''' || case sys.ANYDATA.gettypename(any_context)
+ -- when null
+ -- then 'NULL'
+ -- when 'NUMBER'
+ -- then 'ConvertNumber(num => to_number(''' ||
+ -- to_char(sys.ANYDATA.AccessNumber(any_context)) || '''))'
+ -- when 'DATE'
+ -- then 'ConvertDate(dat => to_date(''' ||
+ -- to_char(sys.ANYDATA.AccessDate(any_context)
+ -- ,'DD-MON-YYYY HH24:MI:SS') ||
+ -- ''',''DD-MON-YYYY HH24:MI:SS''))'
+ -- when 'CHAR'
+ -- then 'ConvertChar(c => CAST(''' ||
+ -- sys.ANYDATA.AccessChar(any_context) || ''' as CHAR))'
+ -- when 'VARCHAR'
+ -- then 'ConvertVarchar(c => CAST(''' ||
+ -- sys.ANYDATA.AccessVarchar(any_context) || ''' as VARCHAR))'
+ -- when 'VARCHAR2'
+ -- then 'ConvertVarchar2(c => CAST(''' ||
+ -- sys.ANYDATA.AccessVarchar2(any_context) || ''' as VARCHAR2))'
+ -- when 'RAW'
+ -- then 'ConvertRaw(r => hextoraw(''' ||
+ -- rawtohex(sys.ANYDATA.AccessRaw(any_context)) || '''))'
+ -- when 'BLOB'
+ -- then 'ConvertBlob(b => to_blob(hextoraw(''' ||
+ -- dbms_lob.substr(sys.ANYDATA.AccessBlob(any_context)
+ -- ,32767,1) || ''')))'
+ -- when 'CLOB'
+ -- then 'ConvertClob(c => to_clob(''' ||
+ -- dbms_lob.substr(sys.ANYDATA.AccessClob(any_context)
+ -- ,32767,1) || '''))'
+ -- when 'TIMESTAMP'
+ -- then 'ConvertTimestamp(ts => to_timestamp(''' ||
+ -- to_char(sys.ANYDATA.AccessTimestamp(any_context)
+ -- ,'DD-MON-YYYY HH24:MI:SS.FF9') ||
+ -- ''',''DD-MON-YYYY HH24:MI:SS.FF9''))'
+ -- when 'TIMESTAMP WITH TIME ZONE'
+ -- then 'ConvertTimestampTZ(ts => to_timestamp_tz(''' ||
+ -- to_char(sys.ANYDATA.AccessTimestampTZ(any_context)
+ -- ,'DD-MON-YYYY HH24:MI:SS.FF9 TH:TM') ||
+ -- ''',''DD-MON-YYYY HH24:MI:SS.FF9 TH:TM''))'
+ -- when 'TIMESTAMP WITH LOCAL TIME ZONE'
+ -- then 'ConvertTimestampLTZ(ts => CAST(to_timestamp_tz(''' ||
+ -- to_timestamp_tz(sys.ANYDATA.AccessTimestampLTZ(any_context)
+ -- ,'DD-MON-YYYY HH24:MI:SS.FF9 TH:TM') ||
+ -- ''',''DD-MON-YYYY HH24:MI:SS.FF9 TH:TM'')' ||
+ -- ' as timestamp with local time zone))'
+ -- when 'INTERVAL YEAR TO MONTH'
+ -- then 'ConvertIntervalYM(inv => INTERVAL ''' ||
+ -- to_char(sys.ANYDATA.AccessIntervalYM(any_context)) ||
+ -- ' YEAR TO MONTH)'
+ -- when 'INTERVAL DAY TO SECOND'
+ -- then 'ConvertIntervalDS(inv => INTERVAL ''' ||
+ -- to_char(sys.ANYDATA.AccessIntervalDS(any_context)
+ -- ,'DD HH24:MI:SS.FF') ||
+ -- ' DAY TO SECOND)'
+ -- when 'BINARY_FLOAT'
+ -- then 'ConvertBFloat(fl => CAST(to_number(''' ||
+ -- sys.ANYDATA.AccessBFloat(any_context) || ''') as BINARY_FLOAT))'
+ -- when 'BINARY_DOUBLE'
+ -- then 'ConvertBFloat(dbl => CAST(to_number(''' ||
+ -- sys.ANYDATA.AccessBDouble(any_context) || ''') as BINARY_DOUBLE))'
+ -- when 'ROWID'
+ -- then 'ConvertURowid(rid => CHARTOROWID(''' ||
+ -- ROWIDTOCHAR(sys.ANYDATA.AccessURowid(any_context)) || '''))'
+ -- -- BFILE Conversion not Implemented
+ -- --when 'BFILE'
+ -- --then 'ConvertBfile(b => BFILENAME ''' ||
+ -- -- sys.ANYDATA.AccessBfile(any_context) || ''')'
+ -- -- Not Implemented, Characters should be stored in HEX
+ -- --when 'NCHAR'
+ -- --then 'ConvertNchar(nc => to_nchar(''' ||
+ -- -- sys.ANYDATA.AccessNchar(any_context) || '''))'
+ -- -- Not Implemented, Characters should be stored in HEX
+ -- --when 'NVARCHAR2'
+ -- --then 'ConvertNVarchar2(nc => to_nchar(''' ||
+ -- -- sys.ANYDATA.AccessNVarchar2(any_context) || '''))'
+ -- -- Not Implemented, Characters should be stored in HEX
+ -- --when 'NCLOB'
+ -- --then 'ConvertNClob(nc => to_nclob(''' ||
+ -- -- sys.ANYDATA.AccessNClob(any_context) || '''))'
+ -- -- Also Not Implemented:
+ -- --ConvertObject(obj => "")
+ -- --ConvertObject(obj => "")
+ -- --ConvertRef(rf => REF "")
+ -- --ConvertCollection(col => "")
+ -- else 'ERROR: Unknown Datatype "' || context_type || '"'
+ -- end || LF ||
+ --
+ OTYPE CONSTANT varchar2(100) := 'QUEUE';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (select obj.object_name QUEUE_NAME
+ ,obj.object_name || '.' || obj.ext FILE_NAME
+ ,obj.install_timing
+ from obj_install_object_tab obj
+ join dba_queues aq
+ on aq.owner = obj.object_owner
+ and aq.name = obj.object_name
+ and ( aq.queue_type is null
+ or aq.queue_type != 'EXCEPTION_QUEUE')
+ where obj.install_type = g_install_type
+ and obj.object_owner = g_schema_name
+ and obj.object_type = OTYPE
+ order by obj.object_name
+ ,obj.ext
+ ,obj.install_timing)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.queue_name || ' Queue');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buf1.install_timing || '" Queue');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.queue_name );
+ big_put_line(fh, g_schema_name || '.' || buf1.queue_name || ' Queue'
+ ,dbms_metadata.get_ddl(object_type => 'AQ_QUEUE'
+ ,name => buf1.queue_name
+ ,schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Grants');
+ -- Grant syntax does not support Advanced Queues
+ --get_object_grants(fh, buf1.queue_name, 'QUEUE');
+ script_put_line(fh, '');
+ for buf2 in (select grantee GRANTEE
+ ,privilege
+ ,max(grantable) GRANTABLE
+ from priv_obj_queue_view
+ where install_type = g_install_type
+ and install_type_selector = 'QUEUE' -- Grantee is installed before Queue
+ and queue_owner = g_schema_name
+ and queue_name = buf1.queue_name
+ group by grantee
+ ,privilege
+ order by grantee
+ ,privilege)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.grant_queue_privilege');
+ script_put_line(fh, ' (privilege => ''' || buf2.privilege || '''' );
+ script_put_line(fh, ' ,queue_name => ''"' || g_schema_name || '"."' ||
+ buf1.queue_name || '"''' );
+ script_put_line(fh, ' ,grantee => ''' || buf2.grantee || '''' );
+ if buf2.grantable = 'YES'
+ then
+ script_put_line(fh, ' ,grant_option => TRUE);');
+ else
+ script_put_line(fh, ' ,grant_option => FALSE);');
+ end if;
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ end loop;
+ get_synonyms(fh, buf1.queue_name, 'QUEUE', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Subscribe');
+ script_put_line(fh, '');
+ for buf3 in (
+ select queue_owner -- Owner of the queue
+ ,queue_name -- Name of the queue
+ ,consumer_name -- Name of the subscriber
+ ,address -- Address of the subscriber
+ ,protocol -- Protocol of the subscriber
+ ,rule -- Rule condition for the subscriber
+ ,transformation -- Transformation for the subscriber
+ ,queue_to_queue -- Is subscriber is a queue-to-queue subscriber?
+ ,delivery_mode -- Message delivery mode: PERSISTENT, BUFFERED, or PERSISTENT_OR_BUFFERED
+ ,install_type_selector
+ from priv_queue_subscribe_view
+ where install_type = g_install_type
+ and install_type_selector = 'QUEUE'
+ and queue_owner = g_schema_name
+ and queue_name = buf1.queue_name
+ order by queue_owner
+ ,queue_name
+ ,consumer_name)
+ loop
+ script_put_line(fh, '-- This is a "' || buf3.install_type_selector || '" Queue Subscription');
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.add_subscriber');
+ script_put_line(fh, ' (queue_name => ''' || buf3.queue_owner ||
+ '.' || buf3.queue_name || '''');
+ script_put_line(fh, ' ,subscriber => sys.aq$_agent');
+ script_put_line(fh, ' (name => ''' || buf3.consumer_name || '''');
+ script_put_line(fh, ' ,address => ''' || buf3.address || '''');
+ script_put_line(fh, ' ,protocol => ' || buf3.protocol || ')');
+ script_put_line(fh, ' ,rule => ''' || buf3.rule || '''');
+ script_put_line(fh, ' ,transformation => ''' || buf3.transformation || '''');
+ script_put_line(fh, ' ,queue_to_queue => ' || buf3.queue_to_queue );
+ script_put_line(fh, ' ,delivery_mode => DBMS_AQADM.' || buf3.delivery_mode || ');');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Register');
+ script_put_line(fh, '');
+ -- https://docs.oracle.com/database/121/REFRN/GUID-0976B325-BCA0-4205-9E3A-0E9D88BA1FDD.htm#REFRN23657
+ for buf4 in (
+ select subscription_name -- Name of the subscription registration of the form schema.queue:consumer_name
+ ,namespace -- Namespace of the subscription registration: ANONYMOUS, AQ, or DBCHANGE
+ ,location_name -- Location endpoint of the registration
+ ,user_context -- Context the user provided during registration of PL/SQL registrations
+ ,qosflags -- Quality of service of the registration: RELIABLE, PAYLOAD, or PURGE_ON_NTFN
+ ,timeout -- Registration timeout
+ ,ntfn_grouping_class -- Notification grouping class
+ ,ntfn_grouping_value -- Notification grouping value
+ ,ntfn_grouping_type -- Notification grouping type: SUMMARY or LAST
+ ,ntfn_grouping_start_time -- Notification grouping start time
+ ,ntfn_grouping_repeat_count -- Notification grouping repeat count, or FOREVER
+ ,context_size -- Size of the context
+ from priv_queue_register_view -- grant SELECT on "SYS"."DBA_SUBSCR_REGISTRATIONS" to "ODBCAPTURE";
+ where queue_install_type = g_install_type
+ and regexp_like (subscription_name, '^["]{0,1}' || -- Zero or One Double Quotes at the begining
+ g_schema_name ||
+ '["]{0,1}[.]["]{0,1}' || -- Zero or One Double Quotes, a Period, and Zero or One Double Quotes
+ buf1.queue_name )
+ order by subscription_name
+ ,namespace)
+ loop
+ -- Advanced Queue Registrations are "QUEUE" only.
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aq.register');
+ script_put_line(fh, ' (reg_list => sys.aq$_reg_info_list');
+ script_put_line(fh, ' (sys.aq$_reg_info');
+ script_put_line(fh, ' (name => ''' || buf4.subscription_name || '''');
+ script_put_line(fh, ' ,namespace => DBMS_AQ.NAMESPACE_' || to_char(buf4.namespace));
+ script_put_line(fh, ' ,callback => ''' || buf4.location_name || '''');
+ script_put_line(fh, ' ,context => hextoraw(''' || rawtohex(buf4.user_context) || ''')');
+ if buf4.qosflags is not null
+ AND buf4.timeout is not null
+ then
+ script_put_line(fh, ' ,qosflags => ' || to_char(buf4.qosflags));
+ script_put_line(fh, ' ,timeout => ' || to_char(buf4.timeout));
+ if buf4.ntfn_grouping_class is not null
+ AND buf4.ntfn_grouping_value is not null
+ AND buf4.ntfn_grouping_type is not null
+ AND buf4.ntfn_grouping_start_time is not null
+ AND buf4.ntfn_grouping_repeat_count is not null
+ then
+ script_put_line(fh, ' ,ntfn_grouping_class => ' || to_char(buf4.ntfn_grouping_class));
+ script_put_line(fh, ' ,ntfn_grouping_value => ' || to_char(buf4.ntfn_grouping_value));
+ script_put_line(fh, ' ,ntfn_grouping_type => ' || to_char(buf4.ntfn_grouping_type));
+ script_put_line(fh, ' ,ntfn_grouping_start_time => ' || 'to_timstamp_tz(' ||
+ to_char(buf4.ntfn_grouping_start_time
+ ,'DD-MON-YYYY HH24:MI:SS.FF9 TH:TM') ||
+ ',''DD-MON-YYYY HH24:MI:SS.FF9 TH:TM'')' || ' )');
+ script_put_line(fh, ' ,ntfn_grouping_repeat_count => ' || to_char(buf4.ntfn_grouping_repeat_count));
+ end if;
+ end if;
+ script_put_line(fh, ' ) )');
+ script_put_line(fh, ' ,reg_count => ' || nvl(to_char(buf4.context_size),'NULL') || ' );');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Schedule');
+ script_put_line(fh, '');
+ -- https://docs.oracle.com/database/121/REFRN/GUID-65C3B9EB-BFD5-4BAB-A810-D0B705E92DCA.htm
+ for buf5 in (
+ select schema -- Source queue owner
+ ,qname -- Source queue name
+ ,destination -- Destination name, currently limited to be a DBLINK name
+ ,start_date -- Date at which to start propagation
+ ,propagation_window -- Duration for the propagation window (in seconds)
+ ,next_time -- Function to compute the start of the next propagation window
+ ,latency -- Maximum wait time to propagate a message during the propagation window
+ from dba_queue_schedules
+ where schema = g_schema_name
+ and qname = buf1.queue_name
+ order by schema
+ ,qname)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.schedule_propagation');
+ script_put_line(fh, ' (queue_name => ''"' || buf5.schema || '"."' ||
+ buf5.qname || '"''' );
+ script_put_line(fh, ' ,destination => ''' || buf5.destination || '''' );
+ script_put_line(fh, ' ,start_time => to_date(''' || to_char(buf5.start_date
+ ,'DD-MON-YYYY HH24:MI:SS') ||
+ ''', ''DD-MON-YYYY HH24:MI:SS'')');
+ script_put_line(fh, ' ,duration => ' || buf5.propagation_window );
+ script_put_line(fh, ' ,next_time => ''' || buf5.next_time || '''' );
+ script_put_line(fh, ' ,latency => ' || buf5.latency);
+ script_put_line(fh, ' ,destination_queue => NULL);');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_aq;
+
+------------------------------------------------------------
+-- Create Advanced Queue Tables
+procedure cr_aqt
+is
+ OTYPE CONSTANT varchar2(100) := 'QUEUE_TABLE';
+ fh sf_ptr_type; -- object script file handle
+ gsm_save varchar2(128);
+begin
+ for buff in (select aqt.queue_table
+ ,aqt.queue_table || '.' || otyp.ext FILE_NAME
+ ,obj.object_name
+ ,obj.object_type
+ ,obj.install_timing
+ from dba_queue_tables aqt
+ join otype_conf otyp
+ on otyp.install_otype = OTYPE
+ join obj_install_object_tab obj
+ on obj.install_type = g_install_type
+ and obj.object_owner = aqt.owner
+ and obj.object_name = aqt.queue_table
+ and obj.object_type in ('TABLE','VIEW')
+ where aqt.owner = g_schema_name
+ order by aqt.queue_table)
+ loop
+ fh := script_open(in_filename => buff.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buff.queue_table ||' Queue Table');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buff.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_timing || '" Queue Table');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.queue_table);
+ -- DBMS_METADATA throws an error when LOB_STORAGE is set to DEFAULT or BASICFILE for AQ_QUEUE_TABLE
+ rem_qt_storage(fh, g_schema_name || '.' || buff.queue_table || ' Table'
+ ,dbms_metadata.get_ddl(object_type => 'AQ_QUEUE_TABLE'
+ ,name => buff.queue_table
+ ,schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- The queue table owner must be granted EXECUTE privileges on the');
+ script_put_line(fh, '-- DBMS_AQADM package. Otherwise, the Oracle Database snapshot');
+ script_put_line(fh, '-- processes do not propagate, but generates trace files with the');
+ script_put_line(fh, '-- error identifier SYS.DBMS_AQADM not defined');
+ script_put_line(fh, '--');
+ get_object_grants(fh, buff.queue_table, buff.object_type);
+ get_synonyms(fh, buff.queue_table, buff.object_type, common_util.MAX_SQL_LEN);
+ for buf2 in (
+ select obj.object_name,
+ obj.object_type
+ from dba_objects_tab obj
+ where obj.object_owner = g_schema_name
+ and obj.object_type in ('TABLE','VIEW')
+ -- MUST be more discriminating than "obj.object_name like 'AQ$%' || buf1.queue_table || '%'"
+ and regexp_like(obj.object_name, common_util.QUEUE_NAME_PREFIX_REGEXP || buff.queue_table || common_util.QUEUE_NAME_SUFFIX_REGEXP)
+ order by obj.object_name,
+ obj.object_type)
+ loop
+ script_put_line(fh, '');
+ script_put_line(fh, ' -- ' || buf2.object_name || ' ' || buf2.object_type);
+ script_put_line(fh, '');
+ get_object_grants(fh, buf2.object_name, buf2.object_type);
+ get_synonyms(fh, buf2.object_name, buf2.object_type, common_util.MAX_SQL_LEN);
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_aqt;
+
+------------------------------------------------------------
+-- Common Create Procedure. Only used for:
+-- -) FUNCTION
+-- -) PACKAGE_BODY
+-- -) PACKAGE_SPEC
+-- -) PROCEDURE
+-- -) SCHEDULER_JOB
+-- -) SCHEDULER_PROGRAM
+-- -) SCHEDULER_SCHEDULE
+-- -) SEQUENCE
+-- -) TYPE_BODY
+-- -) TYPE_SPEC
+procedure cr_common
+ (in_OTYPE in varchar2
+ ,in_type_name in varchar2)
+is
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buff in (select obj.object_name OBJECT_NAME
+ ,obj.object_name || '.' || obj.ext FILE_NAME
+ ,obj.install_timing
+ ,obj.object_type
+ from obj_install_object_tab obj
+ where obj.install_type = g_install_type
+ and obj.object_owner = g_schema_name
+ and obj.install_otype = in_OTYPE
+ and ( obj.install_otype != 'SCHEDULER_JOB'
+ -- MV Scheduler Jobs: Skip here and recreate with Materialized Views
+ or ( obj.object_name not like 'MV\_RF$J\_%' escape '\'
+ AND obj.object_name not like 'DBMS\_JOB$\_%' escape '\' ) )
+ and ( obj.install_otype != 'SEQUENCE'
+ or ( -- Queue Sequences: Skip here and recreate with Advanced Queues
+ not exists (select 'x' from dba_queue_tables qt
+ where qt.owner = g_schema_name
+ and regexp_like(obj.object_name,common_util.QUEUE_NAME_PREFIX_REGEXP ||
+ qt.queue_table ||
+ common_util.QUEUE_NAME_SUFFIX_REGEXP ) )
+ -- Identity Sequences: Auto-created with Tables
+ and obj.object_name not in (select dti.sequence_name from dba_tab_identity_cols dti
+ where dti.owner = obj.object_owner) ) )
+ and ( obj.install_otype not in ('TYPE_BODY', 'TYPE_SPEC')
+ or ( -- Pipelined Type Objects: Skip here and recreate with pipelined package/function
+ obj.object_name not like common_util.PIPELINE_TYPE_MATCH escape '\'
+ -- Unknown type specifications, table of numbers, no dependencies
+ and obj.object_name not like common_util.SYS_TYPE_SPEC_BODY_MATCH escape '\') )
+ order by object_name)
+ loop
+ fh := script_open(in_filename => buff.file_name
+ ,in_otype => in_OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buff.OBJECT_NAME ||' ' || in_type_name);
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buff.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Note: This is a "' || buff.install_timing || '" ' || buff.object_type);
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.OBJECT_NAME);
+ big_put_line(fh, g_schema_name || '.' || buff.OBJECT_NAME || ' ' || in_type_name
+ ,COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => case in_OTYPE
+ -- https://logbuffer.wordpress.com/2014/03/13/oracle-getting-the-ddl-for-scheduler-jobs
+ when 'SCHEDULER_JOB' then 'PROCOBJ'
+ when 'SCHEDULER_PROGRAM' then 'PROCOBJ'
+ when 'SCHEDULER_SCHEDULE' then 'PROCOBJ'
+ else in_OTYPE
+ end
+ ,name => buff.OBJECT_NAME
+ ,schema => g_schema_name) )
+ ,common_util.MAX_SQL_LEN);
+ if buff.object_type not in ('PACKAGE BODY', 'TYPE BODY')
+ then
+ script_put_line(fh, '');
+ get_object_grants(fh, buff.OBJECT_NAME, buff.object_type);
+ get_synonyms(fh, buff.OBJECT_NAME, buff.object_type, common_util.MAX_SQL_LEN);
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_common;
+
+------------------------------------------------------------
+-- Create Consolidated Data Load
+procedure cr_cdl
+is
+ OTYPE CONSTANT varchar2(100) := 'DATA_LOAD';
+ F_DATE CONSTANT varchar2(100) := 'DD-MON-YYYY HH24:MI:SS';
+ F_TSTTZ CONSTANT varchar2(100) := 'DD-MON-YYYY HH24:MI:SS.FF TZH:TZM';
+ F_TST CONSTANT varchar2(100) := 'DD-MON-YYYY HH24:MI:SS.FF';
+ F_IDTOS CONSTANT varchar2(100) := 'DD HH24:MI:SS.FF';
+ fh sf_ptr_type; -- object script file handle
+ lc varchar2(100); -- Lead characters for column list
+ sql_txt varchar2(32767);
+ desc_tab dbms_sql.desc_tab3;
+ dyn_curs integer;
+ dyn_stat integer;
+ num_cols number := 0;
+ col_err number;
+ col_len integer;
+ junk integer;
+ --
+ -- From SYS.DBMS_SQL Package Specification, Named Datatype CONSTANTS
+ --
+ -- User_Defined_Type is Data Type ID 109. Requires col_type_name
+ -- and col_type_name_len from DBMS_SQL.DESC_REC3 Record Type
+ --
+ -- Ref_Type is Data Type ID 111. Requires a declared "object type".
+ --
+ vc2_buff varchar2(32767); -- Data Type ID 1
+ char_buff char(32767); -- Data Type ID 96
+ --
+ num_buff number; -- Data Type ID 2
+ --bfloat_buff binary_double; -- Data Type ID 101
+ --float_buff binary_float; -- Data Type ID 100
+ --
+ date_buff date; -- Data Type ID 12
+ tstmp_buff timestamp(9); -- Data Type ID 180
+ tstmptz_buff timestamp(9) with time zone; -- Data Type ID 181
+ tstmpltz_buff timestamp(9) with local time zone; -- Data Type ID 231
+ intvlds_buff interval day(9) to second(9); -- Data Type ID 183
+ --intvlym_buff interval year to month; -- Data Type ID 182
+ --
+ clob_buff clob; -- Data Type ID 112
+ xml_buff xmltype; -- Data Type ID 109, XMLTYPE
+ blob_buff blob; -- Data Type ID 113
+ --bfile_buff bfile; -- Data Type ID 114
+ --long_buff long; -- Data Type ID 8
+ --lraw_buff long raw; -- Data Type ID 24
+ --
+ --mlslbl_buff mlslabel; -- Data Type ID 106
+ raw_buff raw(32767); -- Data Type ID 23
+ --rowid_buff rowid; -- Data Type ID 11
+ --urowid_buff urowid; -- Data Type ID 208
+ --
+ procedure show_col_err
+ (in_table_name in varchar2
+ ,in_col_type in varchar2
+ ,in_i in number)
+ is
+ begin
+ -- 1405 is zero length value retrieved?
+ if nvl(col_err,0) not in (0, 1405)
+ then
+ dbms_output.put_line('COL_ERR is not 0 or 5 in' ||
+ ' INSTALL_TYPE ' || g_install_type ||
+ ', table ' || g_schema_name ||
+ '.' || in_table_name ||
+ ', ' || in_col_type ||
+ ' column ' || desc_tab(in_i).col_name ||
+ ', length ' || col_len ||
+ ': ' || col_err );
+ end if;
+ end show_col_err;
+ --
+ procedure utf_put_clob
+ is
+ ptr integer := 1;
+ loc integer;
+ begin
+ loop
+ -- Find a linefeed in the CLOB_BUFF
+ loc := instr(clob_buff, LF, ptr);
+ exit when loc = 0;
+ if substr(clob_buff, loc-1, 1) = CRTN
+ then
+ script_put(fh, substr(clob_buff, ptr, loc-ptr));
+ else
+ script_put(fh, substr(clob_buff, ptr, loc-ptr+1));
+ end if;
+ ptr := loc+1;
+ end loop;
+ -- There should always be a Double Quote at the end of the clob_buff.
+ script_put(fh, substr(clob_buff, ptr));
+ end utf_put_clob;
+ --
+ function b64_encode
+ (in_blob in BLOB)
+ return CLOB
+ is
+ SPLIT_LEN constant pls_integer := 21843; -- Must be divisible by 3
+ l_clob clob;
+ len_blob pls_integer;
+ ptr pls_integer;
+ begin
+ if in_blob is null then return null; end if;
+ len_blob := length(in_blob);
+ if len_blob = 0 then return empty_clob(); end if;
+ dbms_lob.createtemporary(l_clob, true);
+ dbms_lob.append(l_clob, common_util.B64_ENCODE_HEADER || chr(10));
+ ptr := 1;
+ while ptr <= len_blob
+ loop
+ dbms_lob.append(l_clob
+ ,to_char(UTL_ENCODE.BASE64_ENCODE(dbms_lob.substr(in_blob
+ ,SPLIT_LEN
+ ,ptr
+ ) )
+ ,nls_charset_id('US7ASCII')
+ ) );
+ ptr := ptr + SPLIT_LEN;
+ end loop;
+ return l_clob || CHR(10);
+ end b64_encode;
+ --
+begin
+ for tabs in
+ (select table_name TABLE_NAME
+ ,table_name || '.' || ext FILE_NAME
+ ,table_name || '.' || ext2 CTL_FILE
+ ,table_name || '.' || ext3 DAT_FILE
+ ,table_name || '.log' LOG_FILE
+ ,before_select_sql
+ ,where_clause
+ ,order_by_columns
+ ,after_order_by_sql
+ ,install_timing
+ from obj_install_data_load_tab sdvw
+ where install_type = g_install_type
+ and table_owner = g_schema_name
+ and install_otype = OTYPE
+ order by table_name)
+ loop
+ --
+ -- DBMS_SQL Open, Parse, Describe
+ if tabs.before_select_sql is not null
+ then
+ sql_txt := tabs.before_select_sql || LF;
+ else
+ sql_txt := '';
+ end if;
+ --
+ sql_txt := sql_txt || 'select * from "' || g_schema_name || '"' ||
+ '."' || tabs.table_name || '"' ;
+ --
+ if tabs.where_clause is not null
+ then
+ sql_txt := sql_txt || LF || 'where ' || tabs.where_clause;
+ end if;
+ -- ORDER_BY_COLUMNS is a required field
+ sql_txt := sql_txt || LF || 'order by ' || tabs.order_by_columns;
+ --
+ if tabs.after_order_by_sql is not null
+ then
+ sql_txt := sql_txt || LF || tabs.after_order_by_sql;
+ end if;
+ --
+ --dbms_output.put_line('--');
+ --dbms_output.put_line(sql_txt || ';');
+ dyn_curs := dbms_sql.open_cursor;
+ dbms_sql.parse(c => dyn_curs
+ ,statement => sql_txt
+ ,language_flag => dbms_sql.native );
+ dbms_sql.describe_columns3(c => dyn_curs
+ ,col_cnt => num_cols
+ ,desc_t => desc_tab );
+ --
+ -- Control File Setup
+ fh := script_open(in_filename => tabs.ctl_file
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_LDR_LEN);
+ script_put_line(fh, 'OPTIONS (SKIP=1)');
+ script_put_line(fh, 'LOAD DATA');
+ script_put_line(fh, 'APPEND INTO TABLE "' || g_schema_name || '"."' || tabs.table_name || '"');
+ script_put_line(fh, 'FIELDS CSV WITH EMBEDDED');
+ script_put_line(fh, 'TRAILING NULLCOLS');
+ --
+ -- Add Column Specifications and Bind Variable to Dynamic Cursor
+ lc := ' ('; -- Lead characters on the first line
+ for i in 1 .. num_cols
+ loop
+ case
+ when desc_tab(i).col_type = DBMS_SQL.VARCHAR2_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(' || desc_tab(i).col_max_len || ')');
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => vc2_buff
+ ,column_size => desc_tab(i).col_max_len);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.CHAR_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(' || desc_tab(i).col_max_len || ')');
+ dbms_sql.define_column_char(c => dyn_curs
+ ,position => i
+ ,column => char_buff
+ ,column_size => desc_tab(i).col_max_len);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.NUMBER_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' FLOAT EXTERNAL' );
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => num_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.DATE_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' DATE ''' || F_DATE || '''');
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => date_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' TIMESTAMP ''' || F_TST || '''');
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => tstmp_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_WITH_TZ_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' TIMESTAMP WITH TIME ZONE ''' || F_TSTTZ || '''');
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => tstmptz_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_WITH_LOCAL_TZ_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+' TIMESTAMP WITH LOCAL TIME ZONE ''' || F_TST || '''');
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => tstmpltz_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.INTERVAL_DAY_TO_SECOND_TYPE
+ then
+ script_put_line (fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' INTERVAL DAY TO SECOND' ); -- Don't use F_IDTOS
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => intvlds_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.BLOB_TYPE
+ then
+ script_put_line(fh, ' -- BLOB data must be decoded from Base64 after loading');
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(1572864)' ); -- 1048576 * 1.5
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => blob_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.CLOB_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(1048576)' );
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column => clob_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.USER_DEFINED_TYPE
+ and desc_tab(i).col_type_name = 'XMLTYPE'
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(1048576)' );
+ dbms_sql.define_column(c => dyn_curs
+ ,position => i
+ ,column =>xml_buff);
+ --
+ when desc_tab(i).col_type = DBMS_SQL.RAW_TYPE
+ then
+ script_put_line(fh, lc || common_util.old_rpad(desc_tab(i).col_name,30) ||
+ ' CHAR(32767)' );
+ dbms_sql.define_column_raw(c => dyn_curs
+ ,position => i
+ ,column => raw_buff
+ ,column_size => desc_tab(i).col_max_len);
+ --
+ else
+ raise_application_error(-20000, 'Unknown DBMS_SQL DESC_TAB3 col_type ' || desc_tab(i).col_type ||
+ ', col_type_name ' || desc_tab(i).col_type_name ||
+ ' for column ' || desc_tab(i).col_name ||
+ ' in table ' || g_schema_name || '.' || tabs.table_name);
+ --
+ end case;
+ lc := ' ,'; -- Lead characters after the first line
+ end loop;
+ --
+ script_put_line(fh, ' )');
+ script_close(fh);
+ --
+ -- Setup the Data File
+ fh := script_open(in_filename => tabs.dat_file
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_LDR_LEN);
+ --
+ -- Write the column header
+ lc := ''; -- No lead characters on the first column
+ for i in 1 .. num_cols
+ loop
+ -- Simply a comma delimited list of column names
+ script_put(fh, lc || '"' || desc_tab(i).col_name || '"');
+ lc := ','; -- Add comma after the first column
+ end loop;
+ script_new_line(fh);
+ --
+ -- Fetch the Records
+ -- The return from execute is undefined for queries
+ junk := dbms_sql.execute(dyn_curs);
+ while dbms_sql.fetch_rows(dyn_curs) > 0
+ loop
+ --
+ -- Add the data
+ lc := ''; -- No lead characters on the first column
+ for i in 1 .. num_cols
+ loop
+ case
+ when desc_tab(i).col_type = DBMS_SQL.VARCHAR2_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => vc2_buff
+ ,column_error => col_err
+ ,actual_length => col_len);
+ -- VARCHAR2, CHAR, and CLOB use the same format
+ show_col_err(tabs.table_name, 'VARCHAR2', i);
+ script_put(fh, lc);
+ if vc2_buff is not null
+ then
+ clob_buff := '"' || replace(vc2_buff,'"','""') || '"';
+ utf_put_clob;
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.CHAR_TYPE
+ then
+ dbms_sql.column_value_char(c => dyn_curs
+ ,position => i
+ ,value => char_buff
+ ,column_error => col_err
+ ,actual_length => col_len);
+ -- VARCHAR2, CHAR, and CLOB use the same script_put format
+ show_col_err(tabs.table_name, 'CHAR', i);
+ script_put(fh, lc);
+ if char_buff is not null
+ then
+ clob_buff := '"' || replace(substr(char_buff, 1, col_len)
+ ,'"','""') || '"';
+ utf_put_clob;
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.CLOB_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => clob_buff);
+ -- VARCHAR2, CHAR, and CLOB use the same script_put format
+ script_put(fh, lc);
+ if clob_buff is not null
+ then
+ clob_buff := '"' || replace(clob_buff,'"','""') || '"';
+ utf_put_clob;
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.NUMBER_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => num_buff
+ ,column_error => col_err
+ ,actual_length => col_len);
+ show_col_err(tabs.table_name, 'NUMBER', i);
+ script_put(fh, lc || to_char(num_buff));
+ --
+ when desc_tab(i).col_type = DBMS_SQL.DATE_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => date_buff
+ ,column_error => col_err
+ ,actual_length => col_len);
+ show_col_err(tabs.table_name, 'DATE', i);
+ script_put(fh, lc);
+ if date_buff is not null
+ then
+ script_put(fh, '"' || to_char(date_buff, F_DATE) || '"');
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => tstmp_buff);
+ script_put(fh, lc);
+ if tstmp_buff is not null
+ then
+ script_put(fh, '"' || to_char(tstmp_buff, F_TST) || '"');
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_WITH_TZ_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => tstmptz_buff);
+ script_put(fh, lc);
+ if tstmptz_buff is not null
+ then
+ script_put(fh, '"' || to_char(tstmptz_buff, F_TSTTZ) || '"');
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.TIMESTAMP_WITH_LOCAL_TZ_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => tstmpltz_buff);
+ script_put(fh, lc);
+ if tstmpltz_buff is not null
+ then
+ script_put(fh, '"' || to_char(tstmpltz_buff, F_TST) || '"');
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.INTERVAL_DAY_TO_SECOND_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => intvlds_buff);
+ script_put(fh, lc);
+ if intvlds_buff is not null
+ then
+ script_put(fh, '"' || to_char(intvlds_buff, F_IDTOS) || '"');
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.USER_DEFINED_TYPE
+ and desc_tab(i).col_type_name = 'XMLTYPE'
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => xml_buff);
+ script_put(fh, lc);
+ if xml_buff is not null
+ then
+ clob_buff := '"' || COMMON_UTIL.clob_replace
+ (xmltype.getClobVal(xml_buff)
+ ,'"','""') || '"';
+ utf_put_clob;
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.BLOB_TYPE
+ then
+ dbms_sql.column_value(c => dyn_curs
+ ,position => i
+ ,value => blob_buff);
+ script_put(fh, lc);
+ if blob_buff is not null
+ then
+ -- Note: b64_encode inserts Line Feeds in the data
+ clob_buff := '"' || b64_encode(blob_buff) || '"';
+ utf_put_clob;
+ end if;
+ --
+ when desc_tab(i).col_type = DBMS_SQL.RAW_TYPE
+ then
+ dbms_sql.column_value_raw(c => dyn_curs
+ ,position => i
+ ,value => raw_buff
+ ,column_error => col_err
+ ,actual_length => col_len);
+ show_col_err(tabs.table_name, 'RAW', i);
+ script_put(fh, lc);
+ if raw_buff is not null
+ then
+ -- Note: b64_encode inserts Line Feeds in the data
+ clob_buff := '"' || b64_encode(raw_buff) || '"';
+ utf_put_clob;
+ end if;
+ --
+ else
+ raise_application_error(-20000, 'Unknown DBMS_SQL DESC_TAB3 col_type ' || desc_tab(i).col_type ||
+ ', col_type_name ' || desc_tab(i).col_type_name ||
+ ' for column ' || desc_tab(i).col_name ||
+ ' in table ' || g_schema_name || '.' || tabs.table_name);
+ --
+ end case;
+ lc := ','; -- Add comma after the first column
+ end loop;
+ --
+ script_new_line(fh);
+ --
+ end loop;
+ --
+ script_close(fh);
+ --
+ -- SQL Script Setup
+ fh := script_open(in_filename => tabs.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line (fh, '-- Consolidated Data Load script for ' || g_schema_name ||
+ '.' || tabs.table_name || ' data');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Command Line Parameters:');
+ script_put_line(fh, '-- 1 - SYSTEM/password@TNSALIAS');
+ script_put_line(fh, '-- i.e. pass the username and password for the SYSTEM user');
+ script_put_line(fh, '-- and the TNSALIAS for the connection to the database.');
+ script_put_line(fh, '-- The Data Load installation requires this connection information.');
+ script_put_line(fh, '--');
+ if tabs.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Note: This is a "' || tabs.install_timing || '" Consolidated Data Load');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt Disable Triggers and Foreign Keys');
+ script_put_line(fh, 'declare');
+ script_put_line(fh, ' procedure run_sql (in_sql in varchar2) is begin');
+ script_put_line(fh, ' dbms_output.put_line(in_sql || '';'');');
+ script_put_line(fh, ' execute immediate in_sql;');
+ script_put_line(fh, ' exception when others then');
+ script_put_line(fh, ' dbms_output.put_line(''-- '' || SQLERRM || CHR(10));');
+ script_put_line(fh, ' end run_sql;');
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' for buff in (select owner, trigger_name');
+ script_put_line(fh, ' from dba_triggers');
+ script_put_line(fh, ' where table_owner = ''' || g_schema_name || '''');
+ script_put_line(fh, ' and table_name = ''' || tabs.table_name || '''');
+ script_put_line(fh, ' order by owner, trigger_name)');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' run_sql(''alter trigger "'' || buff.owner || ''"'' ||');
+ script_put_line(fh, ' ''."'' || buff.trigger_name || ''" DISABLE'');');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, ' for buff in (select constraint_name');
+ script_put_line(fh, ' from dba_constraints');
+ script_put_line(fh, ' where constraint_type = ''R''');
+ script_put_line(fh, ' and owner = ''' || g_schema_name || '''');
+ script_put_line(fh, ' and table_name = ''' || tabs.table_name || '''');
+ script_put_line(fh, ' order by owner, constraint_name)');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' run_sql(''alter table "' || g_schema_name || '"."' || tabs.table_name || '"'' ||');
+ script_put_line(fh, ' '' DISABLE constraint "'' || buff.constraint_name || ''"'');');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: Additional file extensions for SQL*Loader include');
+ script_put_line(fh, '-- .bad - Bad Records');
+ script_put_line(fh, '-- .dsc - Discard Records');
+ script_put_line(fh, '-- .log - Log File');
+ script_put_line(fh, '');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt sqlldr_control=' || g_schema_name || '/' || tabs.ctl_file);
+ script_put_line(fh, 'host sqlldr ''&1.'' control=' || g_schema_name || '/' || tabs.ctl_file ||
+ ' data=' || g_schema_name || '/' || tabs.dat_file ||
+ ' log=' || g_schema_name || '/' || tabs.log_file ||
+ ' silent=HEADER,FEEDBACK' );
+ script_put_line(fh, '');
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' if ''&_RC.'' != ''0'' then');
+ script_put_line(fh, ' raise_application_error(-20000, ''Control file "' || g_schema_name || '/' || tabs.ctl_file ||
+ '" returned error: &_RC.'');' );
+ script_put_line(fh, ' end if;');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+
+ for i in 1 .. num_cols
+ loop
+ if desc_tab(i).col_type in (DBMS_SQL.BLOB_TYPE, DBMS_SQL.RAW_TYPE)
+ then
+ script_put_line(fh, 'declare');
+ script_put_line(fh, ' l_blob blob;');
+ script_put_line(fh, ' the_blob blob;');
+ script_put_line(fh, ' procedure b64_decode');
+ script_put_line(fh, ' (in_blob in BLOB)');
+ script_put_line(fh, ' is');
+ script_put_line(fh, ' B64_ENCODE_HEADER constant varchar2(30) := ''' || common_util.B64_ENCODE_HEADER || ''';');
+ script_put_line(fh, ' SPLIT_LEN constant pls_integer := 32764; -- Must be divisible by 4');
+ script_put_line(fh, ' header_txt varchar2(128);');
+ script_put_line(fh, ' len_blob pls_integer;');
+ script_put_line(fh, ' ptr pls_integer;');
+ script_put_line(fh, ' begin');
+ script_put_line(fh, ' dbms_lob.trim(l_blob, 0);');
+ script_put_line(fh, ' dbms_lob.trim(the_blob, 0);');
+ script_put_line(fh, ' ----------------------------------------');
+ script_put_line(fh, ' -- Check incoming BLOB sizes (and return if needed)');
+ script_put_line(fh, ' if in_blob is null then return; end if;');
+ script_put_line(fh, ' len_blob := length(in_blob);');
+ script_put_line(fh, ' if len_blob = 0 then return; end if;');
+ script_put_line(fh, ' ----------------------------------------');
+ script_put_line(fh, ' -- Check for B64_ENCODE_HEADER in in_BLOB');
+ script_put_line(fh, ' header_txt := to_char(dbms_lob.substr(in_blob');
+ script_put_line(fh, ' ,length(B64_ENCODE_HEADER)');
+ script_put_line(fh, ' ,1)');
+ script_put_line(fh, ' ,nls_charset_id(''US7ASCII''));');
+ script_put_line(fh, ' if header_txt != B64_ENCODE_HEADER');
+ script_put_line(fh, ' then');
+ script_put_line(fh, ' raise_application_error(-20000, ''B64_ENCODE_HEADER missing from data: '' || header_txt);');
+ script_put_line(fh, ' end if;');
+ script_put_line(fh, ' ----------------------------------------');
+ script_put_line(fh, ' -- Create "L_BLOB" after removing B64_ENCODE_HEADER, Carriage Returns, and Line Feeds');
+ script_put_line(fh, ' ptr := 1 + length(B64_ENCODE_HEADER); -- Skip over the header');
+ script_put_line(fh, ' while ptr <= len_blob');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' dbms_lob.append(l_blob');
+ script_put_line(fh, ' ,utl_raw.translate(dbms_lob.substr(in_blob');
+ script_put_line(fh, ' ,SPLIT_LEN');
+ script_put_line(fh, ' ,ptr)');
+ script_put_line(fh, ' ,hextoraw(''000D0A'') -- NULL, Carriage Return, Line Feed');
+ script_put_line(fh, ' ,hextoraw(''00'') ) ); -- NULL');
+ script_put_line(fh, ' ptr := ptr + SPLIT_LEN;');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, ' len_blob := length(l_blob);');
+ script_put_line(fh, ' ----------------------------------------');
+ script_put_line(fh, ' -- Create "THE_BLOB" after Base64 Decoding');
+ script_put_line(fh, ' ptr := 1;');
+ script_put_line(fh, ' while ptr <= len_blob');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' dbms_lob.append(the_blob');
+ script_put_line(fh, ' ,UTL_ENCODE.BASE64_DECODE(dbms_lob.substr(l_blob');
+ script_put_line(fh, ' ,SPLIT_LEN');
+ script_put_line(fh, ' ,ptr) ) );');
+ script_put_line(fh, ' ptr := ptr + SPLIT_LEN;');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, ' end b64_decode;');
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_lob.createtemporary(l_blob, true);');
+ script_put_line(fh, ' dbms_lob.createtemporary(the_blob, true);');
+ script_put_line(fh, ' for buff in (select ROWID RID, "' || desc_tab(i).col_name || '"');
+ script_put_line(fh, ' from "' || g_schema_name || '"."' || tabs.table_name || '"');
+ script_put_line(fh, ' for update of "' || desc_tab(i).col_name || '")');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' b64_decode(buff."' || desc_tab(i).col_name || '");');
+ script_put_line(fh, ' -- This overwrites the Base64 Encoded String with the original binary data');
+ script_put_line(fh, ' update "' || g_schema_name || '"."' || tabs.table_name || '"');
+ script_put_line(fh, ' set "' || desc_tab(i).col_name || '" = the_blob');
+ script_put_line(fh, ' where rowid = buff.rid;');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, ' dbms_lob.freetemporary(l_blob);');
+ script_put_line(fh, ' dbms_lob.freetemporary(the_blob);');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ script_put_line(fh, 'commit;');
+ script_put_line(fh, '');
+ end if;
+ end loop;
+ script_close(fh);
+ --
+ dbms_sql.close_cursor(dyn_curs);
+ --
+ end loop;
+ --
+end cr_cdl;
+
+------------------------------------------------------------
+-- Create Context object script
+PROCEDURE cr_ctx
+IS
+ OTYPE CONSTANT varchar2(100) := 'CONTEXT';
+ fh sf_ptr_type; -- object script file handle
+ sql_txt varchar2(32767);
+begin
+ for buf1 in (select obj.context_owner
+ ,obj.context_name
+ ,obj.context_type
+ ,obj.context_name || '.' || obj.ext FILE_NAME
+ ,obj.package_owner
+ ,obj.package_name
+ ,obj.install_timing
+ from obj_install_context_tab obj
+ where obj.install_type = g_install_type
+ and obj.context_owner = g_schema_name
+ and obj.install_otype = OTYPE
+ order by obj.context_name
+ ,obj.context_owner
+ ,obj.package_name)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || buf1.context_name ||' Context');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Note: This is a "' || buf1.install_timing || '" Context');
+ end if;
+ script_put_line(fh, '');
+ sql_txt := 'create or replace context "' || buf1.context_name ||
+ '"."' || buf1.context_name ||
+ '" using "' || buf1.package_owner ||
+ '"."' || buf1.package_name ||
+ '" ' || buf1.context_type ;
+ big_put_line(fh, buf1.package_owner || '.' || buf1.context_name || ' Context'
+ ,sql_txt || ';'
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ END LOOP;
+end cr_ctx;
+
+------------------------------------------------------------
+-- Create Database Trigger
+procedure cr_dbtrg
+is
+ OTYPE CONSTANT varchar2(100) := 'DATABASE_TRIGGER';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buff in (select object_name TRIGGER_NAME
+ ,ext
+ ,install_timing
+ from obj_install_object_view
+ where install_type = g_install_type
+ and object_owner = g_schema_name
+ and install_otype = OTYPE
+ order by trigger_name
+ ,ext
+ ,install_timing)
+ loop
+ if NOT script_is_open(fh)
+ then
+ fh := script_open(in_filename => g_schema_name || '.' || buff.ext
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create Database Triggers for ' || g_install_type);
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_timing || '" Trigger');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.trigger_name );
+ big_put_line(fh, g_schema_name || '.' || buff.trigger_name || ' Trigger'
+ ,COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'TRIGGER'
+ ,name => buff.trigger_name
+ ,schema => g_schema_name) )
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_dbtrg;
+
+------------------------------------------------------------
+-- Create Database Link
+procedure cr_dblnk
+is
+ OTYPE CONSTANT varchar2(100) := 'DB_LINK';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (select obj.object_name DB_LINK_NAME
+ ,obj.object_name || '.' || obj.ext FILE_NAME
+ ,obj.object_owner USERNAME
+ ,lnk.host
+ ,obj.install_timing
+ from obj_install_object_tab obj
+ join dba_db_links lnk
+ on lnk.owner = obj.object_owner
+ and lnk.db_link = obj.object_name
+ where obj.install_type = g_install_type
+ and obj.object_owner = g_schema_name
+ and obj.install_otype = OTYPE
+ order by obj.object_name)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.db_link_name ||' Database Link');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Public Database Links can be captured with a row in OBJECT_CONF using');
+ script_put_line(fh, '-- PUBLIC as the USERNAME and DB_LINK as the INSTALL_OTYPE. The scripts');
+ script_put_line(fh, '-- will be created in the SYSTEM folder of the INSTALL_TYPE in the row.');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Note: This is a "' || buf1.install_timing || '" Database Link');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' for buff in (select db_link from dba_db_links');
+ script_put_line(fh, ' where owner = ''' || g_schema_name || '''');
+ script_put_line(fh, ' and db_link like ''' || buf1.db_link_name || '%'')');
+ script_put_line(fh, ' loop');
+ script_put_line(fh, ' execute immediate ''drop database link '' || buff.db_link;');
+ script_put_line(fh, ' end loop;');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- DBMS_METADATA will not create clear text passwords for the INDENITIED BY');
+ --script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ -- '.' || buf1.db_link_name);
+ --big_put_line(fh, g_schema_name || '.' || buf1.db_link_name || ' DB Link'
+ -- ,dbms_metadata.get_ddl(object_type => 'DB_LINK'
+ -- ,name => buf1.db_link_name
+ -- ,schema => g_schema_name));
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Using Custom SQL to set default password');
+ if g_schema_name = 'PUBLIC' -- in (select username from schema_conf
+ -- where install_type = 'pub')
+ then
+ script_put_line(fh, 'create PUBLIC database link "' || buf1.db_link_name || '"');
+ else
+ script_put_line(fh, 'create database link "' || g_schema_name || '"."' || buf1.db_link_name || '"');
+ end if;
+ script_put_line(fh, ' connect to "' || buf1.username || '"');
+ script_put_line(fh, ' identified by "' || buf1.username || '"');
+ script_put_line(fh, ' using ''' || buf1.host || '''');
+ script_put_line(fh, ';');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Database Links have no grants');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Synonyms');
+ script_put_line(fh, '-- DBA_SYNONYMS does not display who owns the database link, so');
+ script_put_line(fh, '-- any non-unique Database Link name will cause problems here.');
+ for buf2 in (select target_owner OWNER
+ ,synonym_name
+ ,install_type_selector
+ from obj_install_synonym_tab
+ where install_type = g_install_type
+ and synonym_owner = g_schema_name
+ and db_link = buf1.db_link_name
+ and install_otype = 'SYNONYM'
+ order by target_owner
+ ,synonym_name)
+ loop
+ script_put_line(fh, '');
+ dbms_output.put_line('-- ' || buf2.install_type_selector || ' found.' || LF ||
+ '-- buf1.FILE_NAME = ' || buf1.file_name || LF ||
+ '-- buf1.DB_LINK_NAME = ' || buf1.db_link_name || LF ||
+ '-- buf2.SYNONYM_NAME = ' || buf2.synonym_name || LF ||
+ '-- g_schema_name = ' || g_schema_name || LF ||
+ '-- g_install_type = ' || g_install_type );
+ script_put_line(fh, '--DBMS_METADATA:' || buf2.owner ||
+ '.' || buf2.synonym_name);
+ big_put_line(fh, buf2.owner || '.' || buf2.synonym_name || ' Synonym'
+ ,dbms_metadata.get_ddl(object_type => 'SYNONYM'
+ ,name => buf2.synonym_name
+ ,schema => buf2.owner)
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_dblnk;
+
+------------------------------------------------------------
+-- Create Database Directory
+procedure cr_dir
+is
+ TYPE dir_aa_type is table of varchar2(1)
+ index by dba_directories.directory_path%TYPE;
+ dir_aa dir_aa_type;
+ dbuff dba_directories.directory_path%TYPE;
+ -- "create directory" should only be run by SYSTEM
+ OTYPE CONSTANT varchar2(100) := 'DIRECTORY';
+ fh sf_ptr_type; -- object script file handle
+ old_dir dba_directories.directory_name%TYPE;
+ sql_txt varchar2(32767);
+begin
+ for buf1 in(select directory_name
+ ,grantee GRANTEE
+ ,privilege
+ ,max(grantable) GRANTABLE
+ ,directory_path
+ ,directory_name || '.' || ext FILE_NAME
+ --,directory_name || '.' || ext2 BASH_NAME
+ --,directory_name || '.' || ext3 BATCH_NAME
+ ,install_timing
+ from priv_obj_dir_view
+ where install_type = g_install_type
+ and directory_owner = 'SYS'
+ and install_otype = OTYPE
+ group by directory_name
+ ,grantee
+ ,privilege
+ ,directory_path
+ ,ext
+ --,ext2
+ --,ext3
+ ,install_timing
+ order by directory_name
+ ,grantee
+ ,privilege)
+ loop
+ if buf1.directory_name != nvl(old_dir,'###BOGUS###')
+ then
+ if old_dir is not null
+ then
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+ old_dir := buf1.directory_name;
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || buf1.directory_name ||' Database Directory');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Because directories are created based on permissions, granting');
+ script_put_line(fh, '-- directory access to users/roles in different install types');
+ script_put_line(fh, '-- will result in duplicate CREATE DIRECTORY scripts');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ -- If this is run by a DBA other than SYS, DBMS_METADATA
+ -- will only return directories granted with GRANT option
+ sql_txt := 'create or replace directory "' || buf1.directory_name || '"' || LF ||
+ ' as ''' || buf1.directory_path || '''';
+ big_put_line(fh, buf1.directory_name || ' Directory', sql_txt || ';', common_util.MAX_SQL_LEN);
+ dir_aa(buf1.directory_path) := 'X';
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Grants');
+ script_put_line(fh, '');
+ for buf2 in (select directory_name
+ ,grantee GRANTEE
+ ,privilege
+ from priv_obj_dir_view
+ where install_type = 'pub'
+ --and install_timing = 'CURRENT' All Public Directories are CURRENT
+ and directory_owner = 'SYS'
+ and install_otype = OTYPE
+ group by directory_name
+ ,grantee
+ ,privilege
+ order by directory_name
+ ,grantee
+ ,privilege)
+ loop
+ if buf2.directory_name = buf1.directory_name
+ then
+ script_put_line(fh, 'grant ' || buf2.privilege ||
+ ' on directory "' || buf1.directory_name ||
+ '" to "' || buf2.grantee || '";');
+ end if;
+ end loop;
+ end if;
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '-- Note: This is a "' || buf1.install_timing || '" Directory Grant');
+ end if;
+ -- Oracle Database 12c Release 1 Database SQL Language Reference
+ -- "on_object_clause"
+ -- Users, directory schema objects, editions, data mining models, Java
+ -- source and resource schema objects, and SQL translation profiles
+ -- are identified separately because they reside in separate namespaces.
+ -- If this is run by a DBA other than SYS, DBMS_METADATA
+ -- will only return directories granted with GRANT option
+ sql_txt := 'grant ' || buf1.privilege ||
+ ' on directory "' || buf1.directory_name ||
+ '" to "' || buf1.grantee || '"';
+ -- "with hierarchy option" has not yet been implemented
+ if buf1.grantable = 'YES'
+ then
+ sql_txt := sql_txt || ' with grant option';
+ end if;
+ script_put_line(fh, sql_txt || ';');
+ script_put_line(fh, '');
+ end loop;
+ if old_dir is not null
+ then
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ --dbms_output.put_line('buf1.bash_name = ' || buf1.bash_name);
+ fh := script_open(in_filename => 'create_directories.sh'
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_UNX_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '#');
+ script_put_line(fh, '# Create Directories for Linux');
+ script_put_line(fh, '#');
+ script_put_line(fh, '');
+ dbuff := dir_aa.FIRST;
+ loop
+ script_put_line(fh, 'mkdir -p ' || replace(dbuff,'\','/'));
+ exit when dbuff = dir_aa.LAST;
+ dbuff := dir_aa.NEXT(dbuff);
+ end loop;
+ script_put_line(fh, '');
+ dbuff := dir_aa.FIRST;
+ loop
+ script_put_line(fh, 'chmod 777 ' || replace(dbuff,'\','/'));
+ exit when dbuff = dir_aa.LAST;
+ dbuff := dir_aa.NEXT(dbuff);
+ end loop;
+ script_put_line(fh, '');
+ script_close(fh);
+ --dbms_output.put_line('buf1.bash_name = ' || buf1.batch_name);
+ fh := script_open(in_filename => 'create_directories.bat'
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_WIN_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, 'REM');
+ script_put_line(fh, 'REM Create Directories for Windows');
+ script_put_line(fh, 'REM');
+ script_put_line(fh, '');
+ dbuff := dir_aa.FIRST;
+ loop
+ script_put_line(fh, 'md ' || replace(dbuff,'/','\'));
+ exit when dbuff = dir_aa.LAST;
+ dbuff := dir_aa.NEXT(dbuff);
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, 'REM set db_owner=oracle');
+ script_put_line(fh, '');
+ dbuff := dir_aa.FIRST;
+ loop
+ script_put_line(fh, 'REM icacls '|| replace(dbuff,'/','\') || ' /grant %db_owner%:F /T');
+ exit when dbuff = dir_aa.LAST;
+ dbuff := dir_aa.NEXT(dbuff);
+ end loop;
+ script_put_line(fh, '');
+ script_close(fh);
+ end if;
+end cr_dir;
+
+------------------------------------------------------------
+-- Create Table Foreign Keys
+procedure cr_fk
+ (in_otype in varchar2)
+is
+ fh sf_ptr_type; -- object script file handle
+ old_tab varchar2(1000);
+ fname varchar2(1000);
+begin
+ old_tab := 'This is not a Table Name.';
+ for buff in (select fk.base_table_name TABLE_NAME
+ ,fk.base_table_name || '.' || fk.ext FILE_NAME
+ ,fk.base_table_type
+ ,fk.foreign_key_name
+ ,fk.install_type_selector
+ from obj_install_fkey_tab fk
+ where fk.base_table_owner = g_schema_name --Doesn't work with Views
+ and fk.install_otype = in_otype
+ and fk.install_type = g_install_type
+ order by fk.base_table_name
+ ,fk.foreign_key_name )
+ loop
+ if buff.table_name != old_tab
+ then
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+ old_tab := buff.table_name;
+ fh := script_open(in_filename => buff.file_name
+ ,in_otype => in_otype
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create Foreign Keys for ' || g_schema_name ||
+ '.' || buff.table_name ||
+ ' ' || buff.base_table_type);
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_type_selector || '" Foreign Key');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.foreign_key_name );
+ big_put_line(fh, g_schema_name || '.' || buff.table_name || ' Ref Constraint'
+ ,dbms_metadata.get_ddl(object_type => 'REF_CONSTRAINT'
+ ,name => buff.foreign_key_name
+ ,schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_fk;
+
+------------------------------------------------------------
+-- Create FUTURE Grants
+procedure cr_grnt
+is
+ OTYPE CONSTANT varchar2(100) := 'GRANT';
+ fh sf_ptr_type; -- object script file handle
+ sql_txt varchar2(32767);
+ default_install_type type_conf.install_type%TYPE;
+begin
+ for gtee in (with q1 as (
+ select grantee
+ ,grantee_uor_type
+ from priv_system_privileges_view
+ where install_type = g_install_type
+ -- and install_type_selector = 'GRANTEE' Everything is "GRANTEE"
+ UNION ALL
+ select grantee
+ ,grantee_uor_type
+ from priv_role_privileges_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE'
+ UNION ALL
+ select grantee
+ ,grantee_uor_type
+ from priv_queue_sysprivs_view
+ where grantee_install_type = g_install_type
+ -- and install_type_selector = 'GRANTEE' Everything is "GRANTEE"
+ UNION ALL
+ select grantee
+ ,grantee_uor_type
+ from priv_obj_install_vw -- Includes PUBLIC SCHEMA_NAME
+ where install_type = g_install_type
+ and ( install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ OR ( install_type_selector = 'OBJECT'
+ and object_install_type = 'sys') )
+ UNION ALL
+ select grantee
+ ,grantee_uor_type
+ from priv_obj_queue_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ UNION ALL
+ select grantee
+ ,grantee_uor_type
+ from priv_obj_java_fg_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ )
+ select q1.grantee GRANTEE
+ ,q1.grantee ||
+ case q1.grantee_uor_type when 'USER' then '_usr'
+ when 'ROLE' then '_rol'
+ else '_error'
+ end || '.' ||
+ otyp.ext FILE_NAME
+ from q1
+ join otype_conf otyp -- OTYPE_CONF has the file extension
+ on otyp.install_otype = OTYPE
+ group by q1.grantee
+ ,q1.grantee_uor_type
+ ,otyp.ext
+ order by q1.grantee
+ ,q1.grantee_uor_type
+ ,otyp.ext)
+ loop
+ fh := script_open(in_filename => gtee.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || gtee.grantee || ' Grants');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Database System Privileges');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || gtee.grantee);
+ BEGIN
+ big_put_line(fh, OTYPE || ' ' || gtee.grantee || ' FUTURE Grants'
+ ,dbms_metadata.get_granted_ddl(object_type => 'SYSTEM_GRANT'
+ ,grantee => gtee.grantee)
+ ,common_util.MAX_SQL_LEN);
+ EXCEPTION
+ WHEN DBMS_METADATA.object_not_found2
+ THEN
+ null;
+ END;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- "sys" INSTALL_TYPE Role Grants');
+ script_put_line(fh, '-- "GRANTEE" (delayed) Role Grants');
+ script_put_line(fh, '-- Note: "OBJECT" Schema Object Grants are given during Role creation');
+ script_put_line(fh, '');
+ -- DBMS_METADATA will grant all roles...
+ --script_put_line(fh, '--DBMS_METADATA:' || gtee.grantee);
+ --big_put_line(fh, OTYPE || ' ' || gtee.grantee || ' FUTURE Grants'
+ -- ,dbms_metadata.get_granted_ddl(object_type => 'ROLE_GRANT'
+ -- ,grantee => gtee.grantee));
+ for rol in (select rolename
+ ,delegate_option
+ ,admin_option
+ from priv_role_privileges_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ and grantee = gtee.grantee
+ order by rolename)
+ loop
+ script_put_line(fh, 'grant "' || rol.rolename || '" to "' || gtee.grantee || '";');
+ -- "with hierarchy option" has not yet been implemented
+ if rol.admin_option = 'YES'
+ then
+ script_put_line(fh, 'grant "' || rol.rolename || '" to "' || gtee.grantee || '" with admin option;');
+ end if;
+ if rol.delegate_option = 'YES'
+ then
+ script_put_line(fh, 'grant "' || rol.rolename || '" to "' || gtee.grantee || '" with delegate option;');
+ end if;
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- "sys" INSTALL_TYPE Schema Object Grants, excluding SYS objects');
+ script_put_line(fh, '-- "GRANTEE" (delayed) Schema Object Grants');
+ script_put_line(fh, '-- Note: "OBJECT" Schema Object Grants are given during object creation');
+ script_put_line(fh, '');
+ for sobj in (select object_owner TABLE_OWNER
+ ,object_name TABLE_NAME
+ ,privilege
+ ,max(grantable) GRANTABLE
+ from priv_obj_install_vw
+ where object_install_type = g_install_type
+ and ( install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ OR ( install_type_selector = 'OBJECT'
+ and object_install_type = 'sys') )
+ and grantee = gtee.grantee
+ and object_owner != 'SYS'
+ and privilege not in ('ENQUEUE','DEQUEUE')
+ group by object_owner
+ ,object_name
+ ,privilege
+ order by object_owner
+ ,object_name
+ ,privilege)
+ loop
+ -- Can't find an appropriate DBMS_METADATA for this, so manually create the SQL
+ sql_txt := 'grant ' || sobj.privilege ||
+ ' on "' || sobj.table_owner || '"."' || sobj.table_name || '"' ||
+ ' to "' || gtee.grantee || '"';
+ -- "with hierarchy option" has not yet been implemented
+ if sobj.grantable = 'YES'
+ then
+ sql_txt := sql_txt || ' with grant option';
+ end if;
+ script_put_line(fh, sql_txt || ';');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Advanced Queue System Privileges');
+ script_put_line(fh, '');
+ for buff in (select grant_name DBMS_AQ_PRIV
+ from priv_queue_sysprivs_view
+ where install_type = g_install_type
+ -- and install_type_selector = 'GRANTEE' Everything is "GRANTEE"
+ and grantee = gtee.grantee
+ order by dbms_aq_priv)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.grant_system_privilege(');
+ script_put_line(fh, ' privilege => ''' || buff.DBMS_AQ_PRIV || ''', ');
+ script_put_line(fh, ' grantee => ''' || gtee.grantee || ''', ');
+ script_put_line(fh, ' admin_option => FALSE);');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Advanced Queue Grants');
+ script_put_line(fh, '-- "GRANTEE" (Delayed) Advanced Queue Grants');
+ script_put_line(fh, '-- Note: "QUEUE" Advanced Queue Grants are given during object creation');
+ for cque in (select queue_owner
+ ,queue_name
+ ,privilege
+ ,max(grantable) GRANTABLE
+ from priv_obj_queue_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ and grantee = gtee.grantee
+ group by queue_owner
+ ,queue_name
+ ,privilege)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.grant_queue_privilege');
+ script_put_line(fh, ' (privilege => ''' || cque.privilege || '''' );
+ script_put_line(fh, ' ,queue_name => ''"' || cque.queue_owner || '"."' ||
+ cque.queue_name || '"''' );
+ script_put_line(fh, ' ,grantee => ''' || gtee.grantee || '''' );
+ if cque.grantable = 'YES'
+ then
+ script_put_line(fh, ' ,grant_option => TRUE);');
+ else
+ script_put_line(fh, ' ,grant_option => FALSE);');
+ end if;
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Advanced Queue Subscriptions');
+ script_put_line(fh, '-- "GRANTEE" (Delayed) Advanced Queue Subscription');
+ script_put_line(fh, '-- Note: "QUEUE" Advanced Queue Subscriptions are given during object creation');
+ script_put_line(fh, '');
+ for buf3 in (
+ select queue_owner -- Owner of the queue
+ ,queue_name -- Name of the queue
+ ,consumer_name -- Name of the subscriber
+ ,address -- Address of the subscriber
+ ,protocol -- Protocol of the subscriber
+ ,rule -- Rule condition for the subscriber
+ ,transformation -- Transformation for the subscriber
+ ,queue_to_queue -- Is subscriber is a queue-to-queue subscriber?
+ ,delivery_mode -- Message delivery mode: PERSISTENT, BUFFERED, or PERSISTENT_OR_BUFFERED
+ from priv_queue_subscribe_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE'
+ and consumer_name = gtee.grantee
+ order by queue_owner
+ ,queue_name
+ ,consumer_name)
+ loop
+ script_put_line(fh, 'begin');
+ script_put_line(fh, ' dbms_aqadm.add_subscriber');
+ script_put_line(fh, ' (queue_name => ''' || buf3.queue_owner ||
+ '.' || buf3.queue_name || '''');
+ script_put_line(fh, ' ,subscriber => sys.aq$_agent');
+ script_put_line(fh, ' (name => ''' || buf3.consumer_name || '''');
+ script_put_line(fh, ' ,address => ''' || buf3.address || '''');
+ script_put_line(fh, ' ,protocol => ' || buf3.protocol || ')');
+ script_put_line(fh, ' ,rule => ''' || buf3.rule || '''');
+ script_put_line(fh, ' ,transformation => ''' || buf3.transformation || '''');
+ script_put_line(fh, ' ,queue_to_queue => ' || buf3.queue_to_queue );
+ script_put_line(fh, ' ,delivery_mode => DBMS_AQADM.' || buf3.delivery_mode || ');');
+ script_put_line(fh, 'end;');
+ script_put_line(fh, '/');
+ script_put_line(fh, '');
+ end loop;
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ -- Oracle Database 12c Release 1 (12.1)
+ -- Database Java Developer''s Guide
+ -- 10 Security for Oracle Database Java Applications
+ -- Setting Permissions
+ -- http://docs.oracle.com/database/121/JJDEV/chten.htm#JJDEV13326
+ script_put_line(fh, '-- "GRANTEE" (Delayed) Fine-Grained Java Permissions');
+ script_put_line(fh, '-- Note: "JAVA_CLASS" Fine-Grained Java Permissions are given during object creation');
+ script_put_line(fh, '--');
+ FOR jpol in
+ (select seq
+ ,kind
+ ,java_class_owner
+ ,java_class_grant
+ ,java_class_mask
+ ,java_class_permission
+ ,enabled
+ from priv_obj_java_fg_view
+ where install_type = g_install_type
+ and install_type_selector = 'GRANTEE' -- Grant delayed for this Grantee
+ and grantee = gtee.grantee
+ order by seq)
+ LOOP
+ script_put_line(fh, '-- SEQ:' || jpol.seq || ', ' ||
+ jpol.kind || ' ' ||
+ jpol.java_class_permission || ' on ' ||
+ jpol.java_class_owner || ':' ||
+ jpol.java_class_grant || ' - ' ||
+ jpol.java_class_mask || ' to ' ||
+ gtee.grantee || ' ' ||
+ jpol.enabled );
+ script_put_line(fh, 'BEGIN');
+ script_put_line(fh, ' dbms_java.grant_permission' || '(''' ||
+ gtee.grantee || ''', ''' ||
+ jpol.java_class_owner || ':' ||
+ jpol.java_class_grant || ''', ''' ||
+ jpol.java_class_mask || ''', ''' ||
+ jpol.java_class_permission || ''');' );
+ script_put_line(fh, 'END;' );
+ script_put_line(fh, '/' );
+ END LOOP;
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ END LOOP;
+end cr_grnt;
+
+------------------------------------------------------------
+-- Create Index Scripts
+procedure cr_ind
+ (in_otype in VARCHAR2)
+is
+ fh sf_ptr_type; -- object script file handle
+ old_own varchar2(1000);
+ old_tab varchar2(1000);
+ fname varchar2(1000);
+begin
+ old_own := 'This is not an Owner Name.';
+ old_tab := 'This is not a Table name.';
+ for buff in (select ind.table_owner
+ ,ind.table_name
+ ,ind.table_name || '.' || ext FILE_NAME
+ ,ind.table_type
+ ,ind.index_owner
+ ,ind.index_name
+ ,ind.install_type_selector
+ from obj_install_index_tab ind
+ where ind.install_type = g_install_type
+ and ind.index_owner = g_schema_name
+ and ind.install_otype = in_otype
+ and ind.index_type != 'LOB' -- LOB Indexes are auto-created
+ and (ind.table_owner, ind.table_name) not in (
+ select xt.owner, xt.table_name
+ from dba_xml_tables xt) -- XMLTable Indexes are auto-created
+ and not exists (
+ -- Primary Key and Unique Key Indexes are auto-created with the table
+ select 'x' from dba_constraints cons
+ where cons.constraint_type in ('P','U')
+ and cons.owner = ind.table_owner
+ and cons.table_name = ind.table_name
+ and cons.index_owner = ind.index_owner
+ and cons.index_name = ind.index_name)
+ and ind.index_name not like common_util.RECYCLE_BIN_NAME_MATCH escape '\'
+ and ind.index_name != common_util.MVIEW_AUTO_INDEX_PREFIX || ind.table_name
+ order by ind.table_owner
+ ,ind.table_name
+ ,ind.index_owner
+ ,ind.index_name)
+ loop
+ if buff.table_owner != old_own
+ or buff.table_name != old_tab
+ then
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+ old_own := buff.table_owner;
+ old_tab := buff.table_name;
+ if buff.table_owner = g_schema_name
+ then
+ fname := buff.file_name;
+ else
+ fname := buff.table_owner || '.' || buff.file_name;
+ end if;
+ fh := script_open(in_filename => fname --buff.file_name
+ ,in_otype => in_otype
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create Indexes for ' || buff.table_owner ||
+ '.' || buff.table_name ||
+ ' ' || buff.table_type );
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_type_selector || '" Index');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || buff.index_owner ||
+ '.' || buff.index_name);
+ big_put_line(fh, g_schema_name || '.' || buff.table_name || ' ' || buff.table_type
+ ,dbms_metadata.get_ddl(object_type => 'INDEX'
+ ,name => buff.index_name
+ ,schema => buff.index_owner)
+ ,common_util.MAX_SQL_LEN);
+
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_ind;
+
+------------------------------------------------------------
+-- Create Master Installation Script
+procedure cr_install_master
+is
+ fh sf_ptr_type; -- object script file handle
+ fname varchar2(1000) := 'install.sql';
+ l_loc varchar2(256) := 'cr_install_master';
+begin
+ --
+ fh := script_open(in_filename => fname
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Master Installation Script');
+ script_put_line(fh, '-- All scripts created by "https://ODBCapture.org", Version ' || get_version);
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Must be run as SYS');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Command Line Parameters:');
+ script_put_line(fh, '-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS');
+ script_put_line(fh, '-- i.e. pass the username and password for the SYSTEM user');
+ script_put_line(fh, '-- and the TNSALIAS for the connection to the pluggable database.');
+ script_put_line(fh, '-- The Data Load installation requires this connection information.');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:');
+ script_put_line(fh, '-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv');
+ script_put_line(fh, '');
+ script_put_line(fh, 'define TOP_PDB_SYSTEM="&1."');
+ script_put_line(fh, 'execute DBMS_JAVA.SET_OUTPUT(1000000);');
+ script_put_line(fh, 'set serveroutput on size unlimited format wrapped');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt Identify this Module in V$SESSION');
+ script_put_line(fh, 'set appinfo "' || g_install_type || ' Installation"');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt Setup Abort on Error');
+ script_put_line(fh, 'WHENEVER SQLERROR EXIT SQL.SQLCODE');
+ script_put_line(fh, 'WHENEVER OSERROR EXIT');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt **************************');
+ script_put_line(fh, 'prompt * Run SYS Installation *');
+ script_put_line(fh, 'prompt **************************');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, '@install_sys.sql "" "" ""');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt Setup Continue on Error');
+ script_put_line(fh, 'WHENEVER SQLERROR CONTINUE');
+ script_put_line(fh, 'WHENEVER OSERROR CONTINUE');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt *****************************');
+ script_put_line(fh, 'prompt * Run SYSTEM Installation *');
+ script_put_line(fh, 'prompt *****************************');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'connect &TOP_PDB_SYSTEM.');
+ script_put_line(fh, 'execute DBMS_JAVA.SET_OUTPUT(1000000);');
+ script_put_line(fh, 'set serveroutput on size unlimited format wrapped');
+ script_put_line(fh, '@install_system.sql "" "" ""');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt *************************');
+ script_put_line(fh, 'prompt * Install Application *');
+ script_put_line(fh, 'prompt *************************');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, '@install_' || g_install_type || '.sql "&TOP_PDB_SYSTEM." "" ""');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt *****************');
+ script_put_line(fh, 'prompt * Run Reports *');
+ script_put_line(fh, 'prompt *****************');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, '@report_status.sql "&TOP_PDB_SYSTEM." "" ""');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'set appinfo "Null"');
+ script_put_line(fh, 'set appinfo off');
+ script_put_line(fh, 'prompt');
+ script_put_line(fh, 'prompt "' || g_install_type || '" Installation is Done.');
+ script_put_line(fh, '');
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'alter_foreign_keys.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.alter_foreign_keys_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'alter_triggers.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.alter_triggers_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'alter_queues.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.alter_queues_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'alter_scheduler_jobs.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.alter_scheduler_jobs_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'compile_all.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.compile_all_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'db_build_junit_report.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.db_build_junit_report_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'db_install.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.db_install_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'fix_invalid_public_synonyms.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.fix_invalid_public_synonyms_sql
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'installation_finalize.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.installation_finalize_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'installation_prepare.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.installation_prepare_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'list_invalids.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.list_invalids_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'log_files_junit_report.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.log_files_junit_report_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'odbcapture_installation_logs.cdl'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.odbcapture_installation_logs_cdl(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'odbcapture_installation_logs.csv'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.odbcapture_installation_logs_csv(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'odbcapture_installation_logs.ctl'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.odbcapture_installation_logs_ctl(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'report_status.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.report_status_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+ fh := script_open(in_filename => 'update_id_sequences.sql'
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ big_put_line(in_fh => fh
+ ,in_loc => l_loc
+ ,in_txt => root_scripts.update_id_sequences_sql(g_install_type)
+ ,in_max_len => common_util.MAX_SQL_LEN);
+ script_close(fh);
+ --
+end cr_install_master;
+
+------------------------------------------------------------
+-- Create Schema (Non SYS/SYSTEM) Installation Script
+procedure cr_install_schemas
+is
+ fh sf_ptr_type; -- object script file handle
+ fname varchar2(1000) := 'install_' || g_install_type || '.sql';
+ file_id pls_integer;
+begin
+ fh := script_open(in_filename => fname
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ --
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- ' || g_install_type || ' Installation Script');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Must be run as a SYSTEM User (DBA)');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Command Line Parameters:');
+ script_put_line(fh, '-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS');
+ script_put_line(fh, '-- i.e. pass the username and password for the SYSTEM user');
+ script_put_line(fh, '-- and the TNSALIAS for the connection to the database.');
+ script_put_line(fh, '-- The Data Load installation requires this connection information.');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool install_' || g_install_type || '.log');
+ script_put_line(fh, '');
+ script_put_line(fh, 'define INSTALL_SYSTEM_CONNECT="&1."');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages');
+ script_put_line(fh, 'set sqlprefix "~"');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Using "^P", CHR(16), DLE as an escape character');
+ script_put_line(fh, 'set escape OFF');
+ script_put_line(fh, 'set escape "' || CHR(16) || '"');
+ script_put_line(fh, '');
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- Prepare for Install');
+ script_put_line(fh, '@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."');
+ script_put_line(fh, '');
+ --
+ for buff in (select nvl(object_type, install_otype) OBJECT_TYPE
+ ,install_order, ext2, ext3
+ from otype_conf
+ where install_order > 0
+ order by install_order)
+ loop
+ if sf_aa(g_install_type).EXISTS(buff.install_order)
+ then
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- ' || buff.object_type || ' Install');
+ script_put_line(fh, '');
+ file_id := sf_aa(g_install_type)(buff.install_order).FIRST;
+ loop
+ -- RegExp: "([.]ctl|[.]csv)$" Any string ending with ".ctl" or ".csv"
+ if not regexp_like(sf_aa(g_install_type)(buff.install_order)(file_id).filename
+ , '([.]' || buff.ext2 ||
+ '|[.]' || buff.ext3 || ')$', 'i')
+ then
+ script_put_line(fh,
+ '@db_install.sql "' || sf_aa(g_install_type)(buff.install_order)(file_id).schema_name ||
+ '/' || sf_aa(g_install_type)(buff.install_order)(file_id).filename ||
+ '" "' || sf_aa(g_install_type)(buff.install_order)(file_id).schema_name ||
+ '" "&INSTALL_SYSTEM_CONNECT."' );
+ end if;
+ exit when file_id = sf_aa(g_install_type)(buff.install_order).LAST;
+ file_id := sf_aa(g_install_type)(buff.install_order).NEXT(file_id);
+ end loop;
+ script_put_line(fh, '');
+ end if;
+ end loop;
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- Finalize Installation');
+ script_put_line(fh, '@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool off');
+ script_put_line(fh, '');
+ --
+ script_close(fh);
+end cr_install_schemas;
+
+------------------------------------------------------------
+-- Create SYS Installation Script
+procedure cr_install_sys
+is
+ fh sf_ptr_type; -- object script file handle
+ fname varchar2(1000) := 'install_sys.sql';
+ file_id pls_integer;
+begin
+ fh := script_open(in_filename => fname
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ --
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- SYS Installation Script');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Must be run as SYS');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool install_sys.log');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set blockterminator off');
+ script_put_line(fh, 'set sqlblanklines on');
+ script_put_line(fh, '');
+ --
+ for buff in (select nvl(object_type, install_otype) OBJECT_TYPE
+ ,install_order, ext2, ext3
+ from otype_conf
+ where install_order between -199 and -100
+ order by install_order)
+ loop
+ if sf_aa(g_install_type).EXISTS(buff.install_order)
+ then
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- ' || buff.object_type || ' Install');
+ script_put_line(fh, '');
+ file_id := sf_aa(g_install_type)(buff.install_order).FIRST;
+ loop
+ -- RegExp: "([.]ctl|[.]csv)$" Any string ending with ".ctl" or ".csv"
+ if not regexp_like(sf_aa(g_install_type)(buff.install_order)(file_id).filename
+ , '([.]' || buff.ext2 ||
+ '|[.]' || buff.ext3 || ')$', 'i')
+ then
+ script_put_line(fh,
+ '@db_install.sql "' || sf_aa(g_install_type)(buff.install_order)(file_id).schema_name ||
+ '/' || sf_aa(g_install_type)(buff.install_order)(file_id).filename ||
+ '" "" ""' );
+ end if;
+ exit when file_id = sf_aa(g_install_type)(buff.install_order).LAST;
+ file_id := sf_aa(g_install_type)(buff.install_order).NEXT(file_id);
+ end loop;
+ script_put_line(fh, '');
+ end if;
+ end loop;
+ --
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'set sqlblanklines off');
+ script_put_line(fh, 'set blockterminator on');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool off');
+ script_put_line(fh, '');
+ --
+ script_close(fh);
+end cr_install_sys;
+
+------------------------------------------------------------
+-- Create SYSTEM Installation Script
+procedure cr_install_system
+is
+ fh sf_ptr_type; -- object script file handle
+ fname varchar2(1000) := 'install_system.sql';
+ file_id pls_integer;
+begin
+ fh := script_open(in_filename => fname
+ ,in_otype => 'INSTALL_SCRIPT'
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ --
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- SYSTEM Installation Script');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Must be run as SYSTEM');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool install_system.log');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set blockterminator off');
+ script_put_line(fh, 'set sqlblanklines on');
+ script_put_line(fh, '');
+ --
+ for buff in (select nvl(object_type, install_otype) OBJECT_TYPE
+ ,install_order, ext2, ext3
+ from otype_conf
+ where install_order between -99 and 0
+ order by install_order)
+ loop
+ if sf_aa(g_install_type).EXISTS(buff.install_order)
+ then
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- ' || buff.object_type || ' Install');
+ script_put_line(fh, '');
+ file_id := sf_aa(g_install_type)(buff.install_order).FIRST;
+ loop
+ -- RegExp: "([.]ctl|[.]csv)$" Any string ending with ".ctl" or ".csv"
+ if not regexp_like(sf_aa(g_install_type)(buff.install_order)(file_id).filename
+ , '([.]' || buff.ext2 ||
+ '|[.]' || buff.ext3 || ')$', 'i')
+ then
+ script_put_line(fh,
+ '@db_install.sql "' || sf_aa(g_install_type)(buff.install_order)(file_id).schema_name ||
+ '/' || sf_aa(g_install_type)(buff.install_order)(file_id).filename ||
+ '" "" ""' );
+ end if;
+ exit when file_id = sf_aa(g_install_type)(buff.install_order).LAST;
+ file_id := sf_aa(g_install_type)(buff.install_order).NEXT(file_id);
+ end loop;
+ script_put_line(fh, '');
+ end if;
+ end loop;
+ --
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, 'set sqlblanklines off');
+ script_put_line(fh, 'set blockterminator on');
+ script_put_line(fh, '');
+ script_put_line(fh, 'spool off');
+ script_put_line(fh, '');
+ --
+ script_close(fh);
+end cr_install_system;
+
+------------------------------------------------------------
+-- Create Materialized View Scripts
+procedure cr_mvw
+is
+ POTYPE varchar2(100) := '';
+ OTYPE varchar2(100) := 'MVIEW';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (with qmain as (
+ select object_name MVIEW_NAME
+ ,object_name || '.' || ext FILE_NAME
+ ,install_timing
+ from obj_install_object_tab
+ where install_type = g_install_type
+ and object_owner = g_schema_name
+ and install_otype = OTYPE
+ order by object_name
+ ), qdep as ( -- Select only the interesting dependencies
+ select object_name
+ ,referenced_name
+ from dba_dependencies_tab
+ where object_owner = g_schema_name
+ and object_type = 'MATERIALIZED VIEW'
+ and referenced_owner = g_schema_name
+ and referenced_type = 'MATERIALIZED VIEW'
+ and dependency_type = 'REF'
+ ), qroot as ( -- Find the root nodes that have no dependencies
+ select 0 LVL
+ ,obj.object_name
+ from dba_objects_tab obj
+ where obj.object_owner = g_schema_name
+ and obj.object_type = 'MATERIALIZED VIEW'
+ and obj.object_name not in (select qdep.object_name from qdep)
+ ), qlvl as ( -- Find all hierarchial levels for all nodes from root nodes
+ select level LVL
+ ,qdep.object_name OBJECT_NAME
+ from qdep
+ connect by prior qdep.referenced_name = qdep.object_name
+ start with qdep.referenced_name in (select qroot.object_name from qroot)
+ ), q_all as ( -- Combine root nodes and dependent nodes
+ -- Also, make dependent nodes unique
+ select lvl, object_name from qroot
+ union all
+ select max(lvl) lvl, object_name from qlvl
+ group by object_name
+ ) -- Main query: Outer join in the hierarchy level and sort with it
+ select qmain.mview_name
+ ,ltrim(to_char(nvl(q_all.lvl,-1)+1,'09')) || '_' || qmain.file_name
+ FILE_NAME
+ ,qmain.install_timing
+ from qmain
+ left join q_all
+ on (q_all.object_name = qmain.mview_name)
+ order by 1, 2)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.mview_name || ' Materialized View');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- NOTE: Foreign keys are in a different script.');
+ script_put_line(fh, '-- Indexes are in a different script.');
+ script_put_line(fh, '-- Triggers are in a different script.');
+ script_put_line(fh, '--');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buf1.install_timing || '" Materialized View');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.mview_name);
+ big_put_line(fh, g_schema_name || '.' || buf1.mview_name || ' Materialized View'
+ ,COMMON_UTIL.vw_split_str
+ (COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'MATERIALIZED_VIEW'
+ ,name => buf1.mview_name
+ ,schema => g_schema_name) ) )
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Comments');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.mview_name);
+ BEGIN
+ big_put_line(fh, g_schema_name || '.' || buf1.mview_name || ' Materialized View'
+ ,dbms_metadata.get_dependent_ddl(object_type => 'COMMENT'
+ ,base_object_name => buf1.mview_name
+ ,base_object_schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ EXCEPTION
+ WHEN DBMS_METADATA.object_not_found2
+ THEN
+ null;
+ END;
+ script_put_line(fh, '');
+ -- DBA_TAB_PRIVS list Materialized Views as Tables
+ get_object_grants(fh, buf1.mview_name, 'TABLE');
+ get_synonyms(fh, buf1.mview_name, 'MATERIALIZED VIEW', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_mvw;
+
+------------------------------------------------------------
+-- Create Java Source
+procedure cr_pjava
+is
+ OTYPE CONSTANT varchar2(100) := 'JAVA_SOURCE';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (select object_name SOURCE_NAME
+ ,object_name || '.' || ext FILE_NAME
+ ,install_timing
+ from obj_install_object_tab pjava
+ where install_type = g_install_type
+ and object_owner = g_schema_name
+ and object_type = 'JAVA SOURCE'
+ and install_otype = OTYPE
+ order by object_name
+ ,object_type)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.source_name ||' Java');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- DBMS_METADATA does not include the "create or replace" in this source');
+ script_put_line(fh, '-- "create or replace can be added, if needed.');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a " || buf1.install_timing || " Java Source');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name || '.' || buf1.source_name);
+ big_put_line(fh, g_schema_name || '.' || buf1.source_name || ' Java Source'
+ ,COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'JAVA_SOURCE'
+ ,name => buf1.source_name
+ ,schema => g_schema_name) )
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ get_object_grants(fh, buf1.source_name, 'JAVA SOURCE');
+ get_synonyms(fh, buf1.source_name, 'JAVA SOURCE', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ for buf2 in (
+ select name CLASS_NAME
+ from dba_java_classes
+ where owner = g_schema_name
+ and source = buf1.source_name
+ order by name)
+ loop
+ script_put_line(fh, '----------------------------------------');
+ script_put_line(fh, '-- Class: ' || buf2.class_name);
+ script_put_line(fh, '');
+ -- Oracle Database 12c Release 1 (12.1)
+ -- Database Java Developer''s Guide
+ -- 10 Security for Oracle Database Java Applications
+ -- Setting Permissions
+ -- http://docs.oracle.com/database/121/JJDEV/chten.htm#JJDEV13326
+ script_put_line(fh, '-- "JAVA_CLASS" Fine-Grained Java Permissions');
+ script_put_line(fh, '-- Note: "GRANTEE" Fine-Grained Java Permissions are given during User creation');
+ script_put_line(fh, '--');
+ FOR jpol in
+ (select seq
+ ,kind
+ ,java_class_owner
+ ,java_class_grant
+ ,java_class_mask
+ ,java_class_permission
+ ,grantee
+ ,enabled
+ from priv_obj_java_fg_view
+ where install_type = g_install_type
+ and install_type_selector = 'JAVA_CLASS' -- Grantee has already been created
+ and regexp_like(buf2.class_name, java_class_mask)
+ order by seq)
+ LOOP
+ script_put_line(fh, '-- SEQ:' || jpol.seq || ', ' ||
+ jpol.kind || ' ' ||
+ jpol.java_class_permission || ' on ' ||
+ jpol.java_class_owner || ':' ||
+ jpol.java_class_grant || ' - ' ||
+ jpol.java_class_mask || ' to ' ||
+ jpol.grantee || ' ' ||
+ jpol.enabled );
+ script_put_line(fh, 'BEGIN');
+ script_put_line(fh, ' dbms_java.grant_permission' || '(''' ||
+ jpol.grantee || ''', ''' ||
+ jpol.java_class_owner || ':' ||
+ jpol.java_class_grant || ''', ''' ||
+ jpol.java_class_mask || ''', ''' ||
+ jpol.java_class_permission || ''');' );
+ script_put_line(fh, 'END;' );
+ script_put_line(fh, '/' );
+ END LOOP;
+ get_object_grants(fh, buf2.class_name, 'JAVA CLASS');
+ get_synonyms(fh, buf2.class_name, 'JAVA CLASS', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ end loop;
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_pjava;
+
+------------------------------------------------------------
+-- Create Roles and SYS Grants
+procedure cr_rol
+is
+ OTYPE CONSTANT varchar2(100) := 'ROLE';
+ fh sf_ptr_type; -- object script file handle
+ sql_txt varchar2(32767);
+begin
+ for buf1 in
+ (select user_or_role ROLENAME
+ ,user_or_role || '.' || ext FILE_NAME
+ from uor_install_view
+ where uor_type = 'ROLE'
+ and install_type = g_install_type
+ order by user_or_role)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ dbms_output.put_line('buf1.file_name = ' || buf1.file_name);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || buf1.rolename || ' Role');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, 'create role ' || buf1.rolename || ';');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Grant SYS Objects (but not directories)');
+ script_put_line(fh, '');
+ for buf2 in (select object_owner OWNER
+ ,object_name TABLE_NAME
+ ,privilege
+ ,max(grantable) GRANTABLE
+ from priv_sysobj_privileges_view
+ where grantee = buf1.rolename
+ -- All directories are owned by SYS, so skip them
+ and object_type != 'DIRECTORY'
+ -- LCR$ Logical Change Record: Keep because their definition doesn't change
+ -- AQ$ Queue Tables and Views: Keep because the name should not change between databases
+ -- SYS_PLSQL Pipelined Type Objects: Created and granted with pipeline package/function
+ and object_name not like common_util.PIPELINE_TYPE_MATCH escape '\'
+ -- QT*_BUFFER Queue Views: Skip here and grant with Advanced Queue
+ -- https://blogs.oracle.com/db/entry/oracle_support_master_note_for_troubleshooting_advanced_queuing_and_oracle_streams_propagation_issue
+ -- Note that when queue table is created, a view called QT_BUFFER is created in the SYS schema, and the queue table owner is given
+ -- SELECT privileges on it. The corresponds to the object_id of the associated queue table
+ and object_name not like common_util.QUEUE_VIEW_TYPE_MATCH escape '\'
+ group by object_owner
+ ,object_name
+ ,grantee
+ ,privilege
+ order by object_owner
+ ,object_name
+ ,grantee
+ ,privilege)
+ loop
+ -- Can't find an appropriate DBMS_METADATA for this, so manually create the SQL
+ sql_txt := 'grant ' || buf2.privilege ||
+ ' on "' || buf2.owner || '"."' || buf2.table_name || '"' ||
+ ' to "' || buf1.rolename || '"';
+ -- "with hierarchy option" has not yet been implemented
+ -- Not applicable for ROLES
+ --if buf2.grantable = 'YES'
+ --then
+ -- sql_txt := sql_txt || ' with grant option';
+ --end if;
+ big_put_line(fh, buf2.owner || '.' || buf2.table_name ||
+ ' Grant', sql_txt || ';'
+ ,common_util.MAX_SQL_LEN);
+ END LOOP;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_rol;
+
+------------------------------------------------------------
+-- Create Database Trigger
+procedure cr_schtrg
+is
+ OTYPE CONSTANT varchar2(100) := 'SCHEMA_TRIGGER';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buff in (select object_name TRIGGER_NAME
+ ,ext
+ ,install_timing
+ from obj_install_object_view
+ where install_type = g_install_type
+ and object_owner = g_schema_name
+ and install_otype = OTYPE
+ order by trigger_name
+ ,ext
+ ,install_timing)
+ loop
+ if NOT script_is_open(fh)
+ then
+ fh := script_open(in_filename => g_schema_name || '.' || buff.ext
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create Schema Triggers for ' || g_install_type);
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_timing || '" Trigger');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.trigger_name );
+ big_put_line(fh, g_schema_name || '.' || buff.trigger_name || ' Trigger'
+ ,COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'TRIGGER'
+ ,name => buff.trigger_name
+ ,schema => g_schema_name) )
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_schtrg;
+
+------------------------------------------------------------
+-- Create Synonym
+procedure cr_syn
+is
+ OTYPE CONSTANT varchar2(100) := 'SYNONYM';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in
+ (select synonym_name
+ ,ext
+ from obj_install_synonym_tab
+ where install_type = g_install_type
+ and install_type_selector = 'TARGET' -- Synonym install delayed for this Target
+ and synonym_owner = g_schema_name
+ group by synonym_name, ext
+ order by synonym_name )
+ loop
+ if NOT script_is_open(fh)
+ then
+ fh := script_open(in_filename => g_schema_name || '.' || buf1.ext
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || ' Synonyms');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Synonyms from objects owned by "sys" Install Type Schema');
+ script_put_line(fh, '-- Also, synonyms delayed waiting for target installation.');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.synonym_name);
+ -- Includes DB_LINK in Synonym
+ big_put_line(fh, g_schema_name || '.' || buf1.synonym_name || ' Synonym'
+ ,dbms_metadata.get_ddl(object_type => 'SYNONYM'
+ ,name => buf1.synonym_name
+ ,schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_syn;
+
+------------------------------------------------------------
+-- Create Table Scripts
+procedure cr_tab
+is
+ POTYPE varchar2(100) := '';
+ OTYPE varchar2(100) := 'TABLE';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (select obj.object_name TABLE_NAME
+ ,obj.object_name || '.' || obj.ext FILE_NAME
+ ,obj.install_timing
+ ,xt.table_name XML_TABLE_NAME
+ from obj_install_object_tab obj
+ left join dba_xml_tables xt
+ on xt.owner = obj.object_owner
+ and xt.table_name = obj.object_name
+ where obj.install_type = g_install_type
+ and obj.object_owner = g_schema_name
+ and obj.install_otype = OTYPE
+ -- Ignore Indexed Organized Overflow Tables
+ -- Ignore Indexed Organized Mapping Tables
+ and not exists (select 'x' from dba_tables tab
+ where tab.owner = g_schema_name
+ and tab.table_name = obj.object_name
+ and tab.iot_type in ('IOT_OVERFLOW','IOT_MAPPING') )
+ -- Materialized View Tables: Auto-created with Materialized View
+ and not exists (select 'x' from dba_mviews mv
+ where mv.owner = g_schema_name
+ and mv.mview_name = obj.object_name)
+ -- Queue Tables: Skip here and recreate with Advanced Queue
+ and not exists (select 'x' from dba_queue_tables qt
+ where qt.owner = g_schema_name
+ and ( obj.object_name = qt.queue_table
+ -- MUST be more discriminating than "tab.table_name like 'AQ$%' || qt.queue_table || '%'"
+ or regexp_like(obj.object_name,common_util.QUEUE_NAME_PREFIX_REGEXP ||
+ qt.queue_table ||
+ common_util.QUEUE_NAME_SUFFIX_REGEXP ) ) )
+ order by obj.object_name )
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.table_name || ' Table');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- NOTE: Foreign keys are in a different script');
+ script_put_line(fh, '-- Indexes are in a different script');
+ script_put_line(fh, '-- Triggers are in a different script');
+ script_put_line(fh, '--');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buf1.install_timing || '" Table');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+-- if buf1.table_type = 'XMLTABLE'
+-- then
+-- -- DBMS_METADATA incorrectly creates XMLTables with the
+-- -- "ALLOW NONSCHEMA DISALLOW ANYSCHEMA" clause, but without the
+-- -- "XMLTYPE STORE AS BINARY XML" clause, resulting in an ORA-00922
+-- script_put_line(fh, 'CREATE TABLE "' || g_schema_name ||
+-- '"."' || buf1.table_name || '" OF XMLTYPE;');
+-- else
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.table_name );
+ big_put_line(fh, g_schema_name || '.' || buf1.table_name || ' Table'
+ ,dbms_metadata.get_ddl(object_type => 'TABLE'
+ ,name => buf1.table_name
+ ,schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+-- end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Comments');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.table_name);
+ BEGIN
+ big_put_line(fh, g_schema_name || '.' || buf1.table_name || ' Table'
+ ,dbms_metadata.get_dependent_ddl(object_type => 'COMMENT'
+ ,base_object_name => buf1.table_name
+ ,base_object_schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ EXCEPTION
+ WHEN DBMS_METADATA.object_not_found2
+ THEN
+ null;
+ END;
+ script_put_line(fh, '');
+ get_object_grants(fh, buf1.table_name, 'TABLE');
+ get_synonyms(fh, buf1.table_name, 'TABLE', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_tab;
+
+------------------------------------------------------------
+-- Create Trigger Scripts
+procedure cr_trg
+ (in_otype in varchar2)
+is
+ fh sf_ptr_type; -- object script file handle
+ old_own varchar2(1000);
+ old_tab varchar2(1000);
+ fname varchar2(1000);
+begin
+ old_own := 'This is not an Owner Name.';
+ old_tab := 'This is not a Table name.';
+ for buff in (select target_name TABLE_NAME
+ ,target_owner TABLE_OWNER
+ ,target_name || '.' || ext FILE_NAME
+ ,target_type
+ ,trigger_name
+ ,install_type_selector
+ from obj_install_trigger_tab
+ where trigger_owner = g_schema_name
+ and install_otype = in_otype
+ and install_type = g_install_type
+ order by target_owner
+ ,target_name
+ ,trigger_name )
+ loop
+ if buff.table_owner != old_own
+ or buff.table_name != old_tab
+ then
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+ old_own := buff.table_owner;
+ old_tab := buff.table_name;
+ if buff.table_owner = g_schema_name
+ then
+ fname := buff.file_name;
+ else
+ fname := buff.table_owner || '.' || buff.file_name;
+ end if;
+ fh := script_open(in_filename => fname -- buff.file_name
+ ,in_otype => in_otype
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create Triggers for ' || buff.table_owner ||
+ '.' || buff.table_name ||
+ ' ' || buff.target_type );
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '-- NOTE: This is a "' || buff.install_type_selector || '" Trigger');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buff.trigger_name );
+ big_put_line(fh, g_schema_name || '.' || buff.trigger_name || ' Trigger'
+ ,COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'TRIGGER'
+ ,name => buff.trigger_name
+ ,schema => g_schema_name) )
+ ,common_util.MAX_SQL_LEN);
+ end loop;
+ if script_is_open(fh)
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end if;
+end cr_trg;
+
+------------------------------------------------------------
+-- Create Users and SYS Grants
+procedure cr_usr
+is
+ OTYPE CONSTANT varchar2(100) := 'USER';
+ fh sf_ptr_type; -- object script file handle
+ sql_txt varchar2(32767);
+begin
+ for buf1 in (select sc.username
+ ,sc.username || '.' || otc.ext FILE_NAME
+ ,sc.ts_size
+ ,sc.tablespace_name
+ from schema_conf sc
+ join otype_conf otc
+ on otc.install_otype = 'USER'
+ where sc.install_type = g_install_type
+ order by sc.username)
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || buf1.username || ' Schema');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ script_put_line(fh, 'create user "' || buf1.username || '"');
+ script_put_line(fh, ' identified by "' || buf1.username || '"');
+ script_put_line(fh, ' default tablespace ' || buf1.tablespace_name);
+ script_put_line(fh, ' temporary tablespace TEMP');
+ script_put_line(fh, ' profile DEFAULT');
+ script_put_line(fh, ' quota ' || buf1.ts_size || ' on ' || buf1.tablespace_name);
+ script_put_line(fh, ';');
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Grant SYS Objects (but not directories)');
+ script_put_line(fh, '');
+ for buf2 in (select object_owner
+ ,object_name
+ ,object_type
+ ,privilege
+ ,max(grantable) GRANTABLE
+ from priv_sysobj_privileges_view
+ where grantee = buf1.username
+ -- All directories are owned by SYS, so skip them
+ and object_type != 'DIRECTORY'
+ -- LCR$ Logical Change Record: Keep because their definition doesn't change
+ -- AQ$ Queue Tables and Views: Keep because the name should not change between databases
+ -- SYS_PLSQL Pipelined Type Objects: Created and granted with pipeline package/function
+ and object_name not like common_util.PIPELINE_TYPE_MATCH escape '\'
+ -- QT*_BUFFER Queue Views: Skip here and grant with Advanced Queue
+ -- https://blogs.oracle.com/db/entry/oracle_support_master_note_for_troubleshooting_advanced_queuing_and_oracle_streams_propagation_issue
+ -- Note that when queue table is created, a view called QT_BUFFER is created in the SYS schema, and the queue table owner is given
+ -- SELECT privileges on it. The corresponds to the object_id of the associated queue table
+ and object_name not like common_util.QUEUE_VIEW_TYPE_MATCH escape '\'
+ group by object_owner
+ ,object_name
+ ,object_type
+ ,privilege
+ order by object_owner
+ ,object_name
+ ,object_type
+ ,privilege)
+ loop
+ -- Can't find an appropriate DBMS_METADATA for this, so manually create the SQL
+ --
+ -- These "types" don't require a grant quailifier:
+ -- -) FUNCTION
+ -- -) INDEXTYPE
+ -- -) LIBRARY
+ -- -) MATERIALIZED VIEW
+ -- -) OPERATOR
+ -- -) PACKAGE
+ -- -) PROCEDURE
+ -- -) SEQUENCE
+ -- -) TABLE
+ -- -) TYPE
+ -- -) VIEW
+ --
+ -- Other forms (and "types") include:
+ -- -) ON DIRECTORY (DIRECTORY) - Handled in "cr_dir"
+ -- -) ON USER (USER) - Handled HERE and in "get_object_grants"
+ -- -) ON EDITION (EDITION) - Handled HERE and in "get_object_grants"
+ -- -) ON JAVA SOURCE (JAVA CLASS) - Handled HERE and in "get_object_grants" and "cr_pjava"
+ -- -) ON JAVA RESOURCE (JAVA RESOURCE) - Handled HERE and in "get_object_grants"
+ -- -) ON MINING MODEL (MLE LANGUAGE?) - Not Handled
+ -- -) ON SQL TRANSLATION PROFILE (???) - Not Handled
+ --
+ sql_txt := 'grant ' || buf2.privilege ||
+ ' on ' || case buf2.object_type when 'JAVA CLASS' then 'JAVA SOURCE "' || buf2.object_owner || '"."'
+ when 'JAVA SOURCE' then 'JAVA SOURCE "' || buf2.object_owner || '"."'
+ when 'JAVA RESOURCE' then 'JAVA RESOURCE "' || buf2.object_owner || '"."'
+ when 'EDITION' then 'EDITION "'
+ when 'USER' then 'USER "'
+ else '"' || buf2.object_owner || '"."'
+ end || buf2.object_name ||
+ '" to "' || buf1.username || '"';
+ -- "with hierarchy option" has not yet been implemented
+ if buf2.grantable = 'YES'
+ then
+ sql_txt := sql_txt || ' with grant option';
+ end if;
+ big_put_line(fh, buf2.object_owner || '"."' || buf2.object_name ||
+ ' Grant', sql_txt || ';'
+ ,common_util.MAX_SQL_LEN);
+ END LOOP;
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_usr;
+
+------------------------------------------------------------
+-- Create View Scripts
+procedure cr_vw
+is
+ POTYPE varchar2(100) := '';
+ OTYPE varchar2(100) := 'VIEW';
+ fh sf_ptr_type; -- object script file handle
+begin
+ for buf1 in (select obj.object_name VIEW_NAME
+ ,obj.object_name || '.' || obj.ext FILE_NAME
+ ,obj.install_timing
+ from obj_install_object_tab obj
+ left join dba_xml_tables xt
+ on xt.owner = obj.object_owner
+ and xt.table_name = obj.object_name
+ where obj.install_type = g_install_type
+ and obj.object_owner = g_schema_name
+ and obj.install_otype = OTYPE
+ -- Queue Table Views: Skip here and recreate with Advanced Queue
+ and not exists (select 'x' from dba_queue_tables qt
+ where qt.owner = g_schema_name
+ and ( obj.object_name = qt.queue_table
+ -- MUST be more discriminating than "tab.table_name like 'AQ$%' || qt.queue_table || '%'"
+ or regexp_like(obj.object_name,common_util.QUEUE_NAME_PREFIX_REGEXP ||
+ qt.queue_table ||
+ common_util.QUEUE_NAME_SUFFIX_REGEXP ) ) )
+ order by obj.object_name )
+ loop
+ fh := script_open(in_filename => buf1.file_name
+ ,in_otype => OTYPE
+ ,in_max_linesize => common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Create ' || g_schema_name || '.' || buf1.view_name || ' view');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- NOTE: Foreign keys are in a difference script');
+ script_put_line(fh, '-- Triggers are in a difference script');
+ script_put_line(fh, '--');
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define off');
+ script_put_line(fh, '');
+ if buf1.install_timing != 'CURRENT'
+ then
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Note: This is a "' || buf1.install_timing || '" View');
+ end if;
+ script_put_line(fh, '');
+ script_put_line(fh, '--');
+ script_put_line(fh, '-- Need to avoid errors granting permisions on a view that has errors');
+ script_put_line(fh, '-- Found this technique on Ask Tom');
+ script_put_line(fh, '-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987');
+ script_put_line(fh, 'create view "' || g_schema_name || '"."' || buf1.view_name || '"');
+ script_put_line(fh, ' as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;');
+ get_object_grants(fh, buf1.view_name, 'VIEW');
+ script_put_line(fh, '');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.view_name);
+ big_put_line(fh, g_schema_name || '.' || buf1.view_name || ' View'
+ ,COMMON_UTIL.vw_split_str
+ (COMMON_UTIL.escape_at_sign
+ (dbms_metadata.get_ddl
+ (object_type => 'VIEW'
+ ,name => buf1.view_name
+ ,schema => g_schema_name) ) )
+ ,common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, '-- Comments');
+ script_put_line(fh, '');
+ script_put_line(fh, '--DBMS_METADATA:' || g_schema_name ||
+ '.' || buf1.view_name);
+ BEGIN
+ big_put_line(fh, g_schema_name || '.' || buf1.view_name || ' View'
+ ,dbms_metadata.get_dependent_ddl(object_type => 'COMMENT'
+ ,base_object_name => buf1.view_name
+ ,base_object_schema => g_schema_name)
+ ,common_util.MAX_SQL_LEN);
+ EXCEPTION
+ WHEN DBMS_METADATA.object_not_found2
+ THEN
+ null;
+ END;
+ script_put_line(fh, '');
+ get_object_grants(fh, buf1.view_name, 'VIEW');
+ get_synonyms(fh, buf1.view_name, 'VIEW', common_util.MAX_SQL_LEN);
+ script_put_line(fh, '');
+ script_put_line(fh, 'set define on');
+ script_close(fh);
+ end loop;
+end cr_vw;
+
+
+------------------------------------------------------------
+--- Setup and Main Control ---
+------------------------------------------------------------
+
+
+------------------------------------------------------------
+-- Initialize this Package
+procedure initialize
+ (in_install_type in varchar2)
+is
+ -- Set the Installation Type
+ procedure set_install_type
+ is
+ l_notes type_conf.notes%type;
+ begin
+ if in_install_type in ('sys','pub')
+ then
+ raise_application_error (-20000, 'Install Type of "sys" or "pub" is not allowed: ' || in_install_type);
+ end if;
+ begin
+ select notes
+ into l_notes
+ from TYPE_CONF
+ where install_type = in_install_type;
+ exception when NO_DATA_FOUND then
+ raise_application_error (-20000, 'Invalid Install Type: ' || in_install_type);
+ end;
+ g_install_type := in_install_type;
+ dbms_output.put_line('g_install_type = ' || g_install_type || ', ' || l_notes);
+ end set_install_type;
+ --
+begin
+ script_close_all;
+ -- Set Globals
+ g_install_type := null;
+ g_schema_name := null;
+ set_install_type;
+ if sf_aa.EXISTS(g_install_type) then sf_aa(g_install_type).DELETE; end if;
+ -- Checks and Settings
+ COMMON_UTIL.check_filenames(g_install_type);
+ COMMON_UTIL.dbms_metadata_settings;
+end initialize;
+
+------------------------------------------------------------
+-- Set the Schema Name
+procedure set_schema_name
+ (in_schema_name in varchar2)
+is
+begin
+ g_schema_name := in_schema_name;
+ dbms_output.put_line('g_schema_name = ' || g_schema_name);
+end set_schema_name;
+
+------------------------------------------------------------
+-- Generate SYS/SYSTEM Installation Scripts
+procedure gen_installs
+is
+begin
+ ------------------------------------------------------------
+ set_schema_name('SYS');
+ cr_acl;
+ cr_dbtrg;
+ cr_rol;
+ cr_usr;
+ ------------------------------------------------------------
+ set_schema_name('SYSTEM');
+ cr_dir;
+ cr_grnt; -- Includes "FUTURE" Grants
+ cr_schtrg;
+ ------------------------------------------------------------
+ set_schema_name('PUBLIC');
+ cr_dblnk;
+ cr_syn;
+ ------------------------------------------------------------
+ set_schema_name('');
+ cr_install_master;
+ cr_install_sys;
+ cr_install_system;
+end gen_installs;
+
+------------------------------------------------------------
+-- Generate NON SYS/SYSTEM Installation Scripts
+procedure gen_schemas
+is
+ -- Loop through all scripts
+ procedure all_schema_scripts is
+ begin
+ cr_aq;
+ cr_aqt;
+ cr_cdl;
+ cr_common('FUNCTION' ,'Function' ); --cr_fnc;
+ cr_common('PACKAGE_BODY' ,'Package Body'); --cr_pkb;
+ cr_common('PACKAGE_SPEC' ,'Package' ); --cr_pks;
+ cr_common('PROCEDURE' ,'Procedure' ); --cr_prc;
+ cr_common('SCHEDULER_JOB' ,'Job' ); --cr_schdj;
+ cr_common('SCHEDULER_PROGRAM' ,'Program' ); --cr_schdp;
+ cr_common('SCHEDULER_SCHEDULE','Schedule' ); --cr_schds;
+ cr_common('SEQUENCE' ,'Sequence' ); --cr_seq;
+ cr_common('TYPE_BODY' ,'Type Body' ); --cr_tpb;
+ cr_common('TYPE_SPEC' ,'Type' ); --cr_tps;
+ cr_ctx;
+ cr_dblnk;
+ cr_fk('MVIEW_FOREIGN_KEY');
+ cr_fk('TABLE_FOREIGN_KEY');
+ cr_fk('VIEW_FOREIGN_KEY');
+ cr_ind('MVIEW_INDEX');
+ cr_ind('TABLE_INDEX');
+ cr_mvw;
+ cr_pjava;
+ cr_syn;
+ cr_tab;
+ cr_trg('MVIEW_TRIGGER');
+ cr_trg('TABLE_TRIGGER');
+ cr_trg('VIEW_TRIGGER');
+ cr_vw;
+ end all_schema_scripts;
+begin
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = g_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ set_schema_name(sch.object_owner);
+ all_schema_scripts;
+ end loop;
+ set_schema_name('');
+ cr_install_schemas;
+end gen_schemas;
+
+
+------------------------------------------------------------
+--- PUBLIC API ---
+------------------------------------------------------------
+
+
+------------------------------------------------------------
+-- Generate All Installation Scripts into the sf_aa array
+procedure all_scripts
+ (in_install_type in varchar2)
+is
+begin
+ dbms_output.put_line('Running ' || $$PLSQL_UNIT || '.all_scripts' ||
+ '(in_install_type "' || in_install_type || '")' );
+ initialize(in_install_type);
+ gen_installs;
+ gen_schemas;
+ script_close_all;
+end all_scripts;
+
+------------------------------------------------------------
+-- Write Scripts
+procedure write_scripts
+ (in_zip_file_name in varchar2
+ ,in_folder_name in varchar2 default '')
+is
+ FH_BUFFER_SIZE CONSTANT pls_integer := 32767;
+ fh UTL_FILE.FILE_TYPE;
+ fh_ptr pls_integer;
+ inst_type varchar2(10);
+ inst_ord pls_integer;
+ file_id pls_integer;
+ schema_name varchar2(128);
+ dir_path varchar2(256);
+ filename varchar2(500);
+ root_dir_name varchar2(128);
+ zip_file_size pls_integer;
+ sql_txt varchar2(4000);
+ root_dir_path varchar2(128);
+ buffer_blob BLOB;
+ zipped_blob BLOB;
+begin
+ dbms_output.put_line('Running ' || $$PLSQL_UNIT || '.write_scripts' ||
+ '(in_zip_file_name "' || in_zip_file_name ||
+ '", in_folder_name "' || in_folder_name || '")' );
+ if in_zip_file_name is null
+ then
+ raise_application_error(-20000, 'No Zip File Specified');
+ end if;
+ if NOT sf_aa.COUNT > 0
+ then
+ raise_application_error(-20000, 'No files to write from Buffers: ' || sf_aa.COUNT);
+ end if;
+ ----------------------------------------------
+ -- Write Scripts from sf_aa to ZIP_FILES Table
+ -- Install Type Loop
+ inst_type := sf_aa.FIRST;
+ <>
+ loop
+ -- Install Order Loop
+ inst_ord := sf_aa(inst_type).FIRST;
+ <>
+ loop
+ --
+ -- File ID Loop
+ file_id := sf_aa(inst_type)(inst_ord).FIRST;
+ <>
+ loop
+ --
+ schema_name := sf_aa(inst_type)(inst_ord)(file_id).schema_name;
+ dir_path := inst_type;
+ if schema_name is not null
+ then
+ dir_path := dir_path || '/' || schema_name;
+ end if;
+ filename := sf_aa(inst_type)(inst_ord)(file_id).filename;
+ if sf_aa(inst_type)(inst_ord)(file_id).is_open != 'N'
+ then
+ DBMS_OUTPUT.PUT_LINE('WARNING: ' || dir_path ||
+ '/' || filename || ' was not closed');
+ end if;
+ --
+ dbms_output.put(dir_path || '/' || filename ||
+ ' total_bytes: ' || sf_aa(inst_type)(inst_ord)(file_id).total_bytes);
+ DBMS_LOB.CREATETEMPORARY(buffer_blob, FALSE);
+ --
+ -- BUFFER_LOOP
+ for i in 1 .. sf_aa(inst_type)(inst_ord)(file_id).num_buffers
+ loop
+ DBMS_LOB.APPEND(buffer_blob
+ ,UTL_RAW.CAST_TO_RAW(sf_aa(inst_type)(inst_ord)(file_id).buffer_aa(i).buffer));
+ dbms_output.put(', ' || i || ':' || sf_aa(inst_type)(inst_ord)(file_id).buffer_aa(i).len);
+ end loop; --BUFFER_LOOP
+ dbms_output.put_line('.');
+ --
+ -- There should not be any leading "/" in "dir_path"
+ -- ("inst_type" cannot be NULL because Associative Array Indexes cannot be NULL)
+ zip_util_pkg.add_file(zipped_blob
+ ,dir_path || '/' || filename
+ ,buffer_blob);
+ DBMS_LOB.TRIM(buffer_blob, 0);
+ --
+ exit FILE_LOOP1 when file_id = sf_aa(inst_type)(inst_ord).LAST;
+ file_id := sf_aa(inst_type)(inst_ord).NEXT(file_id);
+ end loop; --FILE_LOOP1
+ --
+ exit ORD_LOOP1 when inst_ord = sf_aa(inst_type).LAST;
+ inst_ord := sf_aa(inst_type).NEXT(inst_ord);
+ end loop; --ORD_LOOP1
+ --
+ exit TYPE_LOOP1 when inst_type = sf_aa.LAST;
+ inst_type := sf_aa.NEXT(inst_type);
+ end loop; --TYPE_LOOP1
+ --
+ zip_util_pkg.finish_zip(zipped_blob);
+ insert into zip_files
+ (file_name
+ ,file_size
+ ,file_blob)
+ values
+ (in_zip_file_name
+ ,DBMS_LOB.GETLENGTH(zipped_blob)
+ ,zipped_blob);
+ commit;
+ if length(in_folder_name) > 0
+ then
+ ---------------------------------------
+ -- Write Zip File to UTL_FILE
+ begin
+ select dir.directory_name, dir.directory_path, zf.file_size
+ into root_dir_name , root_dir_path , zip_file_size
+ from dba_directories dir
+ join zip_files zf
+ on zf.file_name = in_zip_file_name
+ where dir.directory_path = in_folder_name;
+ exception when others then
+ raise_application_error(-20000,
+ 'Unable to find unique Oracle Directory Object with DIRECTORY_PATH: ' ||
+ in_folder_name || '. ' || SQLERRM);
+ DBMS_LOB.TRIM(zipped_blob, 0);
+ end;
+ dbms_output.put_line('Writing file "' || in_zip_file_name ||
+ '" to folder "' || root_dir_path || '"');
+ fh := utl_file.fopen(location => root_dir_name
+ ,filename => in_zip_file_name
+ ,open_mode => 'wb'
+ ,max_linesize => FH_BUFFER_SIZE);
+ fh_ptr := 1;
+ while fh_ptr <= zip_file_size
+ loop
+ utl_file.put_raw(fh, dbms_lob.substr(zipped_blob, FH_BUFFER_SIZE, fh_ptr), TRUE);
+ fh_ptr := fh_ptr + FH_BUFFER_SIZE;
+ end loop;
+ utl_file.fflush(fh);
+ utl_file.fclose(fh);
+ end if;
+ --
+ DBMS_LOB.TRIM(zipped_blob, 0);
+end write_scripts;
+
+------------------------------------------------------------
+-- Clear Buffers
+procedure clear_buffers
+ (in_install_type in varchar2 default null)
+is
+begin
+ if in_install_type is null
+ then
+ sf_aa.DELETE;
+ else
+ sf_aa(in_install_type).DELETE;
+ end if;
+end clear_buffers;
+
+------------------------------------------------------------
+-- Get Version
+function get_version
+ return varchar2
+is
+begin
+ return 'V2.1';
+end get_version;
+
+
+end grab_scripts;
+/
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pspec b/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pspec
new file mode 100644
index 0000000..3498c3c
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/GRAB_SCRIPTS.pspec
@@ -0,0 +1,214 @@
+
+--
+-- Create ODBCAPTURE.GRAB_SCRIPTS Package
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.GRAB_SCRIPTS
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "ODBCAPTURE"."GRAB_SCRIPTS"
+ authid current_user
+as
+
+ --Database Views:
+ -----------------
+
+ -- GRAB_SCRIPTS.cr_grnt
+ -- priv_system_privileges_view
+ -- priv_role_privileges_view
+ -- priv_queue_sysprivs_view
+ -- priv_obj_install_vw
+ -- priv_obj_queue_view
+ -- priv_obj_java_fg_view
+
+ -- zx_priv_all_view (_tab)
+ -- priv_queue_register_view
+ -- obj_install_object_view (_tab)
+ -- priv_queue_subscribe_view
+ -- obj_install_object_view (_tab)
+ -- priv_queue_sysprivs_view
+ -- aq_system_privs_vw
+ -- priv_obj_queue_view
+ -- obj_install_object_view (_tab)
+ -- priv_obj_java_fg_view
+ -- uor_install_view
+ -- priv_obj_dir_view
+ -- priv_obj_dir_dflt_vw
+ -- priv_obj_dir_nondflt_vw
+ -- priv_obj_xdbacl_view
+ -- priv_obj_xdbacl_dflt_vw
+ -- priv_obj_xdbacl_nondflt_vw
+ -- priv_obj_install_vw
+ -- obj_install_object_view (_tab)
+ -- priv_role_privileges_view
+ -- uor_install_view
+ -- priv_system_privileges_view
+ -- uor_install_view
+ -- priv_sysobj_privileges_view
+ -- uor_install_view
+
+ -- uor_install_view
+
+ -- schema_objects_vw (GRAB_SCRIPTS.schemas)
+ -- zx_obj_install_view (_tab)
+ -- obj_install_context_view
+ -- obj_install_index_view
+ -- obj_install_fkey_view
+ -- obj_install_trigger_view
+ -- obj_install_synonym_view
+ -- obj_install_object_view
+ -- data_load_install_view
+
+ -- obj_install_context_view
+ -- obj_install_context_dflt_vw
+ -- obj_install_object_view
+ -- dba_objects_view (_tab)
+ -- obj_install_context_nondflt_vw
+ -- obj_install_object_view
+ -- dba_objects_view (_tab)
+
+ -- obj_install_comments_view (_tab)
+ -- obj_install_object_view
+ -- uor_install_view
+
+ -- obj_install_index_view
+ -- obj_install_object_view
+ -- dba_objects_view (_tab)
+
+ -- obj_install_fkey_view
+ -- obj_install_object_view
+
+ -- obj_install_trigger_view
+ -- obj_install_object_view
+
+ -- obj_install_synonym_view
+ -- obj_install_synonym_dflt_vw
+ -- dba_objects_view (_tab)
+ -- obj_install_synonym_nondflt_vw
+ -- dba_objects_view (_tab)
+
+ -- obj_install_object_view
+ -- dba_dependencies_view (_tab)
+ -- obj_install_object_dflt_vw
+ -- dba_objects_view (_tab)
+ -- obj_install_object_nondflt_vw
+ -- dba_objects_view (_tab)
+
+ -- dba_objects_view (_tab)
+
+ --
+ -- DBA OBJECT TYPES
+ -- (https://renenyffenegger.ch/notes/development/databases/Oracle/installed/data-dictionary/objects/index)
+ --
+ -- CHAIN
+ -- CLUSTER
+ -- CONSUMER GROUP
+ -- CONTEXT
+ -- DATABASE LINK
+ -- DESTINATION
+ -- DIRECTORY
+ -- EDITION
+ -- EVALUATION CONTEXT
+ -- FUNCTION
+ -- INDEX
+ -- INDEX PARTITION
+ -- INDEX SUBPARTITION
+ -- INDEXTYPE
+ -- JOB
+ -- JOB CLASS
+ -- LIBRARY
+ -- LOB
+ -- LOB PARTITION
+ -- MATERIALIZED VIEW
+ -- OPERATOR
+ -- PACKAGE
+ -- PACKAGE BODY
+ -- PROCEDURE
+ -- PROGRAM
+ -- QUEUE
+ -- RESOURCE PLAN
+ -- RULE
+ -- RULE SET
+ -- SCHEDULE
+ -- SCHEDULER GROUP
+ -- SEQUENCE
+ -- SYNONYM
+ -- TABLE
+ -- TABLE PARTITION
+ -- TABLE SUBPARTITION
+ -- TRIGGER
+ -- TYPE
+ -- TYPE BODY
+ -- UNDEFINED
+ -- VIEW
+ -- WINDOW
+ -- XML SCHEMA
+
+ -- Script File Pointer (similar to a file handle)
+ TYPE sf_ptr_type is record
+ (inst_type varchar2(10)
+ ,inst_ord pls_integer
+ ,file_id pls_integer
+ ,num_lines pls_integer);
+
+ LF constant varchar2(1) := CHR(10);
+ CRTN constant varchar2(1) := CHR(13);
+
+ -- Buffer Records: One Line of Text in a Script/File
+ TYPE buffer_rec_type is record
+ (len number(5)
+ ,buffer varchar2(32767));
+ -- Associative Array of Script/File Lines
+ TYPE buffer_aa_type is table
+ of buffer_rec_type
+ index by pls_integer; -- Line Number
+ -- File Header Record
+ TYPE file_rec_type is record
+ (max_linesize number(5)
+ ,total_bytes number(14)
+ ,num_buffers number(9)
+ ,is_open varchar2(1)
+ ,schema_name varchar2(128)
+ ,filename varchar2(500)
+ ,buffer_aa buffer_aa_type);
+ -- Associative Array of Files
+ TYPE file_aa_type is table
+ of file_rec_type
+ index by pls_integer; -- File ID
+ -- Associative Array of Install Order
+ TYPE ord_aa_type is table
+ of file_aa_type
+ index by pls_integer; -- Install Order
+ -- Associative Array of Install Type
+ TYPE it_aa_type is table
+ of ord_aa_type
+ index by varchar2(10); -- Install Type
+ -- Associative Array of Script Files by Install Type, Install Order, File ID, and Buffers
+ sf_aa it_aa_type;
+
+ procedure all_scripts
+ (in_install_type in varchar2);
+
+ procedure write_scripts
+ (in_zip_file_name in varchar2
+ ,in_folder_name in varchar2 default '');
+
+ procedure clear_buffers
+ (in_install_type in varchar2 default null);
+
+ function get_version
+ return varchar2;
+
+end grab_scripts;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/INSTALL_TYPE_TIMING.tab b/grbsrc/ODBCAPTURE/INSTALL_TYPE_TIMING.tab
new file mode 100644
index 0000000..039180a
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/INSTALL_TYPE_TIMING.tab
@@ -0,0 +1,32 @@
+
+--
+-- Create ODBCAPTURE.INSTALL_TYPE_TIMING Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.INSTALL_TYPE_TIMING
+
+ CREATE TABLE "ODBCAPTURE"."INSTALL_TYPE_TIMING"
+ ( "FROM_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TIMING" CHAR(7 BYTE),
+ "TO_INSTALL_TYPE" VARCHAR2(10 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.INSTALL_TYPE_TIMING
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJECT_CONF.cdl b/grbsrc/ODBCAPTURE/OBJECT_CONF.cdl
new file mode 100644
index 0000000..c5824e4
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJECT_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.OBJECT_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'OBJECT_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'OBJECT_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."OBJECT_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/OBJECT_CONF.ctl data=ODBCAPTURE/OBJECT_CONF.csv log=ODBCAPTURE/OBJECT_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/OBJECT_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/grbsrc/ODBCAPTURE/OBJECT_CONF.csv b/grbsrc/ODBCAPTURE/OBJECT_CONF.csv
new file mode 100644
index 0000000..1bc51be
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJECT_CONF.csv
@@ -0,0 +1 @@
+"USERNAME","INSTALL_OTYPE","INSTALL_TYPE","ONAME_FILTER","NOTES"
diff --git a/grbsrc/ODBCAPTURE/OBJECT_CONF.ctl b/grbsrc/ODBCAPTURE/OBJECT_CONF.ctl
new file mode 100644
index 0000000..de6f208
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJECT_CONF.ctl
@@ -0,0 +1,11 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."OBJECT_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,INSTALL_OTYPE CHAR(20)
+ ,INSTALL_TYPE CHAR(10)
+ ,ONAME_FILTER CHAR(4000)
+ ,NOTES CHAR(1024)
+ )
diff --git a/grbsrc/ODBCAPTURE/OBJECT_CONF.tab b/grbsrc/ODBCAPTURE/OBJECT_CONF.tab
new file mode 100644
index 0000000..a4bc44c
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJECT_CONF.tab
@@ -0,0 +1,46 @@
+
+--
+-- Create ODBCAPTURE.OBJECT_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJECT_CONF
+
+ CREATE TABLE "ODBCAPTURE"."OBJECT_CONF"
+ ( "USERNAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
+ "INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "ONAME_FILTER" VARCHAR2(4000 BYTE) NOT NULL ENABLE,
+ "NOTES" VARCHAR2(1024 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."OBJECT_CONF" ADD CONSTRAINT "OBJECT_CONF_PK" PRIMARY KEY ("USERNAME", "INSTALL_OTYPE", "INSTALL_TYPE")
+ USING INDEX ENABLE;
+ALTER TABLE "ODBCAPTURE"."OBJECT_CONF" ADD CONSTRAINT "OBJECT_CONF_CK1" CHECK (
+ install_otype not in ('ROLE','USER','GRANT','QUEUE_TABLE','DATA_LOAD','TABLE_FOREIGN_KEY','VIEW_FOREIGN_KEY','MVIEW_FOREIGN_KEY')
+ ) ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJECT_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."OBJECT_CONF"."USERNAME" IS 'Name of the database schema (Primary Key Column 1). Value must be in SCHEMA_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."OBJECT_CONF"."INSTALL_OTYPE" IS 'Name of the object type (Primary Key Column 2). Value must be in OTYPE_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."OBJECT_CONF"."INSTALL_TYPE" IS 'Name of the install type (Primary Key Column 3). Value must be in TYPE_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."OBJECT_CONF"."ONAME_FILTER" IS 'Where clause of the selected object type to capture (Required). $$ONAME$$ is replaced with the name of the databsae object.';
+ COMMENT ON COLUMN "ODBCAPTURE"."OBJECT_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON TABLE "ODBCAPTURE"."OBJECT_CONF" IS 'Object name filter for each object type in a schema for an install type.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJECT_CONF.tabfk b/grbsrc/ODBCAPTURE/OBJECT_CONF.tabfk
new file mode 100644
index 0000000..f4e5b2a
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJECT_CONF.tabfk
@@ -0,0 +1,30 @@
+
+--
+-- Create Foreign Keys for ODBCAPTURE.OBJECT_CONF TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.OBJECT_CONF_FK1
+
+ ALTER TABLE "ODBCAPTURE"."OBJECT_CONF" ADD CONSTRAINT "OBJECT_CONF_FK1" FOREIGN KEY ("USERNAME")
+ REFERENCES "ODBCAPTURE"."SCHEMA_CONF" ("USERNAME") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.OBJECT_CONF_FK2
+
+ ALTER TABLE "ODBCAPTURE"."OBJECT_CONF" ADD CONSTRAINT "OBJECT_CONF_FK2" FOREIGN KEY ("INSTALL_OTYPE")
+ REFERENCES "ODBCAPTURE"."OTYPE_CONF" ("INSTALL_OTYPE") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.OBJECT_CONF_FK3
+
+ ALTER TABLE "ODBCAPTURE"."OBJECT_CONF" ADD CONSTRAINT "OBJECT_CONF_FK3" FOREIGN KEY ("INSTALL_TYPE")
+ REFERENCES "ODBCAPTURE"."TYPE_CONF" ("INSTALL_TYPE") ENABLE;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab
new file mode 100644
index 0000000..d97f0c3
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab
@@ -0,0 +1,38 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_COMMENTS_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_COMMENTS_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_COMMENTS_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TABLE_OWNER" VARCHAR2(128 BYTE),
+ "TABLE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TABLE_NAME" VARCHAR2(128 BYTE),
+ "TABLE_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "COLUMN_NAME" VARCHAR2(128 BYTE),
+ "COMMENTS" VARCHAR2(4000 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_COMMENTS_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind
new file mode 100644
index 0000000..ba3bbbf
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_COMMENTS_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_COMMENTS_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_COMMENTS_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_COMMENTS_TAB" ("INSTALL_TYPE", "TABLE_OWNER", "TABLE_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw
new file mode 100644
index 0000000..ce93d84
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw
@@ -0,0 +1,73 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_COMMENTS_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_COMMENTS_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_COMMENTS_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_COMMENTS_VIEW" ("INSTALL_TYPE", "OBJECT_OWNER_INSTALL_TYPE", "TABLE_OWNER", "TABLE_INSTALL_TYPE", "TABLE_NAME", "TABLE_TYPE", "INSTALL_OTYPE", "COLUMN_NAME", "COMMENTS") AS
+ select d.install_type
+ ,d.object_owner_install_type
+ ,c.owner TABLE_OWNER
+ ,d.object_install_type TABLE_INSTALL_TYPE
+ ,c.table_name
+ ,d.object_type TABLE_TYPE
+ ,d.install_otype
+ ,c.column_name
+ ,c.comments
+ from obj_install_object_view d
+ join dba_col_comments c
+ on c.owner = d.object_owner
+ and c.table_name = d.object_name
+ and c.comments is not null
+ where d.object_type in ('TABLE','VIEW','MATERIALIZED VIEW')
+ -- Don't need comments on sys or pub
+ and d.object_install_type not in ('sys','pub')
+UNION ALL
+select d.install_type
+ ,d.object_owner_install_type
+ ,c.owner TABLE_OWNER
+ ,d.object_install_type TABLE_INSTALL_TYPE
+ ,c.table_name
+ ,c.table_type
+ ,d.install_otype
+ ,NULL COLUMN_NAME
+ ,c.comments
+ from obj_install_object_view d
+ join dba_tab_comments c
+ on c.owner = d.object_owner
+ and c.table_name = d.object_name
+ and c.table_type = d.object_type
+ and c.comments is not null
+ -- Don't need comments on sys or pub
+ where d.object_install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_COMMENTS_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab
new file mode 100644
index 0000000..5c38793
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab
@@ -0,0 +1,46 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_CONTEXT_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_CONTEXT_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_CONTEXT_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TIMING" CHAR(7 BYTE),
+ "CONTEXT_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "CONTEXT_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "CONTEXT_OWNER" VARCHAR2(128 BYTE),
+ "CONTEXT_NAME" VARCHAR2(128 BYTE),
+ "CONTEXT_TYPE" VARCHAR2(22 BYTE),
+ "TRACKING" VARCHAR2(3 BYTE),
+ "PACKAGE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "PACKAGE_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "PACKAGE_OWNER" VARCHAR2(128 BYTE),
+ "PACKAGE_NAME" VARCHAR2(128 BYTE),
+ "PACKAGE_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "EXT" VARCHAR2(6 BYTE),
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_CONTEXT_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind
new file mode 100644
index 0000000..709eb42
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_CONTEXT_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_CONTEXT_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_CONTEXT_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_CONTEXT_TAB" ("INSTALL_TYPE", "CONTEXT_OWNER", "CONTEXT_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw
new file mode 100644
index 0000000..0351cda
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw
@@ -0,0 +1,69 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_CONTEXT_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_CONTEXT_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_CONTEXT_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_CONTEXT_VIEW" ("INSTALL_TYPE", "INSTALL_TIMING", "CONTEXT_INSTALL_TYPE", "CONTEXT_ONAME_FILTER", "CONTEXT_OWNER", "CONTEXT_NAME", "CONTEXT_TYPE", "TRACKING", "PACKAGE_INSTALL_TYPE", "PACKAGE_ONAME_FILTER", "PACKAGE_OWNER", "PACKAGE_NAME", "PACKAGE_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select obj.install_type
+ ,t.install_timing
+ ,obj.install_type CONTEXT_INSTALL_TYPE
+ ,obj.oname_filter CONTEXT_ONAME_FILTER
+ ,obj.object_owner CONTEXT_OWNER
+ ,ctx.namespace CONTEXT_NAME
+ ,ctx.type CONTEXT_TYPE
+ ,ctx.tracking
+ ,pkg.install_type PACKAGE_INSTALL_TYPE
+ ,pkg.oname_filter PACKAGE_ONAME_FILTER
+ ,pkg.object_owner PACKAGE_OWNER
+ ,pkg.object_name PACKAGE_NAME
+ ,pkg.object_type PACKAGE_TYPE
+ ,obj.install_otype
+ ,obj.ext
+ ,obj.ext2
+ ,obj.ext3
+ from obj_install_object_tab obj
+ join dba_context ctx
+ on ctx.namespace = obj.object_name
+ join obj_install_object_tab pkg
+ on pkg.object_owner = ctx.schema
+ and pkg.object_name = ctx.package
+ and pkg.object_type = 'PACKAGE'
+ join install_type_timing t
+ -- Ensure the package is installed before this Context
+ on t.from_install_type = obj.install_type
+ and t.to_install_type = pkg.install_type
+ where obj.object_owner = 'SYS'
+ and obj.object_type = 'CONTEXT'
+ and ctx.namespace not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_CONTEXT_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab
new file mode 100644
index 0000000..a3362ef
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab
@@ -0,0 +1,45 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_DATA_LOAD_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "INSTALL_TIMING" CHAR(7 BYTE),
+ "TABLE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TABLE_INSTALL_TIMING" CHAR(7 BYTE),
+ "TABLE_OWNER" VARCHAR2(128 BYTE),
+ "TABLE_NAME" VARCHAR2(128 BYTE),
+ "TABLE_TYPE" VARCHAR2(23 BYTE),
+ "BEFORE_SELECT_SQL" VARCHAR2(4000 BYTE),
+ "WHERE_CLAUSE" VARCHAR2(4000 BYTE),
+ "ORDER_BY_COLUMNS" VARCHAR2(4000 BYTE) NOT NULL ENABLE,
+ "AFTER_ORDER_BY_SQL" VARCHAR2(4000 BYTE),
+ "NOTES" VARCHAR2(1024 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
+ "EXT" VARCHAR2(6 BYTE) NOT NULL ENABLE,
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind
new file mode 100644
index 0000000..50c367d
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_DATA_LOAD_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_DATA_LOAD_TAB" ("INSTALL_TYPE", "TABLE_OWNER", "TABLE_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw
new file mode 100644
index 0000000..263bb01
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw
@@ -0,0 +1,66 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_DATA_LOAD_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_DATA_LOAD_VIEW" ("INSTALL_TYPE", "INSTALL_TIMING", "TABLE_INSTALL_TYPE", "TABLE_INSTALL_TIMING", "TABLE_OWNER", "TABLE_NAME", "TABLE_TYPE", "BEFORE_SELECT_SQL", "WHERE_CLAUSE", "ORDER_BY_COLUMNS", "AFTER_ORDER_BY_SQL", "NOTES", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select dlc.install_type
+ ,t.install_timing
+ ,tab.install_type TABLE_INSTALL_TYPE
+ ,tab.install_timing TABLE_INSTALL_TIMING
+ ,tab.object_owner TABLE_OWNER
+ ,tab.object_name TABLE_NAME
+ ,tab.object_type TABLE_TYPE
+ ,dlc.before_select_sql
+ ,dlc.where_clause
+ ,dlc.order_by_columns
+ ,dlc.after_order_by_sql
+ ,dlc.notes
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from obj_install_object_tab tab
+ join dload_conf dlc
+ on dlc.username = tab.object_owner
+ and dlc.table_name = tab.object_name
+ join otype_conf otc
+ on otc.install_otype = 'DATA_LOAD'
+ join install_type_timing t
+ -- Ensure the Table is installed before this Data Load
+ on t.from_install_type = dlc.install_type
+ and t.to_install_type = tab.install_type
+ -- Exclude 'sys' or 'pub' database objects
+ where tab.object_install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_DATA_LOAD_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab
new file mode 100644
index 0000000..90bde8e
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab
@@ -0,0 +1,48 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_FKEY_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_FKEY_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_FKEY_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TYPE_SELECTOR" VARCHAR2(20 BYTE),
+ "BASE_TABLE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "BASE_TABLE_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "BASE_TABLE_OWNER" VARCHAR2(128 BYTE),
+ "BASE_TABLE_NAME" VARCHAR2(128 BYTE),
+ "BASE_TABLE_TYPE" VARCHAR2(23 BYTE),
+ "FOREIGN_KEY_NAME" VARCHAR2(128 BYTE),
+ "UNIQUE_KEY_NAME" VARCHAR2(128 BYTE),
+ "UNIQUE_KEY_TYPE" VARCHAR2(1 BYTE),
+ "REF_TABLE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "REF_TABLE_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "REF_TABLE_OWNER" VARCHAR2(128 BYTE),
+ "REF_TABLE_NAME" VARCHAR2(128 BYTE),
+ "REF_TABLE_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
+ "EXT" VARCHAR2(6 BYTE) NOT NULL ENABLE,
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_FKEY_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind
new file mode 100644
index 0000000..b26643a
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_FKEY_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_FKEY_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_FKEY_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_FKEY_TAB" ("INSTALL_TYPE", "BASE_TABLE_OWNER", "FOREIGN_KEY_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw
new file mode 100644
index 0000000..1f39ebf
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw
@@ -0,0 +1,90 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_FKEY_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_FKEY_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_FKEY_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_FKEY_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "BASE_TABLE_INSTALL_TYPE", "BASE_TABLE_ONAME_FILTER", "BASE_TABLE_OWNER", "BASE_TABLE_NAME", "BASE_TABLE_TYPE", "FOREIGN_KEY_NAME", "UNIQUE_KEY_NAME", "UNIQUE_KEY_TYPE", "REF_TABLE_INSTALL_TYPE", "REF_TABLE_ONAME_FILTER", "REF_TABLE_OWNER", "REF_TABLE_NAME", "REF_TABLE_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then base_t.install_type
+ else ref_t.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'BASE TABLE'
+ else 'REF TABLE'
+ end INSTALL_TYPE_SELECTOR
+ ,base_t.install_type BASE_TABLE_INSTALL_TYPE
+ ,base_t.oname_filter BASE_TABLE_ONAME_FILTER
+ ,base_t.object_owner BASE_TABLE_OWNER
+ ,base_t.object_name BASE_TABLE_NAME
+ ,base_t.object_type BASE_TABLE_TYPE
+ ,fk.constraint_name FOREIGN_KEY_NAME
+ ,pk.constraint_name UNIQUE_KEY_NAME
+ ,pk.constraint_type UNIQUE_KEY_TYPE
+ ,ref_t.install_type REF_TABLE_INSTALL_TYPE
+ ,ref_t.oname_filter REF_TABLE_ONAME_FILTER
+ ,ref_t.object_owner REF_TABLE_OWNER
+ ,ref_t.object_name REF_TABLE_NAME
+ ,ref_t.object_type REF_TABLE_TYPE
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from obj_install_object_tab base_t
+ join otype_conf otc
+ on otc.install_otype = case when base_t.object_type = 'MATERIALIZED VIEW'
+ then 'MVIEW_FOREIGN_KEY'
+ else base_t.object_type || '_FOREIGN_KEY'
+ end
+ join dba_constraints fk
+ on fk.owner = base_t.object_owner
+ and fk.table_name = base_t.object_name
+ and fk.constraint_type = 'R'
+ join dba_constraints pk
+ on pk.owner = fk.r_owner
+ and pk.constraint_name = fk.r_constraint_name
+ and pk.constraint_type in ('P','U')
+ join obj_install_object_tab ref_t
+ on ref_t.object_owner = pk.owner
+ and ref_t.object_name = pk.table_name
+ and ref_t.object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW')
+ join install_type_timing t
+ -- Ensure the Ref Table is installed before this Foreign Key
+ on t.from_install_type = base_t.install_type
+ and t.to_install_type = ref_t.install_type
+ where base_t.object_type in ('MATERIALIZED VIEW', 'TABLE', 'VIEW')
+ and base_t.object_install_type not in ('sys','pub') -- Exclude 'sys' or 'pub' database objects
+ and fk.constraint_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_FKEY_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab
new file mode 100644
index 0000000..9eac117
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab
@@ -0,0 +1,47 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_INDEX_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_INDEX_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_INDEX_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TYPE_SELECTOR" VARCHAR2(20 BYTE),
+ "INDEX_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INDEX_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "INDEX_OWNER" VARCHAR2(128 BYTE),
+ "INDEX_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(23 BYTE),
+ "INDEX_TYPE" VARCHAR2(27 BYTE),
+ "UNIQUENESS" VARCHAR2(9 BYTE),
+ "TABLE_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TARGET_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "TABLE_OWNER" VARCHAR2(128 BYTE),
+ "TABLE_NAME" VARCHAR2(128 BYTE),
+ "TABLE_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "EXT" VARCHAR2(6 BYTE),
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_INDEX_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind
new file mode 100644
index 0000000..f0a72fa
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_INDEX_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_INDEX_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_INDEX_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_INDEX_TAB" ("INSTALL_TYPE", "TABLE_OWNER", "TABLE_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw
new file mode 100644
index 0000000..d491a73
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw
@@ -0,0 +1,79 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_INDEX_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_INDEX_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_INDEX_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_INDEX_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "INDEX_INSTALL_TYPE", "INDEX_ONAME_FILTER", "INDEX_OWNER", "INDEX_NAME", "OBJECT_TYPE", "INDEX_TYPE", "UNIQUENESS", "TABLE_INSTALL_TYPE", "TARGET_ONAME_FILTER", "TABLE_OWNER", "TABLE_NAME", "TABLE_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then obj.install_type
+ else tgt.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'INDEX'
+ else 'TARGET'
+ end INSTALL_TYPE_SELECTOR
+ ,obj.install_type INDEX_INSTALL_TYPE
+ ,obj.oname_filter INDEX_ONAME_FILTER
+ ,obj.object_owner INDEX_OWNER
+ ,obj.object_name INDEX_NAME
+ ,obj.object_type
+ ,ind.index_type
+ ,ind.uniqueness
+ ,tgt.install_type TABLE_INSTALL_TYPE
+ ,tgt.oname_filter TARGET_ONAME_FILTER
+ ,tgt.object_owner TABLE_OWNER
+ ,tgt.object_name TABLE_NAME
+ ,tgt.object_type TABLE_TYPE
+ ,obj.install_otype
+ ,obj.ext
+ ,obj.ext2
+ ,obj.ext3
+ from obj_install_object_tab obj
+ join dba_indexes ind
+ on ind.owner = obj.object_owner
+ and ind.index_name = obj.object_name
+ join obj_install_object_tab tgt
+ on tgt.object_owner = ind.table_owner
+ and tgt.object_name = ind.table_name
+ and tgt.object_type = ind.table_type
+ join install_type_timing t
+ -- Ensure Target Table is installed before this Index
+ on t.from_install_type = obj.install_type
+ and t.to_install_type = tgt.install_type
+ where obj.object_type = 'INDEX'
+ and obj.object_install_type not in ('sys','pub') -- Exclude 'sys' and 'pub' Index Schemas
+ and ind.index_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_INDEX_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab
new file mode 100644
index 0000000..af49dfd
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab
@@ -0,0 +1,41 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_OBJECT_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_OBJECT_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_OBJECT_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TIMING" CHAR(7 BYTE),
+ "ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "OBJECT_OWNER_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_OWNER" VARCHAR2(128 BYTE),
+ "OBJECT_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "EXT" VARCHAR2(6 BYTE),
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_OBJECT_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind
new file mode 100644
index 0000000..fb92844
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_OBJECT_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_OBJECT_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_OBJECT_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_OBJECT_TAB" ("INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw
new file mode 100644
index 0000000..a319efd
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw
@@ -0,0 +1,149 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_OBJECT_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_OBJECT_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_OBJECT_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_OBJECT_VIEW" ("INSTALL_TYPE", "INSTALL_TIMING", "ONAME_FILTER", "OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_INSTALL_TYPE", "OBJECT_NAME", "OBJECT_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ with q_nondflt as (
+ select oc.install_type
+ ,t.install_timing
+ ,oc.oname_filter
+ ,obj.object_owner_install_type
+ ,obj.object_owner
+ ,oc.install_type OBJECT_INSTALL_TYPE
+ ,obj.object_name
+ ,obj.object_type
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from dba_objects_tab obj
+ join otype_conf otc
+ on otc.object_type = obj.object_type
+ and ( otc.object_type != 'INDEX'
+ or otc.install_otype = (select case ind.table_type
+ when 'MATERIALIZED VIEW' then 'MVIEW'
+ else ind.table_type
+ end || '_INDEX'
+ from dba_indexes ind
+ where ind.owner = obj.object_owner
+ and ind.index_name = obj.object_name) )
+ and ( otc.object_type != 'TRIGGER'
+ or otc.install_otype = (select case trg.base_object_type
+ when 'MATERIALIZED VIEW' then 'MVIEW'
+ else trg.base_object_type
+ end || '_TRIGGER'
+ from dba_triggers trg
+ where trg.owner = obj.object_owner
+ and trg.trigger_name = obj.object_name) )
+ join object_conf oc
+ on oc.username = obj.object_owner
+ and oc.install_type != obj.object_owner_install_type
+ and oc.install_otype = otc.install_otype
+ and regexp_like(obj.object_name, oc.oname_filter)
+ join install_type_timing t
+ -- Ensure the owner is installed before this object
+ on t.from_install_type = oc.install_type
+ and t.to_install_type = obj.object_owner_install_type
+ where ( obj.table_flag != 'NT' -- Nested Tables masquarade as tables in DBA_OBJECTS
+ OR obj.table_flag is NULL)
+ and obj.object_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+), q_dflt as (
+ select obj.object_owner_install_type INSTALL_TYPE
+ ,'CURRENT' INSTALL_TIMING
+ ,NULL ONAME_FILTER
+ ,obj.object_owner_install_type
+ ,obj.object_owner
+ ,obj.object_owner_install_type OBJECT_INSTALL_TYPE
+ ,obj.object_name
+ ,obj.object_type
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from dba_objects_tab obj
+ join otype_conf otc
+ on otc.object_type = obj.object_type
+ and ( otc.object_type != 'INDEX'
+ or otc.install_otype = (select case ind.table_type
+ when 'MATERIALIZED VIEW' then 'MVIEW'
+ else ind.table_type
+ end || '_INDEX'
+ from dba_indexes ind
+ where ind.owner = obj.object_owner
+ and ind.index_name = obj.object_name) )
+ and ( otc.object_type != 'TRIGGER'
+ or otc.install_otype = (select case trg.base_object_type
+ when 'MATERIALIZED VIEW' then 'MVIEW'
+ else trg.base_object_type
+ end || '_TRIGGER'
+ from dba_triggers trg
+ where trg.owner = obj.object_owner
+ and trg.trigger_name = obj.object_name) )
+ where ( obj.table_flag != 'NT' -- Nested Tables masquarade as tables in DBA_OBJECTS
+ OR obj.table_flag is NULL)
+ and (obj.object_owner, obj.object_type, obj.object_name) not in (
+ select q_nondflt.object_owner, q_nondflt.object_type, q_nondflt.object_name from q_nondflt)
+ and obj.object_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+), q_sys as (
+ select oc.install_type
+ ,'CURRENT' INSTALL_TIMING
+ ,oc.oname_filter
+ ,oc.install_type OBJECT_OWNER_INSTALL_TYPE
+ ,obj.object_owner
+ ,oc.install_type OBJECT_INSTALL_TYPE
+ ,obj.object_name
+ ,obj.object_type
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from dba_objects_tab obj
+ join otype_conf otc
+ on otc.object_type = obj.object_type
+ join object_conf oc
+ on oc.username = obj.object_owner
+ and oc.install_type != obj.object_owner_install_type
+ and oc.install_otype = otc.install_otype
+ and regexp_like(obj.object_name, oc.oname_filter)
+ where obj.object_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+ and obj.object_owner = 'SYS'
+ and obj.object_type in ('CONTEXT', 'DIRECTORY')
+)
+select "INSTALL_TYPE","INSTALL_TIMING","ONAME_FILTER","OBJECT_OWNER_INSTALL_TYPE","OBJECT_OWNER","OBJECT_INSTALL_TYPE","OBJECT_NAME","OBJECT_TYPE","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_nondflt
+UNION ALL
+select "INSTALL_TYPE","INSTALL_TIMING","ONAME_FILTER","OBJECT_OWNER_INSTALL_TYPE","OBJECT_OWNER","OBJECT_INSTALL_TYPE","OBJECT_NAME","OBJECT_TYPE","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_dflt
+UNION ALL
+select "INSTALL_TYPE","INSTALL_TIMING","ONAME_FILTER","OBJECT_OWNER_INSTALL_TYPE","OBJECT_OWNER","OBJECT_INSTALL_TYPE","OBJECT_NAME","OBJECT_TYPE","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_sys;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_OBJECT_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab
new file mode 100644
index 0000000..43c0c93
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab
@@ -0,0 +1,46 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TYPE_SELECTOR" VARCHAR2(20 BYTE),
+ "SYNONYM_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "SYNONYM_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "SYNONYM_OWNER" VARCHAR2(128 BYTE),
+ "SYNONYM_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" CHAR(7 BYTE),
+ "DB_LINK" VARCHAR2(128 BYTE),
+ "TARGET_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TARGET_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "TARGET_OWNER" VARCHAR2(128 BYTE),
+ "TARGET_NAME" VARCHAR2(128 BYTE),
+ "TARGET_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "EXT" VARCHAR2(6 BYTE),
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind
new file mode 100644
index 0000000..71567ad
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind
@@ -0,0 +1,23 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_TAB" ("INSTALL_TYPE", "SYNONYM_OWNER", "SYNONYM_NAME")
+ ;
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_TAB_IX2
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_TAB_IX2" ON "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_TAB" ("INSTALL_TYPE", "TARGET_OWNER", "TARGET_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw
new file mode 100644
index 0000000..8898e1c
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw
@@ -0,0 +1,80 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_SYNONYM_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_SYNONYM_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "SYNONYM_INSTALL_TYPE", "SYNONYM_ONAME_FILTER", "SYNONYM_OWNER", "SYNONYM_NAME", "OBJECT_TYPE", "DB_LINK", "TARGET_INSTALL_TYPE", "TARGET_ONAME_FILTER", "TARGET_OWNER", "TARGET_NAME", "TARGET_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then tgt.install_type
+ else obj.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'SYNONYM'
+ else 'TARGET'
+ end INSTALL_TYPE_SELECTOR
+ ,obj.install_type SYNONYM_INSTALL_TYPE
+ ,obj.oname_filter SYNONYM_ONAME_FILTER
+ ,obj.object_owner SYNONYM_OWNER
+ ,obj.object_name SYNONYM_NAME
+ ,'SYNONYM' OBJECT_TYPE
+ ,syn.db_link
+ ,tgt.install_type TARGET_INSTALL_TYPE
+ ,tgt.oname_filter TARGET_ONAME_FILTER
+ ,tgt.object_owner TARGET_OWNER
+ ,tgt.object_name TARGET_NAME
+ ,tgt.object_type TARGET_TYPE
+ ,obj.install_otype
+ ,obj.ext
+ ,obj.ext2
+ ,obj.ext3
+ from obj_install_object_tab obj
+ join sys.dba_synonyms syn
+ on syn.owner = obj.object_owner
+ and syn.synonym_name = obj.object_name
+ join obj_install_object_tab tgt
+ on tgt.object_owner = syn.table_owner
+ and tgt.object_name = syn.table_name
+ and tgt.object_type in ('FUNCTION', 'OPERATOR', 'PACKAGE', 'PROCEDURE',
+ 'SEQUENCE', 'SYNONYM', 'TABLE', 'TYPE', 'VIEW',
+ 'MATERIALIZED VIEW', 'JAVA SOURCE', 'QUEUE')
+ join install_type_timing t
+ -- Ensure the Target is installed before this Synonym
+ on t.from_install_type = tgt.install_type
+ and t.to_install_type = obj.install_type
+ where obj.object_type = 'SYNONYM'
+ and obj.object_owner_install_type not in ('sys') -- Exclude 'sys' Synonyms
+ and syn.synonym_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_SYNONYM_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab
new file mode 100644
index 0000000..7d24e76
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab
@@ -0,0 +1,45 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB
+
+ CREATE TABLE "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TYPE_SELECTOR" VARCHAR2(20 BYTE),
+ "TRIGGER_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TRIGGER_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "TRIGGER_OWNER" VARCHAR2(128 BYTE),
+ "TRIGGER_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(23 BYTE),
+ "TARGET_INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "TARGET_ONAME_FILTER" VARCHAR2(4000 BYTE),
+ "TARGET_OWNER" VARCHAR2(128 BYTE),
+ "TARGET_NAME" VARCHAR2(128 BYTE),
+ "TARGET_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "EXT" VARCHAR2(6 BYTE),
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind
new file mode 100644
index 0000000..9697933
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind
@@ -0,0 +1,23 @@
+
+--
+-- Create Indexes for ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_TAB_IX1" ON "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_TAB" ("INSTALL_TYPE", "TRIGGER_OWNER", "TRIGGER_NAME")
+ ;
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_TAB_IX2
+
+ CREATE INDEX "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_TAB_IX2" ON "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_TAB" ("INSTALL_TYPE", "TARGET_OWNER", "TARGET_NAME")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw
new file mode 100644
index 0000000..0d0a637
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw
@@ -0,0 +1,81 @@
+
+--
+-- Create ODBCAPTURE.OBJ_INSTALL_TRIGGER_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."OBJ_INSTALL_TRIGGER_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "TRIGGER_INSTALL_TYPE", "TRIGGER_ONAME_FILTER", "TRIGGER_OWNER", "TRIGGER_NAME", "OBJECT_TYPE", "TARGET_INSTALL_TYPE", "TARGET_ONAME_FILTER", "TARGET_OWNER", "TARGET_NAME", "TARGET_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then obj.install_type
+ else tab.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'TRIGGER'
+ else 'TARGET'
+ end INSTALL_TYPE_SELECTOR
+ ,obj.install_type TRIGGER_INSTALL_TYPE
+ ,obj.oname_filter TRIGGER_ONAME_FILTER
+ ,obj.object_owner TRIGGER_OWNER
+ ,obj.object_name TRIGGER_NAME
+ ,obj.object_type
+ ,tab.install_type TARGET_INSTALL_TYPE
+ ,tab.oname_filter TARGET_ONAME_FILTER
+ ,tab.object_owner TARGET_OWNER
+ ,tab.object_name TARGET_NAME
+ ,tab.object_type TARGET_TYPE
+ ,obj.install_otype
+ ,obj.ext
+ ,obj.ext2
+ ,obj.ext3
+ from obj_install_object_tab obj
+ join dba_triggers trig
+ on trig.owner = obj.object_owner
+ and trig.trigger_name = obj.object_name
+ join obj_install_object_tab tab
+ on tab.object_owner = trig.table_owner
+ and tab.object_name = trig.table_name
+ and tab.object_type = trig.base_object_type -- Eliminates SYSTEM Triggers
+ and tab.install_type not in ('sys','pub') -- Exclude 'sys' or 'pub' base tables
+ join install_type_timing t
+ -- Ensure the Table is installed before this Trigger
+ on t.from_install_type = obj.install_type
+ and t.to_install_type = tab.install_type
+ where obj.object_type = 'TRIGGER'
+ and obj.install_otype = case when trig.base_object_type = 'MATERIALIZED VIEW' then 'MVIEW_TRIGGER'
+ else trig.base_object_type || '_TRIGGER'
+ end
+ and obj.object_install_type not in ('sys','pub') -- Exclude 'sys' or 'pub' database objects
+ and obj.object_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OBJ_INSTALL_TRIGGER_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/OTYPE_CONF.cdl b/grbsrc/ODBCAPTURE/OTYPE_CONF.cdl
new file mode 100644
index 0000000..f3ca199
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OTYPE_CONF.cdl
@@ -0,0 +1,58 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.OTYPE_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'OTYPE_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'OTYPE_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."OTYPE_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/OTYPE_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/OTYPE_CONF.ctl data=ODBCAPTURE/OTYPE_CONF.csv log=ODBCAPTURE/OTYPE_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/OTYPE_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
diff --git a/grbsrc/ODBCAPTURE/OTYPE_CONF.csv b/grbsrc/ODBCAPTURE/OTYPE_CONF.csv
new file mode 100644
index 0000000..d19552b
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OTYPE_CONF.csv
@@ -0,0 +1,36 @@
+"INSTALL_OTYPE","INSTALL_ORDER","EXT","EXT2","EXT3","NAME_CHECK_OTYPE","NOTES","OBJECT_TYPE"
+"CONTEXT",710,"ctx",,,"CONTEXT","SYSTEM Only (Don't match OBJECT_TYPE)","CONTEXT"
+"DATABASE_TRIGGER",-110,"dbtrg",,,,"System Triggers ""ON DATABASE""","TRIGGER"
+"DATA_LOAD",320,"cdl","ctl","csv","TABLE","DATA_LOAD references are not allowed in OBJECT_CONF. Also disables Foreign Keys and Triggers",
+"DB_LINK",30,"dblnk",,,"DATABASE LINK",,"DATABASE LINK"
+"DIRECTORY",-20,"dir","sh","bat","DIRECTORY","SYSTEM Only (Don't match OBJECT_TYPE)","DIRECTORY"
+"FUNCTION",130,"func",,,"FUNCTION",,"FUNCTION"
+"GRANT",-10,"grnt",,,,"SYSTEM Only, FUTURE Grants. CURRENT Grants are included with user and object creation",
+"JAVA_SOURCE",120,"pjava",,,"JAVA SOURCE",,"JAVA SOURCE"
+"MVIEW",370,"mvw",,,"MATERIALIZED VIEW",,"MATERIALIZED VIEW"
+"MVIEW_FOREIGN_KEY",530,"mvwfk",,,"MATERIALIZED VIEW",,
+"MVIEW_INDEX",350,"mvwind",,,,,"INDEX"
+"MVIEW_TRIGGER",560,"mvwtrg",,,"MATERIALIZED VIEW",,"TRIGGER"
+"PACKAGE_BODY",420,"pbody",,,"PACKAGE",,"PACKAGE BODY"
+"PACKAGE_SPEC",150,"pspec",,,"PACKAGE",,"PACKAGE"
+"PROCEDURE",140,"proc",,,"PROCEDURE",,"PROCEDURE"
+"QUEUE",220,"aq",,,"QUEUE",,"QUEUE"
+"QUEUE_TABLE",210,"aqt",,,"TABLE",,
+"ROLE",-140,"rol",,,,"SYS Only, Includes SYS Grants",
+"SCHEDULER_JOB",630,"schdj",,,"JOB",,"JOB"
+"SCHEDULER_PROGRAM",620,"schdp",,,"PROGRAM",,"PROGRAM"
+"SCHEDULER_SCHEDULE",610,"schds",,,"SCHEDULE",,"SCHEDULE"
+"SCHEMA_TRIGGER",570,"schtrg",,,,"System Triggers ""ON SCHEMA""","TRIGGER"
+"SEQUENCE",40,"seq",,,"SEQUENCE",,"SEQUENCE"
+"SYNONYM",10,"syn",,,,"FUTURE Synonyms. CURRENT Synonyms are included wth object creation","SYNONYM"
+"TABLE",310,"tab",,,"TABLE",,"TABLE"
+"TABLE_FOREIGN_KEY",510,"tabfk",,,"TABLE",,
+"TABLE_INDEX",330,"tabind",,,,"FUTURE Indexes. CURRENT Indexes are included with object creation","INDEX"
+"TABLE_TRIGGER",540,"tabtrg",,,"TABLE",,"TRIGGER"
+"TYPE_BODY",410,"tbody",,,"TYPE",,"TYPE BODY"
+"TYPE_SPEC",110,"tspec",,,"TYPE",,"TYPE"
+"USER",-130,"usr",,,,"SYS Only, Includes SYS Grants",
+"VIEW",360,"vw",,,"VIEW",,"VIEW"
+"VIEW_FOREIGN_KEY",520,"vwfk",,,"VIEW",,
+"VIEW_TRIGGER",550,"vwtrg",,,"VIEW",,"TRIGGER"
+"XDB_ACL",-120,"acl",,,,"SYS Only",
diff --git a/grbsrc/ODBCAPTURE/OTYPE_CONF.ctl b/grbsrc/ODBCAPTURE/OTYPE_CONF.ctl
new file mode 100644
index 0000000..f79b791
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OTYPE_CONF.ctl
@@ -0,0 +1,14 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."OTYPE_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (INSTALL_OTYPE CHAR(20)
+ ,INSTALL_ORDER FLOAT EXTERNAL
+ ,EXT CHAR(6)
+ ,EXT2 CHAR(6)
+ ,EXT3 CHAR(6)
+ ,NAME_CHECK_OTYPE CHAR(30)
+ ,NOTES CHAR(1024)
+ ,OBJECT_TYPE CHAR(30)
+ )
diff --git a/grbsrc/ODBCAPTURE/OTYPE_CONF.tab b/grbsrc/ODBCAPTURE/OTYPE_CONF.tab
new file mode 100644
index 0000000..be7b4ce
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/OTYPE_CONF.tab
@@ -0,0 +1,51 @@
+
+--
+-- Create ODBCAPTURE.OTYPE_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.OTYPE_CONF
+
+ CREATE TABLE "ODBCAPTURE"."OTYPE_CONF"
+ ( "INSTALL_OTYPE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
+ "INSTALL_ORDER" NUMBER(5,0) NOT NULL ENABLE,
+ "EXT" VARCHAR2(6 BYTE) NOT NULL ENABLE,
+ "EXT2" VARCHAR2(6 BYTE),
+ "EXT3" VARCHAR2(6 BYTE),
+ "NAME_CHECK_OTYPE" VARCHAR2(30 BYTE),
+ "NOTES" VARCHAR2(1024 BYTE),
+ "OBJECT_TYPE" VARCHAR2(30 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."OTYPE_CONF" ADD CONSTRAINT "OTYPE_CONF_PK" PRIMARY KEY ("INSTALL_OTYPE")
+ USING INDEX ENABLE;
+ALTER TABLE "ODBCAPTURE"."OTYPE_CONF" ADD CONSTRAINT "OTYPE_CONF_UK1" UNIQUE ("INSTALL_ORDER")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.OTYPE_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."INSTALL_OTYPE" IS 'Name of the object type (Primary Key)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."INSTALL_ORDER" IS 'Default installation order for this object type (Unique Key) (Required)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."EXT" IS 'Primary filename extension this object type (Required)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."EXT2" IS 'Secondary filename extension this object type (Optional)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."EXT3" IS 'Tertiary filename extension this object type (Optional)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."NAME_CHECK_OTYPE" IS 'DBA_OBJECTS Object Type used to create file names';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON COLUMN "ODBCAPTURE"."OTYPE_CONF"."OBJECT_TYPE" IS 'Actual DBA_OBJECTS Object Type for this object type';
+ COMMENT ON TABLE "ODBCAPTURE"."OTYPE_CONF" IS 'List of Object Types to install. Also defines the filename extensions that are used';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw
new file mode 100644
index 0000000..5ee0432
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw
@@ -0,0 +1,117 @@
+
+--
+-- Create ODBCAPTURE.PRIV_OBJ_DIR_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_OBJ_DIR_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_DIR_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_OBJ_DIR_VIEW" ("INSTALL_TYPE", "INSTALL_TIMING", "ONAME_FILTER", "DIRECTORY_INSTALL_TYPE", "DIRECTORY_OWNER", "DIRECTORY_NAME", "OBJECT_TYPE", "DIRECTORY_PATH", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "PRIVILEGE", "GRANTABLE", "HIERARCHY", "COMMON", "INHERITED", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ with q_nondflt as (
+ select oc.install_type
+ ,t.install_timing
+ ,oc.oname_filter
+ ,oc.install_type DIRECTORY_INSTALL_TYPE
+ ,'SYS' DIRECTORY_OWNER
+ ,dir.directory_name
+ ,'DIRECTORY' OBJECT_TYPE
+ ,dir.directory_path DIRECTORY_PATH
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,priv.privilege
+ ,priv.grantable
+ ,priv.hierarchy
+ ,priv.common
+ ,priv.inherited
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_tab_privs_tab priv
+ on priv.grantee = uor.user_or_role
+ and priv.object_owner = 'SYS'
+ and priv.object_type = 'DIRECTORY'
+ join dba_directories dir
+ on dir.directory_name = priv.object_name
+ join otype_conf otc
+ on otc.install_otype = priv.object_type
+ join object_conf oc
+ -- OBJECT_CONF is configured based on Grantee, not Owner
+ on oc.username = uor.user_or_role
+ and oc.install_type != uor.install_type
+ and oc.install_otype = priv.object_type
+ and regexp_like(dir.directory_name, oc.oname_filter)
+ join install_type_timing t
+ -- Ensure Grantee is available when Directory is installed
+ on t.from_install_type = oc.install_type
+ and t.to_install_type = uor.install_type
+ where uor.install_type not in ('sys','pub') -- Exclude 'sys' Grantees
+ and dir.directory_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+), q_dflt as (
+select uor.install_type
+ ,'CURRENT' INSTALL_TIMING
+ ,NULL ONAME_FILTER
+ ,'sys' DIRECTORY_INSTALL_TYPE
+ ,'SYS' DIRECTORY_OWNER
+ ,dir.directory_name
+ ,'DIRECTORY' OBJECT_TYPE
+ ,dir.directory_path DIRECTORY_PATH
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,priv.privilege
+ ,priv.grantable
+ ,priv.hierarchy
+ ,priv.common
+ ,priv.inherited
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_tab_privs_tab priv
+ on priv.grantee = uor.user_or_role
+ and priv.object_owner = 'SYS'
+ and priv.object_type = 'DIRECTORY'
+ join dba_directories dir
+ on dir.directory_name = priv.object_name
+ join otype_conf otc
+ on otc.install_otype = priv.object_type
+ where (priv.grantee, dir.directory_name) not in (select q_nondflt.grantee, q_nondflt.directory_name from q_nondflt)
+ and uor.install_type not in ('sys','pub') -- Exclude 'sys' Grantees
+ and dir.directory_name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+)
+select "INSTALL_TYPE","INSTALL_TIMING","ONAME_FILTER","DIRECTORY_INSTALL_TYPE","DIRECTORY_OWNER","DIRECTORY_NAME","OBJECT_TYPE","DIRECTORY_PATH","GRANTEE_INSTALL_TYPE","GRANTEE","GRANTEE_UOR_TYPE","PRIVILEGE","GRANTABLE","HIERARCHY","COMMON","INHERITED","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_nondflt
+UNION ALL
+select "INSTALL_TYPE","INSTALL_TIMING","ONAME_FILTER","DIRECTORY_INSTALL_TYPE","DIRECTORY_OWNER","DIRECTORY_NAME","OBJECT_TYPE","DIRECTORY_PATH","GRANTEE_INSTALL_TYPE","GRANTEE","GRANTEE_UOR_TYPE","PRIVILEGE","GRANTABLE","HIERARCHY","COMMON","INHERITED","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_dflt;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_DIR_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw b/grbsrc/ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw
new file mode 100644
index 0000000..d7ce5eb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw
@@ -0,0 +1,82 @@
+
+--
+-- Create ODBCAPTURE.PRIV_OBJ_INSTALL_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_OBJ_INSTALL_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_INSTALL_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_OBJ_INSTALL_VW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "OBJECT_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "PRIVILEGE", "GRANTABLE", "HIERARCHY", "COMMON", "INHERITED", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then obj.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'OBJECT'
+ else 'GRANTEE'
+ end INSTALL_TYPE_SELECTOR
+ ,obj.install_type OBJECT_INSTALL_TYPE
+ ,obj.object_owner
+ ,obj.object_name
+ ,obj.object_type
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,priv.privilege
+ ,priv.grantable
+ ,priv.hierarchy
+ ,priv.common
+ ,priv.inherited
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_tab_privs_tab priv
+ on priv.grantee = uor.user_or_role
+ join obj_install_object_tab obj
+ on obj.object_owner = priv.object_owner
+ and obj.object_name = priv.object_name
+ and obj.object_type = priv.object_type
+ join otype_conf otc
+ on otc.install_otype = 'GRANT'
+ join install_type_timing t
+ -- Ensure Grantee is available after installation of object
+ on from_install_type = obj.object_install_type
+ and to_install_type = uor.install_type
+ where priv.object_owner != 'SYS' -- Exclude database objects owned by SYS
+ and ( uor.install_type not in ('sys','pub') -- Exclude 'sys' and 'pub' Grantees
+ OR ( uor.install_type = 'pub' -- Include 'pub' Grantees
+ AND obj.object_owner_install_type not in ('sys','pub') ) -- Only if owner not sys or pub
+ );
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_INSTALL_VW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw
new file mode 100644
index 0000000..eaec4ea
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw
@@ -0,0 +1,70 @@
+
+--
+-- Create ODBCAPTURE.PRIV_OBJ_JAVA_FG_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_OBJ_JAVA_FG_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_JAVA_FG_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_OBJ_JAVA_FG_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "JAVA_CLASS_INSTALL_TYPE", "JAVA_CLASS_OWNER", "JAVA_CLASS_MASK", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "JAVA_CLASS_GRANT", "JAVA_CLASS_PERMISSION", "KIND", "SEQ", "ENABLED") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then own.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'JAVA_CLASS'
+ else 'GRANTEE'
+ end INSTALL_TYPE_SELECTOR
+ ,own.install_type JAVA_CLASS_INSTALL_TYPE
+ ,djp.type_schema JAVA_CLASS_OWNER
+ ,substr(djp.name, 1, 256) JAVA_CLASS_MASK
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,substr(djp.type_name, 1, 256) JAVA_CLASS_GRANT
+ ,substr(djp.action, 1, 256) JAVA_CLASS_PERMISSION
+ ,djp.kind
+ ,djp.seq
+ ,djp.enabled
+ from uor_install_view uor
+ join dba_java_policy djp
+ on djp.grantee = uor.user_or_role
+ join uor_install_view own
+ on own.user_or_role = djp.type_schema
+ join install_type_timing t
+ -- Ensure the Grantee is available when the Java Owner is installed
+ on t.from_install_type = own.install_type
+ and t.to_install_type = uor.install_type
+ -- Exclude 'sys' and 'pub' Grantees
+ where uor.install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_JAVA_FG_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw
new file mode 100644
index 0000000..4693355
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw
@@ -0,0 +1,88 @@
+
+--
+-- Create ODBCAPTURE.PRIV_OBJ_QUEUE_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_OBJ_QUEUE_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_QUEUE_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_OBJ_QUEUE_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "QUEUE_INSTALL_TYPE", "QUEUE_OWNER", "QUEUE_NAME", "OBJECT_TYPE", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "PRIVILEGE", "GRANTABLE", "HIERARCHY", "COMMON", "INHERITED", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then obj.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'QUEUE'
+ else 'GRANTEE'
+ end INSTALL_TYPE_SELECTOR
+ ,obj.install_type QUEUE_INSTALL_TYPE
+ ,obj.object_owner QUEUE_OWNER
+ ,obj.object_name QUEUE_NAME
+ ,'QUEUE' OBJECT_TYPE
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,tp.privilege
+ ,tp.grantable
+ ,tp.hierarchy
+ ,tp.common
+ ,tp.inherited
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_tab_privs_tab tp
+ on tp.grantee = uor.user_or_role
+ and tp.object_type = 'QUEUE'
+ join dba_queues aq
+ on aq.owner = tp.object_owner
+ and aq.name = tp.object_name
+ join obj_install_object_tab obj
+ on obj.object_owner = tp.object_owner
+ and obj.object_name = tp.object_name
+ and obj.object_type = 'QUEUE'
+ join otype_conf otc
+ on otc.install_otype = 'GRANT'
+ join install_type_timing t
+ -- Ensure the Grantee is available when the Queue is installed
+ on t.from_install_type = obj.install_type
+ and t.to_install_type = uor.install_type
+ where ( aq.queue_type is null
+ or aq.queue_type != 'EXCEPTION_QUEUE')
+ and aq.name not like common_util.get_RECYCLE_BIN_NAME_MATCH escape '\'
+ and ( uor.install_type not in ('sys','pub') -- Exclude 'sys' and 'pub' Grantees
+ OR ( uor.install_type = 'pub' -- Include 'pub' Grantess
+ AND obj.object_install_type not in ('sys','pub') ) -- Only if owner not sys or pub
+ );
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_QUEUE_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw
new file mode 100644
index 0000000..2e76ac2
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw
@@ -0,0 +1,139 @@
+
+--
+-- Create ODBCAPTURE.PRIV_OBJ_XDBACL_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_OBJ_XDBACL_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_XDBACL_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_OBJ_XDBACL_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "ONAME_FILTER", "XDBACL_INSTALL_TYPE", "XDBACL_NAME", "XDBACL_TYPE", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "PRIVILEGE", "XDBACL_HOST", "LOWER_PORT", "UPPER_PORT", "ACE_ORDER", "START_DATE", "END_DATE", "INVERTED_PRINCIPAL", "PRINCIPAL_TYPE", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ with q_nondflt as (
+ select case t.install_timing
+ when 'CURRENT'
+ then ol.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'ONAME_FILTER'
+ else 'GRANTEE'
+ end INSTALL_TYPE_SELECTOR
+ ,ol.oname_filter
+ ,ol.install_type XDBACL_INSTALL_TYPE
+ ,a.host || ',' || a.lower_port || '-' || a.upper_port
+ XDBACL_NAME -- Defined Length Concatenations Don't Need a CAST
+ ,'XDB ACL (Host Aces)' XDBACL_TYPE
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,a.privilege
+ ,a.host XDBACL_HOST
+ ,nvl(to_char(a.lower_port),'NULL')
+ LOWER_PORT
+ ,nvl(to_char(a.upper_port),'NULL')
+ UPPER_PORT
+ ,a.ace_order
+ ,nvl(to_char(a.start_date,'YYYYMMDDHH24MISS.FF'), 'NULL')
+ START_DATE
+ ,nvl(to_char(a.end_date,'YYYYMMDDHH24MISS.FF'), 'NULL')
+ END_DATE
+ ,a.inverted_principal
+ ,a.principal_type
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_host_aces a
+ on a.principal_type = 'DATABASE' -- xs_acl.ptype_db
+ and a.grant_type = 'GRANT'
+ and a.inverted_principal = 'NO'
+ and a.privilege is not null
+ and a.principal = uor.user_or_role
+ join otype_conf otc
+ on otc.install_otype = 'XDB_ACL'
+ join object_conf ol
+ on ol.username = uor.user_or_role
+ and ol.install_type != uor.install_type
+ and ol.install_otype = otc.install_otype
+ and regexp_like(a.host || ',' || a.lower_port || '-' || a.upper_port, ol.oname_filter)
+ join install_type_timing t
+ -- Ensure the Grantee is available when the XDBACL is installed
+ on t.from_install_type = ol.install_type
+ and t.to_install_type = uor.install_type
+ -- Exclude 'sys' Grantees
+ where uor.install_type not in ('sys','pub')
+), q_dflt as (
+ select uor.install_type
+ ,'GRANTEE' INSTALL_TYPE_SELECTOR
+ ,NULL ONAME_FILTER
+ ,'sys' XDBACL_INSTALL_TYPE -- Use the INSTALL_TYPE of the Grantee
+ ,a.host || ',' || a.lower_port || '-' || a.upper_port
+ XDBACL_NAME -- Defined Length Concatenations Don't Need a CAST
+ ,'XDB ACL (Host Aces)' XDBACL_TYPE
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,a.privilege
+ ,a.host XDBACL_HOST
+ ,nvl(to_char(a.lower_port),'NULL')
+ LOWER_PORT
+ ,nvl(to_char(a.upper_port),'NULL')
+ UPPER_PORT
+ ,a.ace_order
+ ,nvl(to_char(a.start_date,'YYYYMMDDHH24MISS.FF'), 'NULL')
+ START_DATE
+ ,nvl(to_char(a.end_date,'YYYYMMDDHH24MISS.FF'), 'NULL')
+ END_DATE
+ ,a.inverted_principal
+ ,a.principal_type
+ ,otc.install_otype
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join dba_host_aces a
+ on a.principal_type = 'DATABASE' -- xs_acl.ptype_db
+ and a.grant_type = 'GRANT'
+ and a.inverted_principal = 'NO'
+ and a.privilege is not null
+ and a.principal = uor.user_or_role
+ join otype_conf otc
+ on otc.install_otype = 'XDB_ACL'
+ where (a.principal, a.host || ',' || a.lower_port || '-' || a.upper_port) not in
+ (select q_nondflt.grantee, q_nondflt.xdbacl_name from q_nondflt q_nondflt)
+ -- Exclude 'sys' Grantees
+ and uor.install_type not in ('sys','pub')
+)
+select "INSTALL_TYPE","INSTALL_TYPE_SELECTOR","ONAME_FILTER","XDBACL_INSTALL_TYPE","XDBACL_NAME","XDBACL_TYPE","GRANTEE_INSTALL_TYPE","GRANTEE","GRANTEE_UOR_TYPE","PRIVILEGE","XDBACL_HOST","LOWER_PORT","UPPER_PORT","ACE_ORDER","START_DATE","END_DATE","INVERTED_PRINCIPAL","PRINCIPAL_TYPE","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_nondflt
+UNION ALL
+select "INSTALL_TYPE","INSTALL_TYPE_SELECTOR","ONAME_FILTER","XDBACL_INSTALL_TYPE","XDBACL_NAME","XDBACL_TYPE","GRANTEE_INSTALL_TYPE","GRANTEE","GRANTEE_UOR_TYPE","PRIVILEGE","XDBACL_HOST","LOWER_PORT","UPPER_PORT","ACE_ORDER","START_DATE","END_DATE","INVERTED_PRINCIPAL","PRINCIPAL_TYPE","INSTALL_OTYPE","EXT","EXT2","EXT3" from q_dflt;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_OBJ_XDBACL_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw
new file mode 100644
index 0000000..707306b
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw
@@ -0,0 +1,87 @@
+
+--
+-- Create ODBCAPTURE.PRIV_QUEUE_REGISTER_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_QUEUE_REGISTER_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_REGISTER_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_QUEUE_REGISTER_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "QUEUE_INSTALL_TYPE", "QUEUE_OWNER", "QUEUE_NAME", "OBJECT_TYPE", "CONSUMER_INSTALL_TYPE", "CONSUMER_NAME", "CONSUMER_UOR_TYPE", "SUBSCRIPTION_NAME", "NAMESPACE", "LOCATION_NAME", "USER_CONTEXT", "QOSFLAGS", "TIMEOUT", "NTFN_GROUPING_CLASS", "NTFN_GROUPING_VALUE", "NTFN_GROUPING_TYPE", "NTFN_GROUPING_START_TIME", "NTFN_GROUPING_REPEAT_COUNT", "CONTEXT_SIZE") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then aq.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'QUEUE'
+ else 'CONSUMER'
+ end INSTALL_TYPE_SELECTOR
+ ,aq.install_type QUEUE_INSTALL_TYPE
+ ,aq.object_owner QUEUE_OWNER
+ ,aq.object_name QUEUE_NAME
+ ,'QUEUE' OBJECT_TYPE
+ ,uor.install_type CONSUMER_INSTALL_TYPE
+ ,uor.user_or_role CONSUMER_NAME
+ ,uor.uor_type CONSUMER_UOR_TYPE
+ ,aqreg.subscription_name -- "subscription_name" defines the datatype
+ ,aqreg.namespace
+ ,aqreg.location_name
+ ,aqreg.user_context
+ ,aqreg.qosflags
+ ,aqreg.timeout
+ ,aqreg.ntfn_grouping_class
+ ,aqreg.ntfn_grouping_value
+ ,aqreg.ntfn_grouping_type
+ ,aqreg.ntfn_grouping_start_time
+ ,aqreg.ntfn_grouping_repeat_count
+ ,aqreg.context_size
+ from uor_install_view uor
+ join dba_subscr_registrations aqreg
+ on substr(aqreg.subscription_name
+ ,instr(aqreg.subscription_name,':') + 1
+ ,4000) = uor.user_or_role
+ join obj_install_object_tab aq
+ on aq.object_owner = substr(aqreg.subscription_name
+ ,1
+ ,instr(aqreg.subscription_name,'.') - 1)
+ and aq.object_name = substr(aqreg.subscription_name
+ ,instr(aqreg.subscription_name,'.') + 1
+ ,instr(aqreg.subscription_name,':') -
+ instr(aqreg.subscription_name,'.') - 1)
+ join install_type_timing t
+ -- Ensure the Consumer is avaialable when this Queue is installed
+ on t.from_install_type = aq.install_type
+ and t.to_install_type = uor.install_type
+ where aq.object_type = 'QUEUE'
+ -- Exclude 'sys' or 'pub' queues
+ and aq.object_owner_install_type in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_REGISTER_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw
new file mode 100644
index 0000000..65c1ec7
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw
@@ -0,0 +1,74 @@
+
+--
+-- Create ODBCAPTURE.PRIV_QUEUE_SUBSCRIBE_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_QUEUE_SUBSCRIBE_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_SUBSCRIBE_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_QUEUE_SUBSCRIBE_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "QUEUE_INSTALL_TYPE", "QUEUE_OWNER", "QUEUE_NAME", "OBJECT_TYPE", "CONSUMER_INSTALL_TYPE", "CONSUMER_NAME", "CONSUMER_UOR_TYPE", "ADDRESS", "PROTOCOL", "RULE", "TRANSFORMATION", "QUEUE_TO_QUEUE", "DELIVERY_MODE") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then aq.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'QUEUE'
+ else 'CONSUMER'
+ end INSTALL_TYPE_SELECTOR
+ ,aq.install_type QUEUE_INSTALL_TYPE
+ ,aq.object_owner QUEUE_OWNER
+ ,aq.object_name QUEUE_NAME
+ ,'QUEUE' OBJECT_TYPE
+ ,uor.install_type CONSUMER_INSTALL_TYPE
+ ,uor.user_or_role CONSUMER_NAME
+ ,uor.uor_type CONSUMER_UOR_TYPE
+ ,aqsub.address
+ ,aqsub.protocol
+ ,aqsub.rule
+ ,aqsub.transformation
+ ,aqsub.queue_to_queue
+ ,aqsub.delivery_mode
+ from uor_install_view uor
+ join dba_queue_subscribers aqsub
+ on aqsub.consumer_name = uor.user_or_role
+ join obj_install_object_tab aq
+ on aq.object_owner = aqsub.owner
+ and aq.object_name = aqsub.queue_name
+ -- Ensure Consumer is available when Queue is installed
+ join install_type_timing t
+ on t.from_install_type = aq.install_type
+ and t.to_install_type = uor.install_type
+ where aq.object_type = 'QUEUE'
+ -- Exclude 'sys' or 'pub' queues
+ and aq.object_owner_install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_SUBSCRIBE_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw
new file mode 100644
index 0000000..f7bdb51
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw
@@ -0,0 +1,60 @@
+
+--
+-- Create ODBCAPTURE.PRIV_QUEUE_SYSPRIVS_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_QUEUE_SYSPRIVS_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_SYSPRIVS_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_QUEUE_SYSPRIVS_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "GRANT_INSTALL_TYPE", "GRANT_OWNER", "GRANT_NAME", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "ADMIN_OPTION", "COMMON", "INHERITED", "INSTALL_OTYPE", "EXT", "EXT2", "EXT3") AS
+ select uor.install_type
+ ,'GRANTEE' INSTALL_TYPE_SELECTOR
+ ,'sys' GRANT_INSTALL_TYPE
+ ,'SYS' GRANT_OWNER
+ ,aqsp.dbms_aq_priv GRANT_NAME
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,aqsp.admin_option
+ ,aqsp.common
+ ,aqsp.inherited
+ ,'GRANT' INSTALL_OTYPE
+ ,otc.ext
+ ,otc.ext2
+ ,otc.ext3
+ from uor_install_view uor
+ join aq_system_privs_vw aqsp
+ on aqsp.grantee = uor.user_or_role
+ join otype_conf otc
+ on otc.install_otype = 'GRANT'
+ -- Exclude 'sys' and 'pub' Grantees
+ where uor.install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_QUEUE_SYSPRIVS_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw
new file mode 100644
index 0000000..cf19d58
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw
@@ -0,0 +1,69 @@
+
+--
+-- Create ODBCAPTURE.PRIV_ROLE_PRIVILEGES_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_ROLE_PRIVILEGES_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_ROLE_PRIVILEGES_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_ROLE_PRIVILEGES_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "ROLE_INSTALL_TYPE", "ROLENAME", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "DEFAULT_ROLE", "ADMIN_OPTION", "DELEGATE_OPTION", "COMMON", "INHERITED") AS
+ select case t.install_timing
+ when 'CURRENT'
+ then trc.install_type
+ else uor.install_type
+ end INSTALL_TYPE
+ ,case t.install_timing
+ when 'CURRENT'
+ then 'ROLE'
+ else 'GRANTEE'
+ end INSTALL_TYPE_SELECTOR
+ ,trc.install_type ROLE_INSTALL_TYPE
+ ,trc.rolename
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.user_or_role GRANTEE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,priv.default_role
+ ,priv.admin_option
+ ,priv.delegate_option
+ ,priv.common
+ ,priv.inherited
+ from uor_install_view uor
+ join dba_role_privs priv
+ on priv.grantee = uor.user_or_role
+ join role_conf trc
+ on trc.rolename = priv.granted_role
+ -- Ensure the Grantee is available after installation of the Role
+ join install_type_timing t
+ on t.from_install_type = trc.install_type
+ and t.to_install_type = uor.install_type
+ -- Exclude 'sys' and 'pub' Grantees
+ where uor.install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_ROLE_PRIVILEGES_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw
new file mode 100644
index 0000000..8c6201d
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw
@@ -0,0 +1,57 @@
+
+--
+-- Create ODBCAPTURE.PRIV_SYSOBJ_PRIVILEGES_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_SYSOBJ_PRIVILEGES_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_SYSOBJ_PRIVILEGES_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_SYSOBJ_PRIVILEGES_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "OBJECT_OWNER_INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "GRANTEE_INSTALL_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "PRIVILEGE", "GRANTABLE", "HIERARCHY", "COMMON", "INHERITED") AS
+ select priv.grantee_install_type INSTALL_TYPE
+ ,'GRANTEE' INSTALL_TYPE_SELECTOR
+ ,priv.object_owner_install_type
+ ,priv.object_owner
+ ,priv.object_name
+ ,priv.object_type
+ ,priv.grantee_install_type
+ ,priv.grantee
+ ,priv.grantee_uor_type
+ ,priv.privilege
+ ,priv.grantable
+ ,priv.hierarchy
+ ,priv.common
+ ,priv.inherited
+ from dba_tab_privs_tab priv
+ -- Include only 'sys' Objects
+ where priv.object_owner_install_type = 'sys'
+ -- Exclude 'sys' and 'pub' Grantees
+ and priv.grantee_install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_SYSOBJ_PRIVILEGES_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw b/grbsrc/ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw
new file mode 100644
index 0000000..6b1e96b
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw
@@ -0,0 +1,53 @@
+
+--
+-- Create ODBCAPTURE.PRIV_SYSTEM_PRIVILEGES_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."PRIV_SYSTEM_PRIVILEGES_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_SYSTEM_PRIVILEGES_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."PRIV_SYSTEM_PRIVILEGES_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "GRANTEE_INSTALL_TYPE", "GRANTEE_UOR_TYPE", "GRANTEE", "SYSTEM_PRIVILEGE_NAME", "ADMIN_OPTION", "COMMON", "INHERITED") AS
+ select uor.install_type
+ ,'GRANTEE' INSTALL_TYPE_SELECTOR
+ ,uor.install_type GRANTEE_INSTALL_TYPE
+ ,uor.uor_type GRANTEE_UOR_TYPE
+ ,priv.grantee
+ ,priv.privilege SYSTEM_PRIVILEGE_NAME
+ ,priv.admin_option
+ ,priv.common
+ ,priv.inherited
+ from uor_install_view uor
+ join dba_sys_privs priv
+ on priv.grantee = uor.user_or_role
+ and priv.privilege not like '% ANY QUEUE'
+ -- Exclude 'sys' and 'pub' Grantees
+ where uor.install_type not in ('sys','pub');
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.PRIV_SYSTEM_PRIVILEGES_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ROLE_CONF.cdl b/grbsrc/ODBCAPTURE/ROLE_CONF.cdl
new file mode 100644
index 0000000..95421c8
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROLE_CONF.cdl
@@ -0,0 +1,58 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.ROLE_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'ROLE_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'ROLE_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."ROLE_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/ROLE_CONF.ctl data=ODBCAPTURE/ROLE_CONF.csv log=ODBCAPTURE/ROLE_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/ROLE_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
diff --git a/grbsrc/ODBCAPTURE/ROLE_CONF.csv b/grbsrc/ODBCAPTURE/ROLE_CONF.csv
new file mode 100644
index 0000000..cb20ba9
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROLE_CONF.csv
@@ -0,0 +1,106 @@
+"ROLENAME","INSTALL_TYPE","NOTES"
+"ACCHK_READ","sys","Allows users with no administrative privileges to query the DBA_ACCHK_STATISTICS view"
+"ADM_PARALLEL_EXECUTE_TASK","sys","Perform administrative routines (qualified by the prefix ADM_ in DBMS_PARALLEL_EXECUTE) and access the DBA_PARALLEL_EXECUTE_CHUNKS and DBA_PARALLEL_EXECUTE_TASKS views"
+"APEX_ADMINISTRATOR_ROLE","sys","APEX/REST/ORDS Role"
+"APEX_GRANTS_FOR_NEW_USERS_ROLE","sys","APEX/REST/ORDS Role"
+"APPLICATION_TRACE_VIEWER","sys",
+"AQ_ADMINISTRATOR_ROLE","sys","Privilege to administer Advanced Queuing."
+"AQ_USER_ROLE","sys","De-supported but maintained for backward compatibility to version 8.0."
+"AUDIT_ADMIN","sys","Provides privileges to create unified and fine-grained audit policies, use the AUDIT and NOAUDIT SQL statements, view audit data, and manage the audit trail administration."
+"AUDIT_VIEWER","sys","Provides privileges to view and analyze audit data."
+"AUTHENTICATEDUSER","sys","Used by the XDB protocols to define any user who has logged in to the system."
+"AVTUNE_PKG_ROLE","sys","Utility functions for Analytic View auto cache auto tune."
+"BDSQL_ADMIN","sys","Big Data SQL Admin Role."
+"BDSQL_USER","sys","Big Data SQL User Role."
+"CAPTURE_ADMIN","sys","Provides the privileges necessary to create and manage privilege analysis policies."
+"CDB_DBA","sys","Provides the privileges required for administering a CDB, such as SET CONTAINER, SELECT ON PDB_PLUG_IN_VIOLATIONS, and SELECT ON CDB_LOCAL_ADMIN_PRIVS. If your site requires additional privileges, then you can create a role (either common or local) to cover these privileges, and then grant this role to the CDB_DBA role."
+"CONNECT","sys","Contains the CREATE SESSION and SET CONTAINER system privileges."
+"CSW_USR_ROLE","sys","Provides user privileges to manage the Catalog Services for the Web (CSW) component of Oracle Spatial."
+"CTXAPP","sys","Enables developers create Oracle Text indexes and index preferences, and to use PL/SQL packages."
+"DATAPATCH_ROLE","sys","Access to DBMS_QOPATCH package which will give details of Oracle Patches applied on the database."
+"DATAPUMP_EXP_FULL_DATABASE","sys","Granted EXP_FULL_DATABASE role."
+"DATAPUMP_IMP_FULL_DATABASE","sys","Granted EXP_FULL_DATABASE and IMP_FULL_DATABASE roles."
+"DBA","sys","Example Database Administrator role."
+"DBFS_ROLE","sys","Provides access to the DBFS (the Database Filesystem) packages and objects."
+"DBJAVASCRIPT","sys","Needed for running JavaScript code, using the Nashorn engine of 12.2 Oracle JVM in your sessions. This role includes the permissions that are required to run Nashorn in the database."
+"DBMS_MDX_INTERNAL","sys",
+"DELETE_CATALOG_ROLE","sys","Grant this role to allow users to delete records from the system audit tables SYS.AUD$ and SYS.FGA_LOG$."
+"DV_ACCTMGR","sys","Use the DV_ACCTMGR role to create and maintain database accounts and database profiles. In this manual, the example DV_ACCTMGR role is assigned to a user named amalcolm_dvacctmgr."
+"DV_ADMIN","sys","The DV_ADMIN role controls the Oracle Database Vault PL/SQL packages."
+"DV_AUDIT_CLEANUP","sys","Grant to any user who is responsible for purging the Database Vault auit trail in a non-unified auditing environment."
+"DV_DATAPUMP_NETWORK_LINK","sys","Needed by any user who is responsible for conducting the NETWORK_LINK transportable Data Pump import operation in an Oracle Database Vault environment. Enables the management of the Oracle Data Pump NETWORK_LINK transportable import processes to be tightly controlled by Database Vault, but does not change or restrict the way you would normally conduct Oracle Data Pump operations."
+"DV_GOLDENGATE_ADMIN","sys","Intended for any user with responsibility for GoldenGate configuration by default it contains no privileges."
+"DV_GOLDENGATE_REDO_ACCESS","sys","For any user who is responsible for using the Oracle GoldenGate TRANLOGOPTIONS DBLOGREADER method to access redo logs in an Oracle Database Vault environment."
+"DV_MONITOR","sys","Enables the Oracle Enterprise Manager Grid Control agent to monitor Oracle Database Vault for attempted violations and configuration issues with realm or command rule definitions. This enables Grid Control to read and propagate realm definitions and command rule definitions between databases."
+"DV_OWNER","sys","The DV_OWNER role has the administrative capabilities that the DV_ADMIN role provides, and the reporting capabilities the DV_SECANALYST role provides."
+"DV_PATCH_ADMIN","sys","Temporarily grant the DV_PATCH_ADMIN role to any database administrator who is responsible for performing database patching or adding languages to Database Vault. After the patch operation or language addition is complete, you should immediately revoke this role. The role does not provide access to any secured data."
+"DV_POLICY_OWNER","sys","Enables database users to manage to a limited degree Oracle Database Vault policies."
+"DV_PUBLIC","sys","Oracle Database Vault does not enable you to directly grant object privileges in the DVSYS schema to PUBLIC. You must grant the object privilege on the DVSYS schema object the DV_PUBLIC role, and then grant DV_PUBLIC to PUBLIC."
+"DV_REALM_OWNER","sys","Use the DV_REALM_OWNER role to manage database objects in multiple schemas that define a realm. Grant this role to the database account owner who is responsible for managing one or more schema database accounts within a realm and the roles associated with the realm."
+"DV_REALM_RESOURCE","sys","Use the DV_REALM_RESOURCE role for operations such as creating tables, views, triggers, synonyms, and other objects that a realm would typically use."
+"DV_SECANALYST","sys","DV_SECANALYST can query DVSYS schema objects through Oracle Database Vault-supplied views only."
+"DV_STREAMS_ADMIN","sys","Grant to a user who is responsible for configuring Streams replication in an Oracle Database Vault environment."
+"DV_XSTREAM_ADMIN","sys","Grant to a user who is responsible for configuring XStreams replication in an Oracle Database Vault environment."
+"EJBCLIENT","sys","Provides privileges to connect to EJBs from a Java stored procedure."
+"EM_EXPRESS_ALL","sys","Enables users to connect to Oracle Enterprise Manager (EM) Express and use all the functionality provided by EM Express (read and write access to all EM Express features). The EM_EXPRESS_ALL role includes the EM_EXPRESS_BASIC role."
+"EM_EXPRESS_BASIC","sys","Enables users to connect to EM Express and to view the pages in read-only mode. The EM_EXPRESS_BASIC role includes the SELECT_CATALOG_ROLE role."
+"EXECUTE_CATALOG_ROLE","sys","Allow users EXECUTE privileges for packages and procedures in the data dictionary. Granted HS_ADMIN_EXECUTE_ROLE role."
+"EXP_FULL_DATABASE","sys","Provides the privileges required to perform full and incremental database export. Granted EXECUTE_CATALOG_ROLE and SELECT_CATALOG_ROLE roles."
+"GATHER_SYSTEM_STATISTICS","sys","To update the dictionary system statistics a user must have DBA privileges or the GATHER_SYSTEM_STATISTICS role."
+"GDS_CATALOG_SELECT","sys","Provides access to 10 objects owned by GSMADMIN_INTERNAL."
+"GGSYS_ROLE","sys","Golden Gate Administrator Privileges."
+"GLOBAL_AQ_USER_ROLE","sys","Required to register through LDAP using JDBC connection parameters as this requires the ability to write access to the connection factory entries in the LDAP server (which requires the LDAP user to be either the database itself or be granted GLOBAL_AQ_USER_ROLE)."
+"GSMADMIN_ROLE","sys","Granted AQ_ADMINISTRATOR_ROLE and CONNECT roles: Inlcudes EXECUTE on DBMS_GSM_UTILITY and related resources."
+"GSMROOTUSER_ROLE","sys","GSMROOTUSER is a database account specific to Oracle Sharding that is only used when pluggable database (PDB) shards are present. The account is used by GDSCTL and global service managers to connect to the root container of container databases (CDBs) to perform administrative tasks."
+"GSMUSER_ROLE","sys","Granted CONNECT role: Includes EXECUTE on DBMS_GSM_DBADMIN."
+"GSM_POOLADMIN_ROLE","sys","Granted CONNECT role: Inlcudes EXECUTE on DBMS_GSM_POOLADMIN."
+"HS_ADMIN_EXECUTE_ROLE","sys","Provides the EXECUTE privilege for users who want to use the Heterogeneous Services (HS) PL/SQL packages."
+"HS_ADMIN_ROLE","sys","Provides privileges for DBAs who need to use the DBA role using Oracle Database Heterogeneous Services to access appropriate tables in the data dictionary. Used to protect access to the Heterogeneous Services (HS) data dictionary tables (grants SELECT) and packages (grants EXECUTE). It is granted to SELECT_CATALOG_ROLE and EXECUTE_CATALOG_ROLE such that users with generic data dictionary access also can access the HS data dictionary."
+"HS_ADMIN_SELECT_ROLE","sys","Provides privileges to query the Heterogeneous Services data dictionary views."
+"IMP_FULL_DATABASE","sys","Provides the privileges required to perform full database imports. Includes an extensive list of system privileges (use view DBA_SYS_PRIVS to view privileges) and the following roles: EXECUTE_CATALOG_ROLE and SELECT_CATALOG_ROLE. This role is provided for convenience in using the export and import utilities."
+"JAVADEBUGPRIV","sys","Grants permissions to run the Java debugger."
+"JAVAIDPRIV","sys","Deprecated"
+"JAVASYSPRIV","sys","Grants permissions for Java administrators including updating JVM-protected packages. Granted the JAVAUSERPRIV role."
+"JAVAUSERPRIV","sys","Grants permissions for Java users such as examining properties."
+"JAVA_ADMIN","sys","Java administration privileges including permission to modify PolicyTable."
+"JAVA_DEPLOY","sys","Provides privileges to deploy ncomp DLLs into the javavm/admin directory using the ncomp and deployns utilities. With this role, the javavm/deploy and javavm/admin directories can be accessible."
+"JMXSERVER","sys","Provides permissions to start and maintain a JMX agent in a session. The procedure dbms_java.start_jmx_agent starts the agent in a specific session that generally remains active for the duration of the session."
+"LBAC_DBA","sys","Provides permissions to use the SA_SYSDBA PL/SQL package."
+"LOGSTDBY_ADMINISTRATOR","sys","A prototype role created by default with the RESOURCE role."
+"MAINTPLAN_APP","sys","A maintenance plan can be queried in a PDB via the DB_NOTIFICATIONS view by a user that has the MAINTPLAN_APP system privilege."
+"OEM_ADVISOR","sys","Provides privileges to create, drop, select (read), load (write), and delete a SQL tuning set through the DBMS_SQLTUNE PL/SQL package, and to access to the Advisor framework using the ADVISOR PL/SQL package."
+"OEM_MONITOR","sys","Provides privileges needed by the Management Agent component of Oracle Enterprise Manager to monitor and manage a database."
+"OLAP_DBA","sys","Provides privileges needed by the Management Agent component of Oracle Enterprise Manager to monitor and manage the database."
+"OLAP_USER","sys","Provides application developers privileges to create dimensional objects in their own schemas for Oracle OLAP."
+"OLAP_XS_ADMIN","sys","Administer OLAP data security. Granted the XS_RESOURCE role."
+"OPTIMIZER_PROCESSING_RATE","sys","Provides privileges to execute the GATHER_PROCESSING_RATE, SET_PROCESSING_RATE, and DELETE_PROCESSING_RATE procedures in the DBMS_STATS package. These procedures manage the processing rate of a system for automatic degree of parallelism (Auto DOP). Auto DOP uses these processing rates to determine the optimal degree of parallelism for a SQL statement."
+"ORDADMIN","sys","After installing Oracle Multimedia DICOM, the ORDADMIN role is created, with the database system privileges required for administration of the DICOM data model repository."
+"ORDS_ADMINISTRATOR_ROLE","sys","APEX/REST/ORDS Role"
+"ORDS_RUNTIME_ROLE","sys","APEX/REST/ORDS Role"
+"PDB_DBA","sys","Granted automatically to the local user that is created when you create a new pluggable database (PDB) from the seed PDB. No privileges are provided with this role."
+"PLUSTRACE","sys","Grants privlileges on V$ views required to use AUTOTRACE. Can be created in a PDB but not in the CDB."
+"PPLB_ROLE","sys",
+"PROVISIONER","sys","Provides privileges to register and update global callbacks for Oracle Database Real Application sessions and to provision principals."
+"RDFCTX_ADMIN","sys","Privileges required to add a new extractor type in the schema RDFCTXU for Oracle Database Semantic Technologies."
+"RECOVERY_CATALOG_OWNER","sys","Must be granted to the recovery catalog owner for RMAN."
+"RECOVERY_CATALOG_OWNER_VPD","sys",
+"RECOVERY_CATALOG_USER","sys","Prerequisite for Adding Data Collectors (Oracle Recovery Manager - RMAN)"
+"RESOURCE","sys","Provides the following system privileges: CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE. This role is provided for compatibility with previous releases of Oracle Database. You can determine the privileges encompassed by this role by querying the DBA_SYS_PRIVS data dictionary view."
+"SCHEDULER_ADMIN","sys","Allows the grantee to execute the procedures of the DBMS_SCHEDULER package. It includes all of the job scheduler system privileges and is included in the DBA role."
+"SELECT_CATALOG_ROLE","sys","Provides SELECT privilege on objects in the data dictionary. Granted the HS_ADMIN_SELECT_ROLE role."
+"SODA_APP","sys","Simple Oracle Document Access (SODA) permissions in PL/SQL for a SODA User."
+"SPATIAL_CSW_ADMIN","sys","Provides administrative privileges to manage the Catalog Services for the Web (CSW) component of Oracle Spatial."
+"SPATIAL_WFS_ADMIN","sys","Provides administrative privileges to manage the Web Feature Service (WFS) component of Oracle Spatial."
+"SYSUMF_ROLE","sys","Permission needed for Universal Message Format, UMF, which provides an interface for deploying Remote Management Framework (RMF) topology"
+"WFS_USR_ROLE","sys","Provides user privileges for the Web Feature Service (WFS) component of Oracle Spatial."
+"WM_ADMIN_ROLE","sys","Contains all Workspace Manager privileges with the grant option. By default, the database administrator (DBA role) is granted the WM_ADMIN_ROLE role."
+"XDBADMIN","sys","Allows the grantee to register an XML schema globally, as opposed to registering it for use or access only by its owner. It also lets the grantee bypass access control list (ACL) checks when accessing Oracle XML DB Repository."
+"XDB_SET_INVOKER","sys","Allows the grantee to define invoker's rights handlers and to create or update the resource configuration for XML repository triggers. By default, Oracle Database grants this role to the DBA role but not to the XDBADMIN role."
+"XDB_WEBSERVICES","sys","Allows the grantee to access Oracle Database Web services over HTTPS. However, it does not provide the user access to objects in the database that are public. To allow public access, you need to grant the user the XDB_WEBSERVICES_WITH_PUBLIC role. For a user to use these Web services, SYS must enable the Web service servlets."
+"XDB_WEBSERVICES_OVER_HTTP","sys","Allows the grantee to access Oracle Database Web services over HTTP. However, it does not provide the user access to objects in the database that are public. To allow public access, you need to grant the user the XDB_WEBSERVICES_WITH_PUBLIC role."
+"XDB_WEBSERVICES_WITH_PUBLIC","sys","Allows the grantee access to public objects through Oracle Database Web services."
+"XS_CACHE_ADMIN","sys","The mid-tier cache. It is required for caching the security policy at the mid-tier level for the checkAcl (authorization) method of the XSAccessController class. Grant this role to the application connection user or the Real Application Security dispatcher."
+"XS_CONNECT","sys",
+"XS_NAMESPACE_ADMIN","sys","In Oracle Database Real Application Security, enables the grantee to manage and manipulate the namespace and attribute for a session. Grant this role to the Real Application Security session user."
+"XS_RESOURCE","sys",
+"XS_SESSION_ADMIN","sys","In Oracle Database Real Application Security, enables the grantee to manage the life cycle of a session, including the ability to create, attach, detach, and destroy the session. Grant this role to the application connection user or Real Application Security dispatcher."
diff --git a/grbsrc/ODBCAPTURE/ROLE_CONF.ctl b/grbsrc/ODBCAPTURE/ROLE_CONF.ctl
new file mode 100644
index 0000000..a8308bb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROLE_CONF.ctl
@@ -0,0 +1,9 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."ROLE_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (ROLENAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,NOTES CHAR(1024)
+ )
diff --git a/grbsrc/ODBCAPTURE/ROLE_CONF.tab b/grbsrc/ODBCAPTURE/ROLE_CONF.tab
new file mode 100644
index 0000000..a4d8028
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROLE_CONF.tab
@@ -0,0 +1,39 @@
+
+--
+-- Create ODBCAPTURE.ROLE_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ROLE_CONF
+
+ CREATE TABLE "ODBCAPTURE"."ROLE_CONF"
+ ( "ROLENAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "NOTES" VARCHAR2(1024 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."ROLE_CONF" ADD CONSTRAINT "ROLE_CONF_PK" PRIMARY KEY ("ROLENAME", "INSTALL_TYPE")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ROLE_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."ROLE_CONF"."ROLENAME" IS 'Name of the database role (Primary Key Column 1)';
+ COMMENT ON COLUMN "ODBCAPTURE"."ROLE_CONF"."INSTALL_TYPE" IS 'Install type for this database role (Primary Key Column 2). Value must exist in TYPE_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."ROLE_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON TABLE "ODBCAPTURE"."ROLE_CONF" IS 'List of Roles to install in each Install Type.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ROLE_CONF.tabfk b/grbsrc/ODBCAPTURE/ROLE_CONF.tabfk
new file mode 100644
index 0000000..0e11e58
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROLE_CONF.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for ODBCAPTURE.ROLE_CONF TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.ROLE_CONF_FK1
+
+ ALTER TABLE "ODBCAPTURE"."ROLE_CONF" ADD CONSTRAINT "ROLE_CONF_FK1" FOREIGN KEY ("INSTALL_TYPE")
+ REFERENCES "ODBCAPTURE"."TYPE_CONF" ("INSTALL_TYPE") ENABLE;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pbody b/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pbody
new file mode 100644
index 0000000..1c140ba
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pbody
@@ -0,0 +1,1445 @@
+
+--
+-- Create ODBCAPTURE.ROOT_SCRIPTS Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ROOT_SCRIPTS
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ODBCAPTURE"."ROOT_SCRIPTS"
+as
+
+
+--------------------------------------------------------------------------------
+-- Alter Foreign Keys Script
+function alter_foreign_keys_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Alter "}' || in_install_type || q'{" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Alter Foreign Keys for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end alter_foreign_keys_sql;
+
+
+--------------------------------------------------------------------------------
+-- Alter Queues Script
+function alter_queues_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Alter "}' || in_install_type || q'{" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Alter Queues for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end alter_queues_sql;
+
+
+--------------------------------------------------------------------------------
+-- Alter Scheduler Jobs Script
+function alter_scheduler_jobs_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Alter "}' || in_install_type || q'{" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Alter Scheduler Jobs for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end alter_scheduler_jobs_sql;
+
+
+--------------------------------------------------------------------------------
+-- Alter Triggers Script
+function alter_triggers_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Alter "}' || in_install_type || q'{" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Alter Triggers for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end alter_triggers_sql;
+
+
+--------------------------------------------------------------------------------
+-- Compile All Database Objects Script
+function compile_all_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Compile All "}' || in_install_type || q'{" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Compile All for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end compile_all_sql;
+
+
+--------------------------------------------------------------------------------
+-- Database Build JUnit Report Script
+function db_build_junit_report_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Create JUnit XML Report of Database Build Status for "}' || in_install_type || q'{" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+}';
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || ' ot('''');' || CHR(10) ||
+ 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end db_build_junit_report_sql;
+
+
+--------------------------------------------------------------------------------
+-- Database Script Install Wrapper
+function db_install_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10) || q'{
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10) || q'{
+set feedback on}';
+ return ret_txt;
+end db_install_sql;
+
+
+--------------------------------------------------------------------------------
+-- Fix Invalid Public Synonyms Script
+function fix_invalid_public_synonyms_sql
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10);
+ return ret_txt;
+end fix_invalid_public_synonyms_sql;
+
+
+--------------------------------------------------------------------------------
+-- Installation Finalization Script
+function installation_finalize_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."}';
+ return ret_txt;
+end installation_finalize_sql;
+
+
+--------------------------------------------------------------------------------
+-- Installation Preparation Script
+function installation_prepare_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;}';
+ return ret_txt;
+end installation_prepare_sql;
+
+
+
+--------------------------------------------------------------------------------
+-- List Invalid Database Objects
+function list_invalids_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- List Invalid Objects for "}' || in_install_type || q'{" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+}';
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end list_invalids_sql;
+
+
+--------------------------------------------------------------------------------
+-- Log Files JUnit Report Script
+function log_files_junit_report_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Create JUnit XML Report of Database Log Files for "}' || in_install_type || q'{" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_}' || in_install_type || q'{
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = '}' || in_install_type || q'{'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/';
+ return ret_txt;
+end log_files_junit_report_sql;
+
+
+--------------------------------------------------------------------------------
+-- ODBCAPTURE Installation Logs Consolidated Data Load
+function odbcapture_installation_logs_cdl
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10) || q'{
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10);
+ return ret_txt;
+end odbcapture_installation_logs_cdl;
+
+
+--------------------------------------------------------------------------------
+-- ODBCAPTURE Installation Logs Comma Separated Values File
+function odbcapture_installation_logs_csv
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := '"' || in_install_type || '","install_sys.log"' || CHR(10) ||
+ '"' || in_install_type || '","install_system.log"' || CHR(10) ||
+ '"' || in_install_type || '","install_' ||
+ in_install_type || '.log"';
+ for buff in (select table_owner
+ ,table_name
+ from obj_install_data_load_tab
+ where install_otype = 'DATA_LOAD'
+ and install_type = in_install_type
+ order by table_owner
+ ,table_name)
+ loop
+ ret_txt := ret_txt || CHR(10) || '"' || in_install_type ||
+ '","' || buff.table_owner ||
+ '/' || buff.table_name || '.log"';
+ end loop;
+ return ret_txt;
+end odbcapture_installation_logs_csv;
+
+
+--------------------------------------------------------------------------------
+-- ODBCAPTURE Installation Logs Control File
+function odbcapture_installation_logs_ctl
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )}';
+ return ret_txt;
+end odbcapture_installation_logs_ctl;
+
+
+--------------------------------------------------------------------------------
+-- Report Status
+function report_status_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = '}' || in_install_type ||
+q'{'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+}';
+ -- Can't have string declaration with a "/" on a line by itself
+ ret_txt := ret_txt || '/' || CHR(10) || q'{
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+}';
+ -- Can't start a line with an "@"
+ ret_txt := ret_txt || q'{@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on}';
+ return ret_txt;
+end report_status_sql;
+
+
+--------------------------------------------------------------------------------
+-- Update ID Sequences
+function update_id_sequences_sql
+ (in_install_type in varchar2)
+ return varchar2
+is
+ ret_txt varchar2(32767);
+begin
+ ret_txt := q'{
+--
+-- Update "}' || in_install_type || q'{" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+}';
+ ret_txt := ret_txt || ' dbms_output.put_line(''Update ID Sequences for ' ||
+ in_install_type || ' Install Type'');' || CHR(10);
+ for sch in (select obj.object_owner
+ from schema_objects_vw obj
+ join schema_conf sl
+ on sl.username = obj.object_owner
+ where obj.install_type = in_install_type
+ and obj.object_owner != 'PUBLIC'
+ group by obj.object_owner
+ order by obj.object_owner)
+ loop
+ ret_txt := ret_txt || ' do_it(''' || sch.object_owner || ''');' || CHR(10);
+ end loop;
+ ret_txt := ret_txt || 'end;' || CHR(10) ||
+ '/';
+ return ret_txt;
+end update_id_sequences_sql;
+
+
+end root_scripts;
+/
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pspec b/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pspec
new file mode 100644
index 0000000..08255fb
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ROOT_SCRIPTS.pspec
@@ -0,0 +1,92 @@
+
+--
+-- Create ODBCAPTURE.ROOT_SCRIPTS Package
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ROOT_SCRIPTS
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "ODBCAPTURE"."ROOT_SCRIPTS"
+ authid current_user
+as
+
+ function alter_foreign_keys_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function alter_queues_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function alter_scheduler_jobs_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function alter_triggers_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function compile_all_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function db_build_junit_report_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function db_install_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function fix_invalid_public_synonyms_sql
+ return varchar2;
+
+ function installation_finalize_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function installation_prepare_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function list_invalids_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function log_files_junit_report_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function odbcapture_installation_logs_cdl
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function odbcapture_installation_logs_csv
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function odbcapture_installation_logs_ctl
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function report_status_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+ function update_id_sequences_sql
+ (in_install_type in varchar2)
+ return varchar2;
+
+end root_scripts;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_CONF.cdl b/grbsrc/ODBCAPTURE/SCHEMA_CONF.cdl
new file mode 100644
index 0000000..d612565
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_CONF.cdl
@@ -0,0 +1,58 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.SCHEMA_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'SCHEMA_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'SCHEMA_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."SCHEMA_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/SCHEMA_CONF.ctl data=ODBCAPTURE/SCHEMA_CONF.csv log=ODBCAPTURE/SCHEMA_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/SCHEMA_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_CONF.csv b/grbsrc/ODBCAPTURE/SCHEMA_CONF.csv
new file mode 100644
index 0000000..dc1210b
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_CONF.csv
@@ -0,0 +1,10 @@
+"USERNAME","INSTALL_TYPE","TS_SIZE","NOTES","TABLESPACE_NAME"
+"APPQOSSYS","sys","0K","Preinstalled Schema","SYSTEM"
+"CTXSYS","sys","0K","Preinstalled Schema","SYSTEM"
+"DIP","sys","0K","Preinstalled Schema","SYSTEM"
+"ODBCAPTURE","grbsrc","512M","Oracle Database Source Code Capture Application","USERS"
+"OUTLN","sys","0K","Preinstalled Schema","SYSTEM"
+"PUBLIC","pub","0K","Public Grants and Synonyms","SYSTEM"
+"SYS","sys","0K","Preinstalled Schema","SYSTEM"
+"SYSTEM","sys","0K","Preinstalled Schema","SYSTEM"
+"XDB","sys","0K","Preinstalled Schema","SYSTEM"
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_CONF.ctl b/grbsrc/ODBCAPTURE/SCHEMA_CONF.ctl
new file mode 100644
index 0000000..c6953ee
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_CONF.ctl
@@ -0,0 +1,11 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."SCHEMA_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,TS_SIZE CHAR(10)
+ ,NOTES CHAR(1024)
+ ,TABLESPACE_NAME CHAR(30)
+ )
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_CONF.tab b/grbsrc/ODBCAPTURE/SCHEMA_CONF.tab
new file mode 100644
index 0000000..46ccfe6
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_CONF.tab
@@ -0,0 +1,45 @@
+
+--
+-- Create ODBCAPTURE.SCHEMA_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.SCHEMA_CONF
+
+ CREATE TABLE "ODBCAPTURE"."SCHEMA_CONF"
+ ( "USERNAME" VARCHAR2(128 BYTE) NOT NULL ENABLE,
+ "INSTALL_TYPE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "TS_SIZE" VARCHAR2(10 BYTE) NOT NULL ENABLE,
+ "NOTES" VARCHAR2(1024 BYTE),
+ "TABLESPACE_NAME" VARCHAR2(30 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."SCHEMA_CONF" ADD CONSTRAINT "SCHEMA_CONF_CK1" CHECK (regexp_like(ts_size, '^UNLIMITED$|^[0-9]+[KMG]$')) ENABLE;
+ALTER TABLE "ODBCAPTURE"."SCHEMA_CONF" ADD CONSTRAINT "SCHEMA_CONF_PK" PRIMARY KEY ("USERNAME")
+ USING INDEX ENABLE;
+ALTER TABLE "ODBCAPTURE"."SCHEMA_CONF" ADD CONSTRAINT "SCHEMA_CONF_NN4" CHECK (tablespace_name is not null) ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.SCHEMA_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_CONF"."USERNAME" IS 'Name of the database schema (Primary Key)';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_CONF"."INSTALL_TYPE" IS 'Install type for this database schema (Required). All objects for this schema are generated for this install type unless filtered by OBJECT_CONF. Value must be in TYPE_CONF table.';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_CONF"."TS_SIZE" IS 'Tablespace quota for this schema (Required). UNLIMITED is allowed';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_CONF"."TABLESPACE_NAME" IS 'Default Tablespace Name for this Schema';
+ COMMENT ON TABLE "ODBCAPTURE"."SCHEMA_CONF" IS 'List of Schema to install in each Install Type.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_CONF.tabfk b/grbsrc/ODBCAPTURE/SCHEMA_CONF.tabfk
new file mode 100644
index 0000000..70a6dfd
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_CONF.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for ODBCAPTURE.SCHEMA_CONF TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.SCHEMA_CONF_FK1
+
+ ALTER TABLE "ODBCAPTURE"."SCHEMA_CONF" ADD CONSTRAINT "SCHEMA_CONF_FK1" FOREIGN KEY ("INSTALL_TYPE")
+ REFERENCES "ODBCAPTURE"."TYPE_CONF" ("INSTALL_TYPE") ENABLE;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/SCHEMA_OBJECTS_VW.vw b/grbsrc/ODBCAPTURE/SCHEMA_OBJECTS_VW.vw
new file mode 100644
index 0000000..11aca8c
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/SCHEMA_OBJECTS_VW.vw
@@ -0,0 +1,53 @@
+
+--
+-- Create ODBCAPTURE.SCHEMA_OBJECTS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."SCHEMA_OBJECTS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.SCHEMA_OBJECTS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."SCHEMA_OBJECTS_VW" ("OBJECT_OWNER", "INSTALL_TYPE", "INSTALL_OTYPE", "OBJECT_TYPE") AS
+ select object_owner
+ ,install_type
+ ,install_otype
+ ,object_type
+ from zx_obj_install_tab
+ group by object_owner
+ ,install_type
+ ,install_otype
+ ,object_type;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.SCHEMA_OBJECTS_VW
+
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_OBJECTS_VW"."OBJECT_OWNER" IS 'Schema name.';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_OBJECTS_VW"."INSTALL_TYPE" IS 'Installation Type.';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_OBJECTS_VW"."INSTALL_OTYPE" IS 'Installation Object Type.';
+ COMMENT ON COLUMN "ODBCAPTURE"."SCHEMA_OBJECTS_VW"."OBJECT_TYPE" IS 'Oracle Name for Installation Object Type.';
+ COMMENT ON TABLE "ODBCAPTURE"."SCHEMA_OBJECTS_VW" IS 'All Installation Object Types in each Non-System Schema for all Installation Types.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/TYPE_CONF.cdl b/grbsrc/ODBCAPTURE/TYPE_CONF.cdl
new file mode 100644
index 0000000..2201f54
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/TYPE_CONF.cdl
@@ -0,0 +1,58 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.TYPE_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'TYPE_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'TYPE_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."TYPE_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/TYPE_CONF.ctl data=ODBCAPTURE/TYPE_CONF.csv log=ODBCAPTURE/TYPE_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/TYPE_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
diff --git a/grbsrc/ODBCAPTURE/TYPE_CONF.csv b/grbsrc/ODBCAPTURE/TYPE_CONF.csv
new file mode 100644
index 0000000..cb3dd16
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/TYPE_CONF.csv
@@ -0,0 +1,4 @@
+"INSTALL_TYPE","NOTES","INSTALL_TYPE_PARENT"
+"grbsrc","Source Code Script Generation","pub"
+"pub","N/A PUBLIC. (Not Installed, Always available for Grants and Synonyms)","sys"
+"sys","N/A System Users. (Not Installed, Always available for Grants and Synonyms)","sys"
diff --git a/grbsrc/ODBCAPTURE/TYPE_CONF.ctl b/grbsrc/ODBCAPTURE/TYPE_CONF.ctl
new file mode 100644
index 0000000..564839b
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/TYPE_CONF.ctl
@@ -0,0 +1,9 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."TYPE_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (INSTALL_TYPE CHAR(10)
+ ,NOTES CHAR(1024)
+ ,INSTALL_TYPE_PARENT CHAR(10)
+ )
diff --git a/grbsrc/ODBCAPTURE/TYPE_CONF.tab b/grbsrc/ODBCAPTURE/TYPE_CONF.tab
new file mode 100644
index 0000000..d6a80dc
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/TYPE_CONF.tab
@@ -0,0 +1,39 @@
+
+--
+-- Create ODBCAPTURE.TYPE_CONF Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.TYPE_CONF
+
+ CREATE TABLE "ODBCAPTURE"."TYPE_CONF"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "NOTES" VARCHAR2(1024 BYTE),
+ "INSTALL_TYPE_PARENT" VARCHAR2(10 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."TYPE_CONF" ADD CONSTRAINT "TYPE_CONF_PK" PRIMARY KEY ("INSTALL_TYPE")
+ USING INDEX ENABLE;
+ALTER TABLE "ODBCAPTURE"."TYPE_CONF" ADD CONSTRAINT "TYPE_CONF_NN2" CHECK (INSTALL_TYPE_PARENT is not null) ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.TYPE_CONF
+
+ COMMENT ON COLUMN "ODBCAPTURE"."TYPE_CONF"."INSTALL_TYPE" IS 'Name of the install type (Primary Key)';
+ COMMENT ON COLUMN "ODBCAPTURE"."TYPE_CONF"."NOTES" IS 'Free text field (Optional)';
+ COMMENT ON TABLE "ODBCAPTURE"."TYPE_CONF" IS 'List of Install Types. Also defines the names of the top level directories';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/TYPE_CONF.tabfk b/grbsrc/ODBCAPTURE/TYPE_CONF.tabfk
new file mode 100644
index 0000000..caeb771
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/TYPE_CONF.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for ODBCAPTURE.TYPE_CONF TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:ODBCAPTURE.TYPE_CONF_FK1
+
+ ALTER TABLE "ODBCAPTURE"."TYPE_CONF" ADD CONSTRAINT "TYPE_CONF_FK1" FOREIGN KEY ("INSTALL_TYPE_PARENT")
+ REFERENCES "ODBCAPTURE"."TYPE_CONF" ("INSTALL_TYPE") ENABLE;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/UOR_INSTALL_VIEW.vw b/grbsrc/ODBCAPTURE/UOR_INSTALL_VIEW.vw
new file mode 100644
index 0000000..7b8adaf
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/UOR_INSTALL_VIEW.vw
@@ -0,0 +1,55 @@
+
+--
+-- Create ODBCAPTURE.UOR_INSTALL_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."UOR_INSTALL_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.UOR_INSTALL_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."UOR_INSTALL_VIEW" ("INSTALL_TYPE", "USER_OR_ROLE", "UOR_TYPE", "EXT", "NOTES") AS
+ select sc.install_type
+ ,sc.username USER_OR_ROLE
+ ,'USER' UOR_TYPE
+ ,otc.ext
+ ,sc.notes
+ from schema_conf sc
+ join otype_conf otc
+ on otc.install_otype = 'USER'
+UNION ALL
+select rl.install_type
+ ,rl.rolename USER_OR_ROLE
+ ,'ROLE' UOR_TYPE
+ ,otc.ext
+ ,rl.notes
+ from role_conf rl
+ join otype_conf otc
+ on otc.install_otype = 'ROLE';
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.UOR_INSTALL_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZIP_FILES.tab b/grbsrc/ODBCAPTURE/ZIP_FILES.tab
new file mode 100644
index 0000000..39b3f14
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZIP_FILES.tab
@@ -0,0 +1,35 @@
+
+--
+-- Create ODBCAPTURE.ZIP_FILES Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ZIP_FILES
+
+ CREATE TABLE "ODBCAPTURE"."ZIP_FILES"
+ ( "FILE_NAME" VARCHAR2(1000 BYTE),
+ "DATE_CREATED" DATE DEFAULT sysdate,
+ "FILE_SIZE" NUMBER(38,0) DEFAULT 0,
+ "FILE_BLOB" BLOB
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "ODBCAPTURE"."ZIP_FILES" ADD CONSTRAINT "ZIP_FILES_PK" PRIMARY KEY ("FILE_NAME")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ZIP_FILES
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pbody b/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pbody
new file mode 100644
index 0000000..7625d90
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pbody
@@ -0,0 +1,539 @@
+
+--
+-- Create ODBCAPTURE.ZIP_UTIL_PKG Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ZIP_UTIL_PKG
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ODBCAPTURE"."ZIP_UTIL_PKG"
+is
+
+ /*
+
+ Purpose: Package handles zipping and unzipping of files
+
+ Remarks: by Anton Scheffer, see http://forums.oracle.com/forums/thread.jspa?messageID=9289744#9289744
+
+ for unzipping, see http://technology.amis.nl/blog/8090/parsing-a-microsoft-word-docx-and-unzip-zipfiles-with-plsql
+ for zipping, see http://forums.oracle.com/forums/thread.jspa?threadID=1115748&tstart=0
+
+ Who Date Description
+ ------ ---------- --------------------------------
+ MBR 09.01.2011 Created
+ MBR 21.05.2012 Fixed a bug related to use of dbms_lob.substr in get_file (use dbms_lob.copy instead)
+
+ */
+
+ function raw2num(
+ p_value in raw
+ )
+ return number
+ is
+ begin -- note: FFFFFFFF => -1
+ return utl_raw.cast_to_binary_integer( p_value
+ , utl_raw.little_endian
+ );
+ end;
+--
+ function file2blob(
+ p_dir in varchar2
+ , p_file_name in varchar2
+ )
+ return blob
+ is
+ file_lob bfile;
+ file_blob blob;
+ begin
+ file_lob := bfilename( p_dir
+ , p_file_name
+ );
+ dbms_lob.open( file_lob
+ , dbms_lob.file_readonly
+ );
+ dbms_lob.createtemporary( file_blob
+ , true
+ );
+ dbms_lob.loadfromfile( file_blob
+ , file_lob
+ , dbms_lob.lobmaxsize
+ );
+ dbms_lob.close( file_lob );
+ return file_blob;
+ exception
+ when others
+ then
+ if dbms_lob.isopen( file_lob ) = 1
+ then
+ dbms_lob.close( file_lob );
+ end if;
+ if dbms_lob.istemporary( file_blob ) = 1
+ then
+ dbms_lob.freetemporary( file_blob );
+ end if;
+ raise;
+ end;
+--
+ function raw2varchar2(
+ p_raw in raw
+ , p_encoding in varchar2
+ )
+ return varchar2
+ is
+ begin
+ return nvl
+ ( utl_i18n.raw_to_char( p_raw
+ , p_encoding
+ )
+ , utl_i18n.raw_to_char
+ ( p_raw
+ , utl_i18n.map_charset( p_encoding
+ , utl_i18n.generic_context
+ , utl_i18n.iana_to_oracle
+ )
+ )
+ );
+ end;
+ function get_file_list(
+ p_dir in varchar2
+ , p_zip_file in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return t_file_list
+ is
+ begin
+ return get_file_list( file2blob( p_dir
+ , p_zip_file
+ )
+ , p_encoding
+ );
+ end;
+--
+ function get_file_list(
+ p_zipped_blob in blob
+ , p_encoding in varchar2 := null
+ )
+ return t_file_list
+ is
+ t_ind integer;
+ t_hd_ind integer;
+ t_rv t_file_list;
+ begin
+ t_ind := dbms_lob.getlength( p_zipped_blob ) - 21;
+ loop
+ exit when dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_ind
+ ) = hextoraw( '504B0506' )
+ or t_ind < 1;
+ t_ind := t_ind - 1;
+ end loop;
+--
+ if t_ind <= 0
+ then
+ return null;
+ end if;
+--
+ t_hd_ind := raw2num( dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_ind + 16
+ ) ) + 1;
+ t_rv := t_file_list( );
+ t_rv.extend( raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_ind + 10
+ ) ) );
+ for i in 1 .. raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_ind + 8
+ ) )
+ loop
+ t_rv( i ) :=
+ raw2varchar2
+ ( dbms_lob.substr( p_zipped_blob
+ , raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 28
+ ) )
+ , t_hd_ind + 46
+ )
+ , p_encoding
+ );
+ t_hd_ind :=
+ t_hd_ind
+ + 46
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 28
+ ) )
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 30
+ ) )
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 32
+ ) );
+ end loop;
+--
+ return t_rv;
+ end;
+--
+ function get_file(
+ p_dir in varchar2
+ , p_zip_file in varchar2
+ , p_file_name in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return blob
+ is
+ begin
+ return get_file( file2blob( p_dir
+ , p_zip_file
+ )
+ , p_file_name
+ , p_encoding
+ );
+ end;
+--
+ function get_file(
+ p_zipped_blob in blob
+ , p_file_name in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return blob
+ is
+ t_tmp blob;
+ t_ind integer;
+ t_hd_ind integer;
+ t_fl_ind integer;
+ begin
+ t_ind := dbms_lob.getlength( p_zipped_blob ) - 21;
+ loop
+ exit when dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_ind
+ ) = hextoraw( '504B0506' )
+ or t_ind < 1;
+ t_ind := t_ind - 1;
+ end loop;
+--
+ if t_ind <= 0
+ then
+ return null;
+ end if;
+--
+ t_hd_ind := raw2num( dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_ind + 16
+ ) ) + 1;
+ for i in 1 .. raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_ind + 8
+ ) )
+ loop
+ if p_file_name =
+ raw2varchar2
+ ( dbms_lob.substr( p_zipped_blob
+ , raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 28
+ ) )
+ , t_hd_ind + 46
+ )
+ , p_encoding
+ )
+ then
+ if dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 10
+ ) = hextoraw( '0800' ) -- deflate
+ then
+ t_fl_ind :=
+ raw2num( dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_hd_ind + 42
+ ) );
+ t_tmp := hextoraw( '1F8B0800000000000003' ); -- gzip header
+ dbms_lob.copy( t_tmp
+ , p_zipped_blob
+ , raw2num( dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_fl_ind + 19
+ ) )
+ , 11
+ , t_fl_ind
+ + 31
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_fl_ind + 27
+ ) )
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_fl_ind + 29
+ ) )
+ );
+ dbms_lob.append( t_tmp
+ , dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_fl_ind + 15
+ )
+ );
+ dbms_lob.append( t_tmp
+ , dbms_lob.substr( p_zipped_blob, 4, t_fl_ind + 23 )
+ );
+ return utl_compress.lz_uncompress( t_tmp );
+ end if;
+--
+ if dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 10
+ ) =
+ hextoraw( '0000' )
+ -- The file is stored (no compression)
+ then
+ t_fl_ind :=
+ raw2num( dbms_lob.substr( p_zipped_blob
+ , 4
+ , t_hd_ind + 42
+ ) );
+
+ dbms_lob.createtemporary(t_tmp, cache => true);
+
+ dbms_lob.copy(dest_lob => t_tmp,
+ src_lob => p_zipped_blob,
+ amount => raw2num( dbms_lob.substr( p_zipped_blob, 4, t_fl_ind + 19)),
+ dest_offset => 1,
+ src_offset => t_fl_ind + 31 + raw2num(dbms_lob.substr(p_zipped_blob, 2, t_fl_ind + 27)) + raw2num(dbms_lob.substr( p_zipped_blob, 2, t_fl_ind + 29))
+ );
+
+ return t_tmp;
+
+ end if;
+
+ end if;
+ t_hd_ind :=
+ t_hd_ind
+ + 46
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 28
+ ) )
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 30
+ ) )
+ + raw2num( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_hd_ind + 32
+ ) );
+ end loop;
+--
+ return null;
+ end;
+--
+ function little_endian(
+ p_big in number
+ , p_bytes in pls_integer := 4
+ )
+ return raw
+ is
+ begin
+ return utl_raw.substr
+ ( utl_raw.cast_from_binary_integer( p_big
+ , utl_raw.little_endian
+ )
+ , 1
+ , p_bytes
+ );
+ end;
+--
+ procedure add_file(
+ p_zipped_blob in out nocopy blob
+ , p_name in varchar2
+ , p_content in blob
+ )
+ is
+ t_now date;
+ t_blob blob;
+ t_clen integer;
+ begin
+ t_now := sysdate;
+ t_blob := utl_compress.lz_compress( p_content );
+ t_clen := dbms_lob.getlength( t_blob );
+ if p_zipped_blob is null
+ then
+ dbms_lob.createtemporary( p_zipped_blob
+ , true
+ );
+ end if;
+ dbms_lob.append
+ ( p_zipped_blob
+ , utl_raw.concat
+ ( hextoraw( '504B0304' ) -- Local file header signature
+ , hextoraw( '1400' ) -- version 2.0
+ , hextoraw( '0000' ) -- no General purpose bits
+ , hextoraw( '0800' ) -- deflate
+ , little_endian
+ ( to_number( to_char( t_now
+ , 'ss'
+ ) ) / 2
+ + to_number( to_char( t_now
+ , 'mi'
+ ) ) * 32
+ + to_number( to_char( t_now
+ , 'hh24'
+ ) ) * 2048
+ , 2
+ ) -- File last modification time
+ , little_endian
+ ( to_number( to_char( t_now
+ , 'dd'
+ ) )
+ + to_number( to_char( t_now
+ , 'mm'
+ ) ) * 32
+ + ( to_number( to_char( t_now
+ , 'yyyy'
+ ) ) - 1980 ) * 512
+ , 2
+ ) -- File last modification date
+ , dbms_lob.substr( t_blob
+ , 4
+ , t_clen - 7
+ ) -- CRC-32
+ , little_endian( t_clen - 18 ) -- compressed size
+ , little_endian( dbms_lob.getlength( p_content ) )
+ -- uncompressed size
+ , little_endian( length( p_name )
+ , 2
+ ) -- File name length
+ , hextoraw( '0000' ) -- Extra field length
+ , utl_raw.cast_to_raw( p_name ) -- File name
+ )
+ );
+ dbms_lob.copy( p_zipped_blob
+ , t_blob
+ , t_clen - 18
+ , dbms_lob.getlength( p_zipped_blob ) + 1
+ , 11
+ ); -- compressed content
+ dbms_lob.freetemporary( t_blob );
+ end;
+--
+ procedure finish_zip(
+ p_zipped_blob in out nocopy blob
+ )
+ is
+ t_cnt pls_integer := 0;
+ t_offs integer;
+ t_offs_dir_header integer;
+ t_offs_end_header integer;
+ t_comment raw( 32767 )
+ := utl_raw.cast_to_raw( 'Implementation by Anton Scheffer' );
+ begin
+ t_offs_dir_header := dbms_lob.getlength( p_zipped_blob );
+ t_offs := dbms_lob.instr( p_zipped_blob
+ , hextoraw( '504B0304' )
+ , 1
+ );
+ while t_offs > 0
+ loop
+ t_cnt := t_cnt + 1;
+ dbms_lob.append
+ ( p_zipped_blob
+ , utl_raw.concat
+ ( hextoraw( '504B0102' )
+ -- Central directory file header signature
+ , hextoraw( '1400' ) -- version 2.0
+ , dbms_lob.substr( p_zipped_blob
+ , 26
+ , t_offs + 4
+ )
+ , hextoraw( '0000' ) -- File comment length
+ , hextoraw( '0000' ) -- Disk number where file starts
+ , hextoraw( '0100' ) -- Internal file attributes
+ , hextoraw( '2000B681' ) -- External file attributes
+ , little_endian( t_offs - 1 )
+ -- Relative offset of local file header
+ , dbms_lob.substr
+ ( p_zipped_blob
+ , utl_raw.cast_to_binary_integer
+ ( dbms_lob.substr( p_zipped_blob
+ , 2
+ , t_offs + 26
+ )
+ , utl_raw.little_endian
+ )
+ , t_offs + 30
+ ) -- File name
+ )
+ );
+ t_offs :=
+ dbms_lob.instr( p_zipped_blob
+ , hextoraw( '504B0304' )
+ , t_offs + 32
+ );
+ end loop;
+ t_offs_end_header := dbms_lob.getlength( p_zipped_blob );
+ dbms_lob.append
+ ( p_zipped_blob
+ , utl_raw.concat
+ ( hextoraw( '504B0506' ) -- End of central directory signature
+ , hextoraw( '0000' ) -- Number of this disk
+ , hextoraw( '0000' ) -- Disk where central directory starts
+ , little_endian
+ ( t_cnt
+ , 2
+ ) -- Number of central directory records on this disk
+ , little_endian( t_cnt
+ , 2
+ ) -- Total number of central directory records
+ , little_endian( t_offs_end_header - t_offs_dir_header )
+ -- Size of central directory
+ , little_endian
+ ( t_offs_dir_header )
+ -- Relative offset of local file header
+ , little_endian
+ ( nvl( utl_raw.length( t_comment )
+ , 0
+ )
+ , 2
+ ) -- ZIP file comment length
+ , t_comment
+ )
+ );
+ end;
+--
+ procedure save_zip(
+ p_zipped_blob in blob
+ , p_dir in varchar2
+ , p_filename in varchar2
+ )
+ is
+ t_fh utl_file.file_type;
+ t_len pls_integer := 32767;
+ begin
+ t_fh := utl_file.fopen( p_dir
+ , p_filename
+ , 'wb'
+ );
+ for i in 0 .. trunc( ( dbms_lob.getlength( p_zipped_blob ) - 1 ) / t_len )
+ loop
+ utl_file.put_raw( t_fh
+ , dbms_lob.substr( p_zipped_blob
+ , t_len
+ , i * t_len + 1
+ )
+ );
+ end loop;
+ utl_file.fclose( t_fh );
+ end;
+--
+
+end zip_util_pkg;
+/
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pspec b/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pspec
new file mode 100644
index 0000000..04740bc
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZIP_UTIL_PKG.pspec
@@ -0,0 +1,85 @@
+
+--
+-- Create ODBCAPTURE.ZIP_UTIL_PKG Package
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ZIP_UTIL_PKG
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "ODBCAPTURE"."ZIP_UTIL_PKG" authid definer
+is
+
+ /*
+
+ Purpose: Package handles zipping and unzipping of files
+
+ Remarks: by Anton Scheffer, see http://forums.oracle.com/forums/thread.jspa?messageID=9289744#9289744
+
+ for unzipping, see http://technology.amis.nl/blog/8090/parsing-a-microsoft-word-docx-and-unzip-zipfiles-with-plsql
+ for zipping, see http://forums.oracle.com/forums/thread.jspa?threadID=1115748&tstart=0
+
+ Who Date Description
+ ------ ---------- --------------------------------
+ MBR 09.01.2011 Created
+
+ */
+
+ type t_file_list is table of clob;
+--
+ function get_file_list(
+ p_dir in varchar2
+ , p_zip_file in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return t_file_list;
+--
+ function get_file_list(
+ p_zipped_blob in blob
+ , p_encoding in varchar2 := null /* Use CP850 for zip files created with a German Winzip to see umlauts, etc */
+ )
+ return t_file_list;
+--
+ function get_file(
+ p_dir in varchar2
+ , p_zip_file in varchar2
+ , p_file_name in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return blob;
+--
+ function get_file(
+ p_zipped_blob in blob
+ , p_file_name in varchar2
+ , p_encoding in varchar2 := null
+ )
+ return blob;
+--
+ procedure add_file(
+ p_zipped_blob in out nocopy blob
+ , p_name in varchar2
+ , p_content in blob
+ );
+--
+ procedure finish_zip(
+ p_zipped_blob in out nocopy blob
+ );
+--
+ procedure save_zip(
+ p_zipped_blob in blob
+ , p_dir in varchar2
+ , p_filename in varchar2
+ );
+
+end zip_util_pkg;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab
new file mode 100644
index 0000000..b698f3e
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab
@@ -0,0 +1,36 @@
+
+--
+-- Create ODBCAPTURE.ZX_OBJ_INSTALL_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ZX_OBJ_INSTALL_TAB
+
+ CREATE TABLE "ODBCAPTURE"."ZX_OBJ_INSTALL_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "OBJECT_OWNER" VARCHAR2(128 BYTE),
+ "OBJECT_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(23 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "FILTER_SELECTOR" VARCHAR2(4000 BYTE),
+ "SOURCE_VIEW" VARCHAR2(25 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ZX_OBJ_INSTALL_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind
new file mode 100644
index 0000000..a86a5c4
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.ZX_OBJ_INSTALL_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.ZX_OBJ_INSTALL_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."ZX_OBJ_INSTALL_TAB_IX1" ON "ODBCAPTURE"."ZX_OBJ_INSTALL_TAB" ("INSTALL_TYPE", "OBJECT_OWNER", "INSTALL_OTYPE")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw
new file mode 100644
index 0000000..e56281d
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw
@@ -0,0 +1,108 @@
+
+--
+-- Create ODBCAPTURE.ZX_OBJ_INSTALL_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."ZX_OBJ_INSTALL_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.ZX_OBJ_INSTALL_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."ZX_OBJ_INSTALL_VIEW" ("INSTALL_TYPE", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "INSTALL_OTYPE", "FILTER_SELECTOR", "SOURCE_VIEW") AS
+ select install_type
+ ,base_table_owner OBJECT_OWNER
+ ,foreign_key_name OBJECT_NAME
+ ,NULL OBJECT_TYPE
+ ,install_otype
+ ,nvl2(install_type_selector, 'SEL:' || install_type_selector, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_FKEY_TAB' SOURCE_VIEW
+ from obj_install_fkey_tab
+UNION ALL
+select install_type
+ ,trigger_owner OBJECT_OWNER
+ ,trigger_name OBJECT_NAME
+ ,object_type
+ ,install_otype
+ ,nvl2(install_type_selector, 'SEL:' || install_type_selector, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_TRIGGER_TAB' SOURCE_VIEW
+ from obj_install_trigger_tab
+UNION ALL
+select install_type
+ ,object_owner
+ ,object_name
+ ,object_type
+ ,install_otype
+ ,nvl2(oname_filter, 'FLTR:' || oname_filter, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_OBJECT_TAB' SOURCE_VIEW
+ from obj_install_object_tab
+ where object_type not in ('INDEX', 'SYNONYM', 'TRIGGER')
+ and object_install_type not in ('sys','pub') -- Exclude 'sys' or 'pub' database objects
+UNION ALL
+select install_type
+ ,synonym_owner OBJECT_OWNER
+ ,synonym_name OBJECT_NAME
+ ,object_type
+ ,install_otype
+ ,nvl2(install_type_selector, 'SEL:' || install_type_selector, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_SYNONYM_TAB' SOURCE_VIEW
+ from obj_install_synonym_TAB
+UNION ALL
+select install_type
+ ,index_owner OBJECT_OWNER
+ ,index_name OBJECT_NAME
+ ,object_type
+ ,install_otype
+ ,nvl2(install_type_selector, 'SEL:' || install_type_selector, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_INDEX_TAB' SOURCE_VIEW
+ from obj_install_index_tab
+UNION ALL
+select install_type
+ ,context_owner OBJECT_OWNER
+ ,context_name OBJECT_NAME
+ ,context_type OBJECT_TYPE
+ ,install_otype
+ ,NULL FILTER_SELECTOR
+ ,'OBJ_INSTALL_CONTEXT_TAB' SOURCE_VIEW
+ from obj_install_context_tab
+UNION ALL
+select install_type
+ ,table_owner OBJECT_OWNER
+ ,table_name OBJECT_NAME
+ ,NULL OBJECT_TYPE
+ ,install_otype
+ ,nvl2(where_clause, 'FLTR:' || where_clause, NULL)
+ FILTER_SELECTOR
+ ,'OBJ_INSTALL_DATA_LOAD_TAB' SOURCE_VIEW
+ from obj_install_data_load_tab;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ZX_OBJ_INSTALL_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tab b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tab
new file mode 100644
index 0000000..abd6bbc
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tab
@@ -0,0 +1,38 @@
+
+--
+-- Create ODBCAPTURE.ZX_PRIV_ALL_TAB Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:ODBCAPTURE.ZX_PRIV_ALL_TAB
+
+ CREATE TABLE "ODBCAPTURE"."ZX_PRIV_ALL_TAB"
+ ( "INSTALL_TYPE" VARCHAR2(10 BYTE),
+ "INSTALL_TYPE_SELECTOR" VARCHAR2(8 BYTE),
+ "OBJECT_OWNER" VARCHAR2(128 BYTE),
+ "OBJECT_NAME" VARCHAR2(128 BYTE),
+ "OBJECT_TYPE" VARCHAR2(24 BYTE),
+ "GRANTEE" VARCHAR2(128 BYTE),
+ "GRANTEE_UOR_TYPE" CHAR(4 BYTE),
+ "INSTALL_OTYPE" VARCHAR2(20 BYTE),
+ "SOURCE_VIEW" VARCHAR2(27 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ZX_PRIV_ALL_TAB
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind
new file mode 100644
index 0000000..aeedc5e
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for ODBCAPTURE.ZX_PRIV_ALL_TAB TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "INDEX" Index
+
+--DBMS_METADATA:ODBCAPTURE.ZX_PRIV_ALL_TAB_IX1
+
+ CREATE INDEX "ODBCAPTURE"."ZX_PRIV_ALL_TAB_IX1" ON "ODBCAPTURE"."ZX_PRIV_ALL_TAB" ("INSTALL_TYPE", "OBJECT_OWNER", "INSTALL_OTYPE")
+ ;
+
+set define on
diff --git a/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw
new file mode 100644
index 0000000..6732d03
--- /dev/null
+++ b/grbsrc/ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw
@@ -0,0 +1,104 @@
+
+--
+-- Create ODBCAPTURE.ZX_PRIV_ALL_VIEW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "ODBCAPTURE"."ZX_PRIV_ALL_VIEW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:ODBCAPTURE.ZX_PRIV_ALL_VIEW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "ODBCAPTURE"."ZX_PRIV_ALL_VIEW" ("INSTALL_TYPE", "INSTALL_TYPE_SELECTOR", "OBJECT_OWNER", "OBJECT_NAME", "OBJECT_TYPE", "GRANTEE", "GRANTEE_UOR_TYPE", "INSTALL_OTYPE", "SOURCE_VIEW") AS
+ select install_type
+ ,install_type_selector
+ ,queue_owner OBJECT_OWNER
+ ,queue_name OBJECT_NAME
+ ,'QUEUE_REGISTER' OBJECT_TYPE
+ ,consumer_name GRANTEE
+ ,consumer_uor_type GRANTEE_UOR_TYPE
+ ,'QUEUE' INSTALL_OTYPE
+ ,'PRIV_QUEUE_REGISTER_VIEW' SOURCE_VIEW
+ from priv_queue_register_view
+UNION ALL
+select install_type
+ ,install_type_selector
+ ,queue_owner OBJECT_OWNER
+ ,queue_name OBJECT_NAME
+ ,'QUEUE_SUBSCRIBE' OBJECT_TYPE
+ ,consumer_name GRANTEE
+ ,consumer_uor_type GRANTEE_UOR_TYPE
+ ,'QUEUE' INSTALL_OTYPE
+ ,'PRIV_QUEUE_SUSCRIBE_VIEW' SOURCE_VIEW
+ from priv_queue_subscribe_view
+UNION ALL
+select install_type
+ ,install_type_selector
+ ,object_owner
+ ,object_name
+ ,object_type
+ ,grantee
+ ,grantee_uor_type
+ ,install_otype
+ ,'PRIV_OBJ_INSTALL_VW' SOURCE_VIEW
+ from priv_obj_install_vw
+ where object_type != 'QUEUE'
+UNION ALL
+select install_type
+ ,install_type_selector
+ ,'SYS' OBJECT_OWNER
+ ,rolename OBJECT_NAME
+ ,'ROLE' OBJECT_TYPE
+ ,grantee
+ ,grantee_uor_type
+ ,'ROLE' INSTALL_OTYPE
+ ,'PRIV_ROLE_PRIVILEGES_VIEW' SOURCE_VIEW
+ from priv_role_privileges_view
+UNION ALL
+select install_type
+ ,install_type_selector
+ ,'SYS' OBJECT_OWNER
+ ,system_privilege_name OBJECT_NAME
+ ,'SYSTEM_PRIVILEGE' OBJECT_TYPE
+ ,grantee
+ ,grantee_uor_type
+ ,'SYSTEM_PRIVILEGE' INSTALL_OTYPE
+ ,'PRIV_SYSTEM_PRIVILEGES_VIEW' SOURCE_VIEW
+ from priv_system_privileges_view
+UNION ALL
+select install_type
+ ,install_type_selector
+ ,object_owner
+ ,object_name
+ ,object_type
+ ,grantee
+ ,grantee_uor_type
+ ,'SYSOBJ_PRIVILEGES' INSTALL_OTYPE
+ ,'PRIV_SYSOBJ_PRIVILEGES_VIEW' SOURCE_VIEW
+ from priv_sysobj_privileges_view;
+
+-- Comments
+
+--DBMS_METADATA:ODBCAPTURE.ZX_PRIV_ALL_VIEW
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/grbsrc/SYS/ODBCAPTURE.usr b/grbsrc/SYS/ODBCAPTURE.usr
new file mode 100644
index 0000000..3509141
--- /dev/null
+++ b/grbsrc/SYS/ODBCAPTURE.usr
@@ -0,0 +1,107 @@
+
+--
+-- Create ODBCAPTURE Schema
+--
+
+set define off
+
+create user "ODBCAPTURE"
+ identified by "ODBCAPTURE"
+ default tablespace USERS
+ temporary tablespace TEMP
+ profile DEFAULT
+ quota 512M on USERS
+;
+
+-- Grant SYS Objects (but not directories)
+
+grant SELECT on "SYS"."DBA_ALL_TABLES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_ASSOCIATIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_AUDIT_POLICIES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_AUDIT_TRAIL" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CLUSTERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_COL_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CONSTRAINTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CONS_COLUMNS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CONTEXT" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CUBES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CUBE_BUILD_PROCESSES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_CUBE_DIMENSIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_DB_LINKS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_DEPENDENCIES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_DIMENSIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_DIRECTORIES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_EDITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_EDITION_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_EVALUATION_CONTEXTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_HOST_ACES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_INDEXES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_INDEXTYPES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_INDEXTYPE_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_IND_COLUMNS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_IND_PARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_IND_SUBPARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_JAVA_CLASSES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_JAVA_POLICY" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_LIBRARIES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_LOBS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_LOB_PARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_LOB_SUBPARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_MEASURE_FOLDERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_MINING_MODELS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_MVIEWS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_MVIEW_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_MVIEW_LOGS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_NESTED_TABLES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_OBJECTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_OPERATORS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_OPERATOR_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_PDBS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_PDB_HISTORY" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_PROCEDURES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_PROFILES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_QUEUES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_QUEUE_SCHEDULES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_QUEUE_SUBSCRIBERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_QUEUE_TABLES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_REWRITE_EQUIVALENCES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_ROLES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_ROLE_PRIVS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_RSRC_CONSUMER_GROUPS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_RSRC_PLANS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_RULES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_RULE_SETS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_CHAINS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_CREDENTIALS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_DESTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_FILE_WATCHERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_GROUPS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_JOBS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_JOB_CLASSES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_PROGRAMS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_PROGRAM_ARGS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_SCHEDULES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SCHEDULER_WINDOWS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SEQUENCES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SOURCE" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SUBSCR_REGISTRATIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SYNONYMS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_SYS_PRIVS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TABLES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_COLS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_COLUMNS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_COMMENTS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_IDENTITY_COLS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_PARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_PRIVS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TAB_SUBPARTITIONS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TRIGGERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TS_QUOTAS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_TYPES" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_USERS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_VIEWS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_XML_SCHEMAS" to "ODBCAPTURE";
+grant SELECT on "SYS"."DBA_XML_TABLES" to "ODBCAPTURE";
+grant INHERIT PRIVILEGES on USER "SYS" to "ODBCAPTURE";
+
+set define on
diff --git a/grbsrc/SYSTEM/GRAB_SCRIPTS_DIR.dir b/grbsrc/SYSTEM/GRAB_SCRIPTS_DIR.dir
new file mode 100644
index 0000000..abe9d25
--- /dev/null
+++ b/grbsrc/SYSTEM/GRAB_SCRIPTS_DIR.dir
@@ -0,0 +1,25 @@
+
+--
+-- Create GRAB_SCRIPTS_DIR Database Directory
+--
+-- Because directories are created based on permissions, granting
+-- directory access to users/roles in different install types
+-- will result in duplicate CREATE DIRECTORY scripts
+--
+
+set define off
+
+
+create or replace directory "GRAB_SCRIPTS_DIR"
+ as '/opt/install_files';
+
+
+-- Grants
+
+grant EXECUTE on directory "GRAB_SCRIPTS_DIR" to "ODBCAPTURE" with grant option;
+
+grant READ on directory "GRAB_SCRIPTS_DIR" to "ODBCAPTURE" with grant option;
+
+grant WRITE on directory "GRAB_SCRIPTS_DIR" to "ODBCAPTURE" with grant option;
+
+set define on
diff --git a/grbsrc/SYSTEM/ODBCAPTURE_usr.grnt b/grbsrc/SYSTEM/ODBCAPTURE_usr.grnt
new file mode 100644
index 0000000..d30949a
--- /dev/null
+++ b/grbsrc/SYSTEM/ODBCAPTURE_usr.grnt
@@ -0,0 +1,53 @@
+
+--
+-- Create ODBCAPTURE Grants
+--
+
+set define off
+
+
+-- Database System Privileges
+
+--DBMS_METADATA:ODBCAPTURE
+
+ GRANT UNLIMITED TABLESPACE TO "ODBCAPTURE";
+ GRANT PURGE DBA_RECYCLEBIN TO "ODBCAPTURE";
+
+-- "sys" INSTALL_TYPE Role Grants
+-- "GRANTEE" (delayed) Role Grants
+-- Note: "OBJECT" Schema Object Grants are given during Role creation
+
+grant "CONNECT" to "ODBCAPTURE";
+grant "DBA" to "ODBCAPTURE";
+grant "EXP_FULL_DATABASE" to "ODBCAPTURE";
+grant "JAVASYSPRIV" to "ODBCAPTURE";
+grant "RESOURCE" to "ODBCAPTURE";
+grant "SELECT_CATALOG_ROLE" to "ODBCAPTURE";
+
+
+-- "sys" INSTALL_TYPE Schema Object Grants, excluding SYS objects
+-- "GRANTEE" (delayed) Schema Object Grants
+-- Note: "OBJECT" Schema Object Grants are given during object creation
+
+
+
+-- Advanced Queue System Privileges
+
+
+
+-- Advanced Queue Grants
+-- "GRANTEE" (Delayed) Advanced Queue Grants
+-- Note: "QUEUE" Advanced Queue Grants are given during object creation
+
+-- Advanced Queue Subscriptions
+-- "GRANTEE" (Delayed) Advanced Queue Subscription
+-- Note: "QUEUE" Advanced Queue Subscriptions are given during object creation
+
+
+
+-- "GRANTEE" (Delayed) Fine-Grained Java Permissions
+-- Note: "JAVA_CLASS" Fine-Grained Java Permissions are given during object creation
+--
+
+
+set define on
diff --git a/grbsrc/SYSTEM/create_directories.bat b/grbsrc/SYSTEM/create_directories.bat
new file mode 100644
index 0000000..8a8c65b
--- /dev/null
+++ b/grbsrc/SYSTEM/create_directories.bat
@@ -0,0 +1,11 @@
+
+REM
+REM Create Directories for Windows
+REM
+
+md \opt\install_files
+
+REM set db_owner=oracle
+
+REM icacls \opt\install_files /grant %db_owner%:F /T
+
diff --git a/grbsrc/SYSTEM/create_directories.sh b/grbsrc/SYSTEM/create_directories.sh
new file mode 100644
index 0000000..062cef7
--- /dev/null
+++ b/grbsrc/SYSTEM/create_directories.sh
@@ -0,0 +1,9 @@
+
+#
+# Create Directories for Linux
+#
+
+mkdir -p /opt/install_files
+
+chmod 777 /opt/install_files
+
diff --git a/grbsrc/alter_foreign_keys.sql b/grbsrc/alter_foreign_keys.sql
new file mode 100644
index 0000000..3b2caca
--- /dev/null
+++ b/grbsrc/alter_foreign_keys.sql
@@ -0,0 +1,88 @@
+
+--
+-- Alter "grbsrc" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Foreign Keys for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/grbsrc/alter_queues.sql b/grbsrc/alter_queues.sql
new file mode 100644
index 0000000..a9c6f04
--- /dev/null
+++ b/grbsrc/alter_queues.sql
@@ -0,0 +1,36 @@
+
+--
+-- Alter "grbsrc" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Queues for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/grbsrc/alter_scheduler_jobs.sql b/grbsrc/alter_scheduler_jobs.sql
new file mode 100644
index 0000000..14e15d1
--- /dev/null
+++ b/grbsrc/alter_scheduler_jobs.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "grbsrc" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Scheduler Jobs for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/grbsrc/alter_triggers.sql b/grbsrc/alter_triggers.sql
new file mode 100644
index 0000000..6dac58c
--- /dev/null
+++ b/grbsrc/alter_triggers.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "grbsrc" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Triggers for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/grbsrc/compile_all.sql b/grbsrc/compile_all.sql
new file mode 100644
index 0000000..28b5597
--- /dev/null
+++ b/grbsrc/compile_all.sql
@@ -0,0 +1,36 @@
+
+--
+-- Compile All "grbsrc" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+ dbms_output.put_line('Compile All for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/grbsrc/db_build_junit_report.sql b/grbsrc/db_build_junit_report.sql
new file mode 100644
index 0000000..bc48207
--- /dev/null
+++ b/grbsrc/db_build_junit_report.sql
@@ -0,0 +1,113 @@
+
+--
+-- Create JUnit XML Report of Database Build Status for "grbsrc" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+ do_it('ODBCAPTURE');
+ ot('');
+end;
+/
+
diff --git a/grbsrc/db_install.sql b/grbsrc/db_install.sql
new file mode 100644
index 0000000..7ec0dce
--- /dev/null
+++ b/grbsrc/db_install.sql
@@ -0,0 +1,55 @@
+
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+/
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+/
+set feedback on
diff --git a/grbsrc/fix_invalid_public_synonyms.sql b/grbsrc/fix_invalid_public_synonyms.sql
new file mode 100644
index 0000000..ef70282
--- /dev/null
+++ b/grbsrc/fix_invalid_public_synonyms.sql
@@ -0,0 +1,49 @@
+
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+/
+
diff --git a/grbsrc/install.sql b/grbsrc/install.sql
new file mode 100644
index 0000000..8a1fbb3
--- /dev/null
+++ b/grbsrc/install.sql
@@ -0,0 +1,75 @@
+
+--
+-- Master Installation Script
+-- All scripts created by "https://ODBCapture.org", Version V2.1
+--
+-- Must be run as SYS
+--
+-- Command Line Parameters:
+-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the pluggable database.
+-- The Data Load installation requires this connection information.
+--
+
+-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:
+-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv
+
+define TOP_PDB_SYSTEM="&1."
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt Identify this Module in V$SESSION
+set appinfo "grbsrc Installation"
+
+----------------------------------------
+prompt Setup Abort on Error
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+----------------------------------------
+prompt
+prompt **************************
+prompt * Run SYS Installation *
+prompt **************************
+prompt
+@install_sys.sql "" "" ""
+
+----------------------------------------
+prompt Setup Continue on Error
+WHENEVER SQLERROR CONTINUE
+WHENEVER OSERROR CONTINUE
+
+----------------------------------------
+prompt
+prompt *****************************
+prompt * Run SYSTEM Installation *
+prompt *****************************
+prompt
+connect &TOP_PDB_SYSTEM.
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+@install_system.sql "" "" ""
+
+----------------------------------------
+prompt
+prompt *************************
+prompt * Install Application *
+prompt *************************
+prompt
+@install_grbsrc.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+prompt
+prompt *****************
+prompt * Run Reports *
+prompt *****************
+prompt
+@report_status.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+set appinfo "Null"
+set appinfo off
+prompt
+prompt "grbsrc" Installation is Done.
diff --git a/grbsrc/install_grbsrc.sql b/grbsrc/install_grbsrc.sql
new file mode 100644
index 0000000..7920575
--- /dev/null
+++ b/grbsrc/install_grbsrc.sql
@@ -0,0 +1,142 @@
+
+--
+-- grbsrc Installation Script
+--
+-- Must be run as a SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+spool install_grbsrc.log
+
+define INSTALL_SYSTEM_CONNECT="&1."
+
+-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages
+set sqlprefix "~"
+
+-- Using "^P", CHR(16), DLE as an escape character
+set escape OFF
+set escape ""
+
+----------------------------------------
+-- Prepare for Install
+@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE Install
+
+@db_install.sql "ODBCAPTURE/COMMON_UTIL.pspec" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/GRAB_SCRIPTS.pspec" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROOT_SCRIPTS.pspec" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZIP_UTIL_PKG.pspec" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE Install
+
+@db_install.sql "ODBCAPTURE/DBA_DEPENDENCIES_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_OBJECTS_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_TAB_PRIVS_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DLOAD_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/INSTALL_TYPE_TIMING.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJECT_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OTYPE_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROLE_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/SCHEMA_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/TYPE_CONF.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZIP_FILES.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_PRIV_ALL_TAB.tab" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- DATA_LOAD Install
+
+@db_install.sql "ODBCAPTURE/DLOAD_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJECT_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OTYPE_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROLE_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/SCHEMA_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/TYPE_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- INDEX Install
+
+@db_install.sql "ODBCAPTURE/DBA_DEPENDENCIES_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_OBJECTS_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_TAB_PRIVS_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_CONTEXT_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_FKEY_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_INDEX_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_OBJECT_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_SYNONYM_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_TRIGGER_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_OBJ_INSTALL_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_PRIV_ALL_TAB.tabind" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- VIEW Install
+
+@db_install.sql "ODBCAPTURE/AQ_SYSTEM_PRIVS_VW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_DEPENDENCIES_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_OBJECTS_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/DBA_TAB_PRIVS_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_COMMENTS_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_CONTEXT_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_DATA_LOAD_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_FKEY_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_INDEX_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_OBJECT_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_SYNONYM_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJ_INSTALL_TRIGGER_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_OBJ_DIR_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_OBJ_INSTALL_VW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_OBJ_JAVA_FG_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_OBJ_QUEUE_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_OBJ_XDBACL_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_QUEUE_REGISTER_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_QUEUE_SUBSCRIBE_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_QUEUE_SYSPRIVS_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_ROLE_PRIVILEGES_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_SYSOBJ_PRIVILEGES_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/PRIV_SYSTEM_PRIVILEGES_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/SCHEMA_OBJECTS_VW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/UOR_INSTALL_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_OBJ_INSTALL_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZX_PRIV_ALL_VIEW.vw" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE BODY Install
+
+@db_install.sql "ODBCAPTURE/COMMON_UTIL.pbody" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/GRAB_SCRIPTS.pbody" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROOT_SCRIPTS.pbody" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ZIP_UTIL_PKG.pbody" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE_FOREIGN_KEY Install
+
+@db_install.sql "ODBCAPTURE/DLOAD_CONF.tabfk" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJECT_CONF.tabfk" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROLE_CONF.tabfk" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/SCHEMA_CONF.tabfk" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/TYPE_CONF.tabfk" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- Finalize Installation
+@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+spool off
+
diff --git a/grbsrc/install_sys.sql b/grbsrc/install_sys.sql
new file mode 100644
index 0000000..66baae8
--- /dev/null
+++ b/grbsrc/install_sys.sql
@@ -0,0 +1,23 @@
+
+--
+-- SYS Installation Script
+--
+-- Must be run as SYS
+--
+
+spool install_sys.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+-- USER Install
+
+@db_install.sql "SYS/ODBCAPTURE.usr" "" ""
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/grbsrc/install_system.sql b/grbsrc/install_system.sql
new file mode 100644
index 0000000..6f02480
--- /dev/null
+++ b/grbsrc/install_system.sql
@@ -0,0 +1,28 @@
+
+--
+-- SYSTEM Installation Script
+--
+-- Must be run as SYSTEM
+--
+
+spool install_system.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+-- DIRECTORY Install
+
+@db_install.sql "SYSTEM/GRAB_SCRIPTS_DIR.dir" "" ""
+
+----------------------------------------
+-- GRANT Install
+
+@db_install.sql "SYSTEM/ODBCAPTURE_usr.grnt" "" ""
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/grbsrc/installation_finalize.sql b/grbsrc/installation_finalize.sql
new file mode 100644
index 0000000..7660714
--- /dev/null
+++ b/grbsrc/installation_finalize.sql
@@ -0,0 +1,48 @@
+
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."
diff --git a/grbsrc/installation_prepare.sql b/grbsrc/installation_prepare.sql
new file mode 100644
index 0000000..265eb55
--- /dev/null
+++ b/grbsrc/installation_prepare.sql
@@ -0,0 +1,9 @@
+
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;
diff --git a/grbsrc/list_invalids.csv b/grbsrc/list_invalids.csv
new file mode 100644
index 0000000..e2d4f25
--- /dev/null
+++ b/grbsrc/list_invalids.csv
@@ -0,0 +1 @@
+"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"
diff --git a/grbsrc/list_invalids.sql b/grbsrc/list_invalids.sql
new file mode 100644
index 0000000..401147d
--- /dev/null
+++ b/grbsrc/list_invalids.sql
@@ -0,0 +1,48 @@
+
+--
+-- List Invalid Objects for "grbsrc" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+ do_it('ODBCAPTURE');
+end;
+/
+
diff --git a/grbsrc/log_files_junit_report.sql b/grbsrc/log_files_junit_report.sql
new file mode 100644
index 0000000..0529656
--- /dev/null
+++ b/grbsrc/log_files_junit_report.sql
@@ -0,0 +1,283 @@
+
+--
+-- Create JUnit XML Report of Database Log Files for "grbsrc" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_grbsrc
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = 'grbsrc'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+/
+
diff --git a/grbsrc/odbcapture_installation_logs.cdl b/grbsrc/odbcapture_installation_logs.cdl
new file mode 100644
index 0000000..efb09a6
--- /dev/null
+++ b/grbsrc/odbcapture_installation_logs.cdl
@@ -0,0 +1,71 @@
+
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+/
+
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/grbsrc/odbcapture_installation_logs.csv b/grbsrc/odbcapture_installation_logs.csv
new file mode 100644
index 0000000..09a99ae
--- /dev/null
+++ b/grbsrc/odbcapture_installation_logs.csv
@@ -0,0 +1,9 @@
+"grbsrc","install_sys.log"
+"grbsrc","install_system.log"
+"grbsrc","install_grbsrc.log"
+"grbsrc","ODBCAPTURE/DLOAD_CONF.log"
+"grbsrc","ODBCAPTURE/OBJECT_CONF.log"
+"grbsrc","ODBCAPTURE/OTYPE_CONF.log"
+"grbsrc","ODBCAPTURE/ROLE_CONF.log"
+"grbsrc","ODBCAPTURE/SCHEMA_CONF.log"
+"grbsrc","ODBCAPTURE/TYPE_CONF.log"
diff --git a/grbsrc/odbcapture_installation_logs.ctl b/grbsrc/odbcapture_installation_logs.ctl
new file mode 100644
index 0000000..7688189
--- /dev/null
+++ b/grbsrc/odbcapture_installation_logs.ctl
@@ -0,0 +1,8 @@
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )
diff --git a/grbsrc/report_status.sql b/grbsrc/report_status.sql
new file mode 100644
index 0000000..e42e6ca
--- /dev/null
+++ b/grbsrc/report_status.sql
@@ -0,0 +1,115 @@
+
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = 'grbsrc'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+/
+
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
+
diff --git a/grbsrc/update_id_sequences.sql b/grbsrc/update_id_sequences.sql
new file mode 100644
index 0000000..0fb6ff6
--- /dev/null
+++ b/grbsrc/update_id_sequences.sql
@@ -0,0 +1,59 @@
+
+--
+-- Update "grbsrc" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Update ID Sequences for grbsrc Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/releases/wtplsql_core_install_1.0.0.zip b/releases/wtplsql_core_install_1.0.0.zip
deleted file mode 100644
index f413d56..0000000
Binary files a/releases/wtplsql_core_install_1.0.0.zip and /dev/null differ
diff --git a/src/core/README.txt b/src/core/README.txt
deleted file mode 100644
index bb08fe8..0000000
--- a/src/core/README.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-
- White Box PL/SQL Testing
- src/core/README.txt
-
-FILE DESCRIPTION
----------------------- -----------------------
-downgrades Folder of downgrade scripts for this release
-upgrades Folder of upgrade scripts for this release
-common_setup.sql Common setup script. Contains values for install/uninstall.
-install.sql Install script. Run as SYSTEM.
-installO.LST Example of a successfull install.
-proftab.sql DBMS_PROFILER tables. Copied from ?/rdbms/admin/proftab.sql.
-proftab_comments.sql Table/column comments on DBMS_PROFILER tables.
-RELEASE_NOTES.txt Release Notes for this release
-test_all.sql SQL script to execute all Test Runners.
-test_allO.LST Example of successful results from all Test Runners.
-uninstall.sql Uninstall script. Run as SYSTEM.
-uninstallO.LST Example of a successfull uninstall.
-wt_assert.pkb WT_ASSERT package body.
-wt_assert.pks WT_ASSERT package specification.
-wt_dbout_profiles.tab WT_DBOUT_PROFILES table.
-wt_profiler.pkb WT_PROFILER package body.
-wt_profiler.pks WT_PROFILER package specification.
-wt_result.pkb WT_RESULT package body.
-wt_result.pks WT_RESULT package specification.
-wt_results.tab WT_RESULTS table.
-wt_self_test.tab WT_SELF_TEST Table and Data. Used for self-test
-wt_test_run_stat.pkb WT_TEST_RUN_STAT package body.
-wt_test_run_stat.pks WT_TEST_RUN_STAT package specification.
-wt_test_run_stats.tab WT_TEST_RUN_STATS table.
-wt_test_runs.tab WT_TEST_RUNS table.
-wt_testcase_stats.tab WT_TESTCASE_STATS table.
-wt_text_report.pkb WT_TEXT_REPORT package body.
-wt_text_report.pks WT_TEXT_REPORT package specification.
-wt_version.tab WT_VERSION table.
-wtplsql.pkb WTPLSQL package body.
-wtplsql.pks WTPLSQL package specification.
-
-
-NOTE: "install.sql" creates PUBLIC SYNONYMS.
-
-
-Install Procedure:
-------------------
-1) sqlplus SYS/password as SYSDBA @install
-2) exit
-3) Compare install.LST to installO.LST
-
-
-UnInstall Procedure:
---------------------
-1) sqlplus SYS/password as SYSDBA @uninstall
-2) exit
-3) Compare uninstall.LST to uninstallO.LST
diff --git a/src/core/RELEASE_NOTES.txt b/src/core/RELEASE_NOTES.txt
deleted file mode 100644
index c326ffd..0000000
--- a/src/core/RELEASE_NOTES.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-
-wtPLSQL 1.1.0 Release Notes:
-
-New Features:
--------------
- -) Added THROWS assertion.
- -) Fully implemented the utPLSQL V1 UT_ASSERT API for implemented assertions.
- -) Exceptions from "query" assertions are now handled.
- -) Streamlined WT_TEXT_REPORT output.
- -) Added WT_TEST_RUN_STATS and WT_TESTCASE_STATS summary tables.
- -) Added comments to DBMS_PROFILER tables.
- -) Changed ANNO annotation to IGNR in WT_DBOUT_PROFILES table.
- -) Added units to time columns in WT_DBOUT_PROFILES table.
- -) Improved robustness of WT_PROFILER package.
- -) Corrected problems with wtPLSQL non-owner testing.
-
-Detailed Changes:
------------------
-Permission Changes:
- revoke connect, resource from &schema_owner.;
- revoke select, insert, delete on plsql_profiler_runs from public;
- revoke select, insert, delete on plsql_profiler_units from public;
- revoke select, insert, delete on plsql_profiler_data from public;
- revoke insert on wt_results from public;
- revoke insert on wt_dbout_profiles from public;
- revoke update on wt_dbout_profiles from public;
- alter user &schema_owner. quota unlimited on USERS;
- grant create session to &schema_owner.;
- grant create type to &schema_owner.;
- grant create sequence to &schema_owner.;
- grant create table to &schema_owner.;
- grant create trigger to &schema_owner.;
- grant create view to &schema_owner.;
- grant create procedure to &schema_owner.;
- grant select on dba_source to &schema_owner.;
- grant select on dba_objects to &schema_owner.;
- grant select on wt_test_runs_seq to public;
- grant execute on wtplsql to public;
- grant execute on wt_assert to public;
- grant execute on wt_text_report to public;
-Public Synonym Changes:
- drop public synonym wt_not_executable;
- drop public synonym plsql_profiler_runs;
- drop public synonym plsql_profiler_units;
- drop public synonym plsql_profiler_data;
- drop public synonym wt_profiler;
- drop public synonym wt_result;
- create or replace public synonym utassert for &schema_owner..wt_assert;
- create or replace public synonym wt_version for &schema_owner..wt_version;
- create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq;
- create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats;
- create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats;
- create or replace public synonym wt_self_test for &schema_owner..wt_self_test;
- grant select on plsql_profiler_runnumber to public;
-Add Profile Table Comments
- @proftab_comments.sql
-Table Changes:
- drop table wt_test_data;
- wt_version.tab
- wt_testcase_stats.tab
- wt_test_run_stats.tab
- wt_self_test.tab
- wt_test_runs.tab
- @wt_results.tab
- alter table wt_results rename column elapsed_msecs to interval_msecs;
- comment on column wt_results.interval_msecs
- alter table wt_dbout_profiles rename column total_time to total_usecs;
- alter table wt_dbout_profiles rename column min_time to min_usecs;
- alter table wt_dbout_profiles rename column max_time to max_usecs;
- comment on column wt_dbout_profiles.status
- comment on column wt_dbout_profiles.total_usecs
- comment on column wt_dbout_profiles.min_usecs
- comment on column wt_dbout_profiles.max_usecs
- alter table wt_dbout_profiles drop constraint wt_dbout_profiles_ck1;
- update wt_dbout_profiles set status = 'IGNR' where status = 'ANNO';
- alter table wt_dbout_profiles add constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN'));
- update_all_stats.sql
-Packages:
- wtplsql.pks
- wtplsql.pkb
- wt_result.pks
- wt_result.pkb
- wt_assert.pks
- wt_assert.pkb
- wt_profiler.pks
- wt_profiler.pkb
- wt_test_run_stat.pks
- wt_test_run_stat.pkb
- wt_text_report.pks
- wt_text_report.pkb
diff --git a/src/core/common_setup.sql b/src/core/common_setup.sql
deleted file mode 100644
index ff9afb4..0000000
--- a/src/core/common_setup.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-
---
--- Core Installation
---
-
--- Enable SQL*Plus Variables
-set define "&"
-set concat "."
-
-accept schema_owner CHAR default 'wtp' -
-prompt 'Enter Schema Name (WTP): '
diff --git a/src/core/install.sql b/src/core/install.sql
deleted file mode 100644
index b2e32eb..0000000
--- a/src/core/install.sql
+++ /dev/null
@@ -1,183 +0,0 @@
-
---
--- Core Installation
---
--- Run as System
---
-
--- Capture output
-spool install
-set showmode off
-set serveroutput on size unlimited format truncated
-
--- Shared Setup Script
-@common_setup.sql
-
-WHENEVER SQLERROR exit SQL.SQLCODE
-
-begin
- if USER not in ('SYS','SYSTEM')
- then
- raise_application_error (-20000,
- 'Not logged in as SYS');
- end if;
-end;
-/
-
-WHENEVER SQLERROR continue
-
--- Create the schema owner.
-
-create user &schema_owner. identified by &schema_owner.
- default tablespace users
- quota unlimited on users
- temporary tablespace temp;
-
-grant create session to &schema_owner.;
-grant create type to &schema_owner.;
-grant create sequence to &schema_owner.;
-grant create table to &schema_owner.;
-grant create trigger to &schema_owner.;
-grant create view to &schema_owner.;
-grant create procedure to &schema_owner.;
-grant select on dba_source to &schema_owner.;
-
--- This MUST be run by SYS.
-grant select on dba_objects to &schema_owner.;
-
-begin
- for buff in (select p.value PLSQL_CCFLAGS
- from dual d
- left join v$parameter p
- on p.name in 'plsql_ccflags')
- loop
- dbms_output.put_line('PLSQL_CCFLAGS Before: ' || buff.PLSQL_CCFLAGS);
- end loop;
-end;
-/
-
--- This block is IDEMPOTENT. It can run more than once and give
--- the same result.
-declare
- C_FLAG CONSTANT varchar2(100) := 'WTPLSQL_ENABLE:';
- parm_value v$parameter.value%TYPE;
- procedure set_plsql_ccflags (in_value in varchar2) is begin
- execute immediate 'alter system set PLSQL_CCFLAGS = ''' ||
- in_value || ''' scope=BOTH';
- end set_plsql_ccflags;
-begin
- select value into parm_value
- from v$parameter
- where name in 'plsql_ccflags';
- if nvl(length(parm_value),0) = 0
- then
- -- No Flags have been set
- set_plsql_ccflags(C_FLAG || 'TRUE');
- elsif instr(parm_value, C_FLAG) = 0
- then
- -- C_FLAG is not already present
- set_plsql_ccflags(C_FLAG || 'TRUE, ' || parm_value);
- end if;
-end;
-/
-
-begin
- for buff in (select p.value PLSQL_CCFLAGS
- from dual d
- left join v$parameter p
- on p.name in 'plsql_ccflags')
- loop
- dbms_output.put_line('PLSQL_CCFLAGS After: ' || buff.PLSQL_CCFLAGS);
- end loop;
-end;
-/
-
--- Public Synonyms
-
-create or replace public synonym wt_version for &schema_owner..wt_version;
-create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq;
-create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs;
-create or replace public synonym wt_results for &schema_owner..wt_results;
-create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles;
-create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats;
-create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats;
-create or replace public synonym wt_self_test for &schema_owner..wt_self_test;
-
-create or replace public synonym utassert for &schema_owner..wt_assert;
-create or replace public synonym wt_assert for &schema_owner..wt_assert;
-create or replace public synonym wt_text_report for &schema_owner..wt_text_report;
-create or replace public synonym wt_wtplsql for &schema_owner..wtplsql;
-create or replace public synonym wtplsql for &schema_owner..wtplsql;
-
-
-WHENEVER SQLERROR exit SQL.SQLCODE
-
--- Connect as SCHEMA_OWNER
-connect &schema_owner./&schema_owner.
-set serveroutput on size unlimited format truncated
-
-begin
- if USER != upper('&schema_owner')
- then
- raise_application_error (-20000,
- 'Not logged in as &schema_owner');
- end if;
-end;
-/
-
-WHENEVER SQLERROR continue
-
---
--- Run Oracle's Profiler Table Installation
--- Note1: Tables converted to Global Temporary
--- Note2: Includes "Drop Table" and "Drop Sequence" statements
---
-@proftab.sql
-@proftab_comments.sql
---
-create index plsql_profiler_runs_idx1
- on plsql_profiler_runs (run_date);
-
--- Core Tables
-@wt_version.tab
-@wt_test_runs.tab
-@wt_results.tab
-@wt_dbout_profiles.tab
-@wt_test_run_stats.tab
-@wt_testcase_stats.tab
-@wt_self_test.tab
-
--- Package Specifications
-@wtplsql.pks
-/
-@wt_result.pks
-/
-@wt_assert.pks
-/
-@wt_profiler.pks
-/
-@wt_test_run_stat.pks
-/
-@wt_text_report.pks
-/
-
-grant execute on wtplsql to public;
-grant execute on wt_assert to public;
-grant execute on wt_text_report to public;
-
--- Package Bodies
-@wtplsql.pkb
-/
-@wt_result.pkb
-/
-@wt_assert.pkb
-/
-@wt_profiler.pkb
-/
-@wt_test_run_stat.pkb
-/
-@wt_text_report.pkb
-/
-
-set showmode on
-spool off
diff --git a/src/core/installO.LST b/src/core/installO.LST
deleted file mode 100644
index 184178c..0000000
--- a/src/core/installO.LST
+++ /dev/null
@@ -1,667 +0,0 @@
-old: showmode BOTH
-
-PL/SQL procedure successfully completed.
-
-old:create user &schema_owner. identified by &schema_owner.
- default tablespace users
- quota unlimited on users
- temporary tablespace temp
-new:create user wtp identified by wtp
- default tablespace users
- quota unlimited on users
- temporary tablespace temp
-
-User WTP created.
-
-old:grant create session to &schema_owner.
-new:grant create session to wtp
-
-Grant succeeded.
-
-old:grant create type to &schema_owner.
-new:grant create type to wtp
-
-Grant succeeded.
-
-old:grant create sequence to &schema_owner.
-new:grant create sequence to wtp
-
-Grant succeeded.
-
-old:grant create table to &schema_owner.
-new:grant create table to wtp
-
-Grant succeeded.
-
-old:grant create trigger to &schema_owner.
-new:grant create trigger to wtp
-
-Grant succeeded.
-
-old:grant create view to &schema_owner.
-new:grant create view to wtp
-
-Grant succeeded.
-
-old:grant create procedure to &schema_owner.
-new:grant create procedure to wtp
-
-Grant succeeded.
-
-old:grant select on dba_source to &schema_owner.
-new:grant select on dba_source to wtp
-
-Grant succeeded.
-
-old:grant select on dba_objects to &schema_owner.
-new:grant select on dba_objects to wtp
-
-Grant succeeded.
-
-PLSQL_CCFLAGS Before: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE
-
-
-PL/SQL procedure successfully completed.
-
-
-PL/SQL procedure successfully completed.
-
-PLSQL_CCFLAGS After: WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE
-
-
-PL/SQL procedure successfully completed.
-
-old:create or replace public synonym wt_version for &schema_owner..wt_version
-new:create or replace public synonym wt_version for wtp.wt_version
-
-Synonym WT_VERSION created.
-
-old:create or replace public synonym wt_test_runs_seq for &schema_owner..wt_test_runs_seq
-new:create or replace public synonym wt_test_runs_seq for wtp.wt_test_runs_seq
-
-Synonym WT_TEST_RUNS_SEQ created.
-
-old:create or replace public synonym wt_test_runs for &schema_owner..wt_test_runs
-new:create or replace public synonym wt_test_runs for wtp.wt_test_runs
-
-Synonym WT_TEST_RUNS created.
-
-old:create or replace public synonym wt_results for &schema_owner..wt_results
-new:create or replace public synonym wt_results for wtp.wt_results
-
-Synonym WT_RESULTS created.
-
-old:create or replace public synonym wt_dbout_profiles for &schema_owner..wt_dbout_profiles
-new:create or replace public synonym wt_dbout_profiles for wtp.wt_dbout_profiles
-
-Synonym WT_DBOUT_PROFILES created.
-
-old:create or replace public synonym wt_test_run_stats for &schema_owner..wt_test_run_stats
-new:create or replace public synonym wt_test_run_stats for wtp.wt_test_run_stats
-
-Synonym WT_TEST_RUN_STATS created.
-
-old:create or replace public synonym wt_testcase_stats for &schema_owner..wt_testcase_stats
-new:create or replace public synonym wt_testcase_stats for wtp.wt_testcase_stats
-
-Synonym WT_TESTCASE_STATS created.
-
-old:create or replace public synonym wt_self_test for &schema_owner..wt_self_test
-new:create or replace public synonym wt_self_test for wtp.wt_self_test
-
-Synonym WT_SELF_TEST created.
-
-old:create or replace public synonym utassert for &schema_owner..wt_assert
-new:create or replace public synonym utassert for wtp.wt_assert
-
-Synonym UTASSERT created.
-
-old:create or replace public synonym wt_assert for &schema_owner..wt_assert
-new:create or replace public synonym wt_assert for wtp.wt_assert
-
-Synonym WT_ASSERT created.
-
-old:create or replace public synonym wt_text_report for &schema_owner..wt_text_report
-new:create or replace public synonym wt_text_report for wtp.wt_text_report
-
-Synonym WT_TEXT_REPORT created.
-
-old:create or replace public synonym wt_wtplsql for &schema_owner..wtplsql
-new:create or replace public synonym wt_wtplsql for wtp.wtplsql
-
-Synonym WT_WTPLSQL created.
-
-old:create or replace public synonym wtplsql for &schema_owner..wtplsql
-new:create or replace public synonym wtplsql for wtp.wtplsql
-
-Synonym WTPLSQL created.
-
-Connected.
-old:begin
- if USER != upper('&schema_owner')
- then
- raise_application_error (-20000,
- 'Not logged in as &schema_owner');
- end if;
-end;
-
-new:begin
- if USER != upper('wtp')
- then
- raise_application_error (-20000,
- 'Not logged in as wtp');
- end if;
-end;
-
-PL/SQL procedure successfully completed.
-
-
-Error starting at line : 46 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql
-In command -
-drop table plsql_profiler_data cascade constraints
-Error report -
-ORA-00942: table or view does not exist
-00942. 00000 - "table or view does not exist"
-*Cause:
-*Action:
-
-Error starting at line : 47 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql
-In command -
-drop table plsql_profiler_units cascade constraints
-Error report -
-ORA-00942: table or view does not exist
-00942. 00000 - "table or view does not exist"
-*Cause:
-*Action:
-
-Error starting at line : 48 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql
-In command -
-drop table plsql_profiler_runs cascade constraints
-Error report -
-ORA-00942: table or view does not exist
-00942. 00000 - "table or view does not exist"
-*Cause:
-*Action:
-
-Error starting at line : 50 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\core\proftab.sql
-In command -
-drop sequence plsql_profiler_runnumber
-Error report -
-ORA-02289: sequence does not exist
-02289. 00000 - "sequence does not exist"
-*Cause: The specified sequence does not exist, or the user does
- not have the required privilege to perform this operation.
-*Action: Make sure the sequence name is correct, and that you have
- the right to perform the desired operation on this sequence.
-
-Table PLSQL_PROFILER_RUNS created.
-
-
-Comment created.
-
-
-Table PLSQL_PROFILER_UNITS created.
-
-
-Comment created.
-
-
-Table PLSQL_PROFILER_DATA created.
-
-
-Comment created.
-
-
-Sequence PLSQL_PROFILER_RUNNUMBER created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Index PLSQL_PROFILER_RUNS_IDX1 created.
-
-
-Table WT_VERSION created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-1 row inserted.
-
-
-Commit complete.
-
-
-Grant succeeded.
-
-
-Sequence WT_TEST_RUNS_SEQ created.
-
-
-Grant succeeded.
-
-
-Table WT_TEST_RUNS created.
-
-
-Index WT_TEST_RUNS_IDX1 created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Table WT_RESULTS created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Table WT_DBOUT_PROFILES created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Table WT_TEST_RUN_STATS created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Table WT_TESTCASE_STATS created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Table WT_SELF_TEST created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Comment created.
-
-
-Trigger WT_SELF_TEST$TEST compiled
-
-
-PL/SQL procedure successfully completed.
-
-
-Commit complete.
-
-
-Package WTPLSQL compiled
-
-
-Package WT_RESULT compiled
-
-
-Package WT_ASSERT compiled
-
-
-Package WT_PROFILER compiled
-
-
-Package WT_TEST_RUN_STAT compiled
-
-
-Package WT_TEXT_REPORT compiled
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Grant succeeded.
-
-
-Package Body WTPLSQL compiled
-
-
-Package Body WT_RESULT compiled
-
-
-Package Body WT_ASSERT compiled
-
-
-Package Body WT_PROFILER compiled
-
-
-Package Body WT_TEST_RUN_STAT compiled
-
-
-Package Body WT_TEXT_REPORT compiled
-
-new: showmode BOTH
diff --git a/src/core/proftab.sql b/src/core/proftab.sql
deleted file mode 100644
index 1ccf0a0..0000000
--- a/src/core/proftab.sql
+++ /dev/null
@@ -1,112 +0,0 @@
-Rem
-Rem $Header: proftab.sql 07-oct-99.11:04:02 jmuller Exp $
-Rem
-Rem proftab.sql
-Rem
-Rem Copyright (c) Oracle Corporation 1998, 1999. All Rights Reserved.
-Rem
-Rem NAME
-Rem proftab.sql
-Rem
-Rem DESCRIPTION
-Rem Create tables for the PL/SQL profiler
-Rem
-Rem NOTES
-Rem The following tables are required to collect data:
-Rem plsql_profiler_runs - information on profiler runs
-Rem plsql_profiler_units - information on each lu profiled
-Rem plsql_profiler_data - profiler data for each lu profiled
-Rem
-Rem The plsql_profiler_runnumber sequence is used for generating unique
-Rem run numbers.
-Rem
-Rem The tables and sequence can be created in the schema for each user
-Rem who wants to gather profiler data. Alternately these tables can be
-Rem created in a central schema. In the latter case the user creating
-Rem these objects is responsible for granting appropriate privileges
-Rem (insert,update on the tables and select on the sequence) to all
-Rem users who want to store data in the tables. Appropriate synonyms
-Rem must also be created so the tables are visible from other user
-Rem schemas.
-Rem
-Rem The other tables are used for rolling up to line level; the views are
-Rem used to roll up across multiple runs. These are not required to
-Rem collect data, but help with analysis of the gathered data.
-Rem
-Rem THIS SCRIPT DELETES ALL EXISTING DATA!
-Rem
-Rem MODIFIED (MM/DD/YY)
-Rem jmuller 10/07/99 - Fix bug 708690: TAB -> blank
-Rem astocks 04/19/99 - Add owner,related_run field to runtab
-Rem astocks 10/21/98 - Add another spare field
-Rem ciyer 09/15/98 - Create tables for profiler
-Rem ciyer 09/15/98 - Created
-Rem
-
-drop table plsql_profiler_data cascade constraints;
-drop table plsql_profiler_units cascade constraints;
-drop table plsql_profiler_runs cascade constraints;
-
-drop sequence plsql_profiler_runnumber;
-
-create table plsql_profiler_runs
-(
- runid number primary key, -- unique run identifier,
- -- from plsql_profiler_runnumber
- related_run number, -- runid of related run (for client/
- -- server correlation)
- run_owner varchar2(32), -- user who started run
- run_date date, -- start time of run
- run_comment varchar2(2047), -- user provided comment for this run
- run_total_time number, -- elapsed time for this run
- run_system_info varchar2(2047), -- currently unused
- run_comment1 varchar2(2047), -- additional comment
- spare1 varchar2(256) -- unused
-);
-
-comment on table plsql_profiler_runs is
- 'Run-specific information for the PL/SQL profiler';
-
-create table plsql_profiler_units
-(
- runid number references plsql_profiler_runs,
- unit_number number, -- internally generated library unit #
- unit_type varchar2(32), -- library unit type
- unit_owner varchar2(32), -- library unit owner name
- unit_name varchar2(32), -- library unit name
- -- timestamp on library unit, can be used to detect changes to
- -- unit between runs
- unit_timestamp date,
- total_time number DEFAULT 0 NOT NULL,
- spare1 number, -- unused
- spare2 number, -- unused
- --
- primary key (runid, unit_number)
-);
-
-comment on table plsql_profiler_units is
- 'Information about each library unit in a run';
-
-create table plsql_profiler_data
-(
- runid number, -- unique (generated) run identifier
- unit_number number, -- internally generated library unit #
- line# number not null, -- line number in unit
- total_occur number, -- number of times line was executed
- total_time number, -- total time spent executing line
- min_time number, -- minimum execution time for this line
- max_time number, -- maximum execution time for this line
- spare1 number, -- unused
- spare2 number, -- unused
- spare3 number, -- unused
- spare4 number, -- unused
- --
- primary key (runid, unit_number, line#),
- foreign key (runid, unit_number) references plsql_profiler_units
-);
-
-comment on table plsql_profiler_data is
- 'Accumulated data from all profiler runs';
-
-create sequence plsql_profiler_runnumber start with 1 nocache;
-
diff --git a/src/core/proftab_comments.sql b/src/core/proftab_comments.sql
deleted file mode 100644
index 1294d2a..0000000
--- a/src/core/proftab_comments.sql
+++ /dev/null
@@ -1,42 +0,0 @@
-
---
--- Comments taken from
--- Oracle Database Online Documentation 11g Release 2 (11.2)
--- Database PL/SQL Packages and Types Reference
--- https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_profil.htm#ARPLS67461
---
-
-comment on table PLSQL_PROFILER_RUNS is 'Table of profiler runs for DBMS_PROFILER';
-comment on column PLSQL_PROFILER_RUNS.runid is '(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber';
-comment on column PLSQL_PROFILER_RUNS.related_run is 'Runid of related run (for client/server correlation)';
-comment on column PLSQL_PROFILER_RUNS.run_owner is 'User who started run';
-comment on column PLSQL_PROFILER_RUNS.run_date is 'Start time of run';
-comment on column PLSQL_PROFILER_RUNS.run_comment is 'User provided comment for this run';
-comment on column PLSQL_PROFILER_RUNS.run_total_time is 'Elapsed time for this run in nanoseconds';
-comment on column PLSQL_PROFILER_RUNS.run_system_info is 'Currently unused';
-comment on column PLSQL_PROFILER_RUNS.run_comment1 is 'Additional comment';
-comment on column PLSQL_PROFILER_RUNS.spare1 is 'Unused';
-
-comment on table PLSQL_PROFILER_UNITS is 'Table of program units for DBMS_PROFILER';
-comment on column PLSQL_PROFILER_UNITS.runid is '(Primary key) References plsql_profiler_runs';
-comment on column PLSQL_PROFILER_UNITS.unit_number is '(Primary key) Internally generated library unit #';
-comment on column PLSQL_PROFILER_UNITS.unit_type is 'Library unit type';
-comment on column PLSQL_PROFILER_UNITS.unit_owner is 'Library unit owner name';
-comment on column PLSQL_PROFILER_UNITS.unit_name is 'Library unit name timestamp on library unit';
-comment on column PLSQL_PROFILER_UNITS.unit_timestamp is 'In the future will be used to detect changes to unit between runs';
-comment on column PLSQL_PROFILER_UNITS.total_time is 'Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools';
-comment on column PLSQL_PROFILER_UNITS.spare1 is 'Unused';
-comment on column PLSQL_PROFILER_UNITS.spare2 is 'Unused';
-
-comment on table PLSQL_PROFILER_DATA is 'Table of program units for DBMS_PROFILER';
-comment on column PLSQL_PROFILER_DATA.runid is 'Primary key, unique (generated) run identifier';
-comment on column PLSQL_PROFILER_DATA.unit_number is 'Primary key, internally generated library unit number';
-comment on column PLSQL_PROFILER_DATA.line# is 'Primary key, not null, line number in unit';
-comment on column PLSQL_PROFILER_DATA.total_occur is 'Number of times line was executed';
-comment on column PLSQL_PROFILER_DATA.total_time is 'Total time spent executing line in nanoseconds';
-comment on column PLSQL_PROFILER_DATA.min_time is 'Minimum execution time for this line in nanoseconds';
-comment on column PLSQL_PROFILER_DATA.max_time is 'Maximum execution time for this line in nanoseconds';
-comment on column PLSQL_PROFILER_DATA.spare1 is 'Unused';
-comment on column PLSQL_PROFILER_DATA.spare2 is 'Unused';
-comment on column PLSQL_PROFILER_DATA.spare3 is 'Unused';
-comment on column PLSQL_PROFILER_DATA.spare4 is 'Unused';
diff --git a/src/core/test_all.sql b/src/core/test_all.sql
deleted file mode 100644
index f7b516f..0000000
--- a/src/core/test_all.sql
+++ /dev/null
@@ -1,36 +0,0 @@
-
-spool test_all
-set serveroutput on size unlimited format wrapped
-set linesize 1000
-set trimspool on
-
-/*
-
-alter system
- set PLSQL_CCFLAGS = 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
- --set PLSQL_CCFLAGS = 'WTPLSQL_ENABLE:TRUE'
- scope=BOTH;
-
-select p.value PLSQL_CCFLAGS
- from dual d
- left join v$parameter p
- on p.name in 'plsql_ccflags';
-
-begin
- $IF $$WTPLSQL_SELFTEST
- $THEN
- dbms_output.put_line('WTPLSQL_SELFTEST is TRUE');
- $END
- dbms_output.put_line('Check WTPLSQL_SELFTEST is Done.');
-end;
-/
-
-*/
-
-begin
- wtplsql.test_all;
- wt_text_report.dbms_out(in_detail_level => 30);
-end;
-/
-
-spool off
diff --git a/src/core/test_allO.LST b/src/core/test_allO.LST
deleted file mode 100644
index d30fbbb..0000000
--- a/src/core/test_allO.LST
+++ /dev/null
@@ -1,4304 +0,0 @@
-
- wtPLSQL 1.1.0 - Run ID 5: 29-Jun-2018 03:21:58 PM
-
- Test Results for WTP.WTPLSQL
- Total Test Cases: 10 Total Assertions: 34
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 3 Error Assertions: 0
- Maximum Interval msec: 39 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- - WTP.WTPLSQL Test Result Details (Test Run ID 5)
------------------------------------------------------------
- ---- Test Case: Show Version Happy Path
- PASS 39ms Test Existing Version. ISNOTNULL - Expected NOT NULL and got "1.1.0"
- PASS 2ms Test New Version. EQ - Expected "TESTING" and got "TESTING"
- PASS 0ms Return to Existing Version. EQ - Expected "1.1.0" and got "1.1.0"
- ---- Test Case: CHECK_RUNNER Sad Path 1
- PASS 0ms Null RUNNER_NAME. EQ - Expected "ORA-20001: RUNNER_NAME is null" and got "ORA-20001: RUNNER_NAME is null"
- ---- Test Case: CHECK_RUNNER Sad Path 2
- PASS 1ms Invalid RUNNER_NAME. EQ - Expected "ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid" and got "ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid"
- ---- Test Case: INSERT_TEST_RUN Happy Path 1
- PASS 3ms Number of Records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = 5
- PASS 2ms Records After Delete. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = 5
- ---- Test Case: INSERT_TEST_RUN Sad Path 1
- PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0"
- PASS 3ms Number of Records should stay the same. EQQUERYVALUE - Expected "4" and got "4" for Query: select count(*) from wt_test_runs
- PASS 0ms DBMS_OUTPUT Status. EQ - Expected "0" and got "0"
- PASS 0ms DBMS_OUTPUT Line. ISNOTNULL - Expected NOT NULL and got "ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")\nORA-06512: at "WTP.WTPLSQL", line 106\n"
- PASS 0ms Confirm DBMS_OUTPUT Line text. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0"
- ---- Test Case: TEST_ALL Happy Path
- PASS 2ms test_all_aa.EXISTS('WTPLSQL'). THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: DELETE_RUNS Happy Path 1
- PASS 20ms Number of Records Before Insert. ISNOTNULL - Expected NOT NULL and got "1"
- PASS 0ms Number of Records Before Insert <= 20. THIS - Expected "TRUE" and got "TRUE"
- PASS 1ms Number of Records After Insert. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = 5
- PASS 23ms Number of Records After Delete. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = 5
- ---- Test Case: DELETE_RUNS Happy Path 2
- PASS 3ms Confirm number of records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL'
- PASS 3ms Check Added 20 records. EQQUERYVALUE - Expected "21" and got "21" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL'
- PASS 8ms Check number of records reduced. EQQUERYVALUE - Expected "20" and got "20" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL'
- PASS 3ms Confirm original number of records. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where runner_owner = 'WTP' and runner_name = 'WTPLSQL'
- ---- Test Case: DELETE_RUNS Sad Path 1
- PASS 2ms Delete Runs(-9995). ISNULL - Expected NULL and got ""
- ---- Test Case: TEST_RUNS_REC_AND_TABLE Happy Path
- PASS 0ms g_test_runs_rec.id. ISNOTNULL - Expected NOT NULL and got "5"
- PASS 0ms g_test_runs_rec.start_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.271000"
- PASS 0ms g_test_runs_rec.runner_owner. ISNOTNULL - Expected NOT NULL and got "WTP"
- PASS 0ms g_test_runs_rec.runner_name. EQ - Expected "WTPLSQL" and got "WTPLSQL"
- PASS 0ms g_test_runs_rec.dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms g_test_runs_rec.dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms g_test_runs_rec.dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms g_test_runs_rec.profiler_runid. ISNULL - Expected NULL and got ""
- PASS 0ms g_test_runs_rec.end_dtm. ISNULL - Expected NULL and got ""
- PASS 0ms g_test_runs_rec.error_message. ISNULL - Expected NULL and got ""
- PASS 2ms TEST_RUNS Record for this TEST_RUN. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUNS where id = '5'
-
-
- wtPLSQL 1.1.0 - Run ID 6: 29-Jun-2018 03:21:58 PM
-
- Test Results for WTP.WT_ASSERT
- Total Test Cases: 150 Total Assertions: 404
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 5 Error Assertions: 0
- Maximum Interval msec: 496 Test Yield: 100.00%
- Total Run Time (sec): 2.0
-
- Code Coverage for PACKAGE BODY WTP.WT_ASSERT
- Ignored Lines: 1103 Total Profiled Lines: 1464
- Excluded Lines: 7 Total Executed Lines: 309
- Minimum LineExec usec: 0 Not Executed Lines: 1
- Average LineExec usec: 344 Unknown Lines: 44
- Maximum LineExec usec: 68989 Code Coverage: 99.70%
- Trigger Source Offset: 0
-
- - WTP.WT_ASSERT Test Result Details (Test Run ID 6)
------------------------------------------------------------
- ---- Test Case: BOOLEAN_TO_STATUS
- PASS 172ms Test for "TRUE" conversion. EQ - Expected "TRUE" and got "TRUE"
- PASS 1ms Test for "FALSE" conversion. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms Test for NULL. ISNULL - Expected NULL and got ""
- ---- Test Case: COMPARE_QUERIES Bad Query Test 1
- PASS 3ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "ORA-06550: line 2, column 60:\nPL/SQL: ORA-00942: table or view does not exist\nORA-06550: line 2, column 18:\nPL/SQL: SQL Statement ignored\nORA-06550: line 2, column 11:\nPLS-00341: declaration of cursor 'CUR' is incomplete or malformed\nORA-06550: line 3, column 8:\nPL/SQL: Item ignored\nORA-06550: line 6, column 19:\nPLS-00320: the declaration of the type of this expression is incomplete or malformed\nORA-06550: line 6, column 4:\nPL/SQL: SQL Statement ignored\nFAILURE of Compare Query: with check_query as (select bogus123 from bogus456), against_query as (select bogus987 from bogus654), q1 as (select * from check_query MINUS select * from against_query), q2 as (select * from against_query MINUS select * from check_query) select * from q1 UNION select * from q2;"
- PASS 1ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: COMPARE_QUERIES Bad Query Test 2
- PASS 291ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Comparison Query: with check_query as (select table_name from user_tables), against_query as (select tablespace_name from user_tables), q1 as (select * from check_query MINUS select * from against_query), q2 as (select * from against_query MINUS select * from check_query) select * from q1 UNION select * from q2"
- PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: NLS Settings
- PASS 0ms get_NLS_DATE_FORMAT 1. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY"
- PASS 0ms get_NLS_DATE_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS" and got "DD-MON-YYYY HH24:MI:SS"
- PASS 1ms get_NLS_TIMESTAMP_FORMAT 2. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY"
- PASS 0ms get_NLS_TIMESTAMP_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS.FF6" and got "DD-MON-YYYY HH24:MI:SS.FF6"
- PASS 1ms get_NLS_TIMESTAMP_TZ_FORMAT 2. EQ - Expected "DD-MON-YYYY" and got "DD-MON-YYYY"
- PASS 0ms get_NLS_TIMESTAMP_TZ_FORMAT 2. EQ - Expected "DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM" and got "DD-MON-YYYY HH24:MI:SS.FF6 TZH:TZM"
- ---- Test Case: Last Values Tests
- PASS 0ms Last Pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms Last Assert. EQ - Expected "EQ" and got "EQ"
- PASS 0ms Last MSG. EQ - Expected "Last Assert" and got "Last Assert"
- PASS 0ms Last Details. EQ - Expected "Expected "Last Assert" and got "Last Assert"" and got "Expected "Last Assert" and got "Last Assert""
- ---- Test Case: RESET_GLOBALS
- PASS 0ms temp_testcase. ISNULL - Expected NULL and got ""
- PASS 0ms temp_rec.last_pass. ISNULL - Expected NULL and got ""
- PASS 0ms temp_rec.raise_exception. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_assert. ISNULL - Expected NULL and got ""
- PASS 1ms temp_rec.last_msg. ISNULL - Expected NULL and got ""
- PASS 0ms temp_rec.last_details. ISNULL - Expected NULL and got ""
- ---- Test Case: This Happy Path
- PASS 0ms Run Test. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "THIS" and got "THIS"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected "TRUE" and got "TRUE"" and got "Expected "TRUE" and got "TRUE""
- ---- Test Case: This Sad Path 1
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: This Sad Path 2
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: This Sad Path 3
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: EQ VARCHAR2 Happy Path 1
- PASS 0ms Run Test. EQ - Expected "X" and got "X"
- PASS 0ms temp_rec.last_pass value. ISNOTNULL - Expected NOT NULL and got "TRUE"
- PASS 0ms temp_rec.last_pass. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert value. ISNOTNULL - Expected NOT NULL and got "EQ"
- PASS 1ms temp_rec.last_assert. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_msg value. ISNOTNULL - Expected NOT NULL and got "Run Test"
- PASS 0ms temp_rec.last_msg. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "X" and got "X""
- PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Happy Path 2
- PASS 0ms Run Test. EQ - Expected "X" and got "X"
- ---- Test Case: EQ VARCHAR2 Happy Path 3
- PASS 0ms Run Test. EQ - Expected "" and got ""
- ---- Test Case: EQ VARCHAR2 Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "X"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Sad Path 2
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Sad Path 3
- PASS 0ms check_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Sad Path 4
- PASS 0ms check_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms against_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Sad Path 5
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "X"
- PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ VARCHAR2 Sad Path 6
- PASS 0ms check_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "Y"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ ROWID Happy Path 1
- PASS 0ms Run Test. EQ - Expected "AAAFd1AAFAAAABSAA/" and got "AAAFd1AAFAAAABSAA/"
- ---- Test Case: EQ ROWID Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "AAAFd1AAFAAAABSAA/"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "AAAFd1AAFAAAABSAB/"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ LONG Happy Path 1
- PASS 0ms Run Test. EQ - Expected "0123456789ABCDEF0123456789ABCDEF" and got "0123456789ABCDEF0123456789ABCDEF"
- ---- Test Case: EQ LONG Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "0123456789ABCDEF0123456789ABCDEF"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "FEDCBA9876543210FEDCBA9876543210"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ RAW Happy Path 1
- PASS 0ms Run Test. EQ - Expected "2345" and got "2345"
- ---- Test Case: EQ RAW Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "2345"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "6789"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ LANG RAW Happy Path 1
- PASS 0ms Run Test. EQ - Expected "0123456789ABCDEF0123456789ABCDEF" and got "0123456789ABCDEF0123456789ABCDEF"
- ---- Test Case: EQ LONG RAW Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "0123456789ABCDEF0123456789ABCDEF"
- PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "FEDCBA9876543210FEDCBA9876543210"
- PASS 0ms Sad Path 1. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ NVARCHAR2 Happy Path 1
- PASS 0ms Run Test. EQ - Expected "NCHAR1" and got "NCHAR1"
- ---- Test Case: EQ NVARCHAR2 Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "NCHAR1"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "NCHAR2"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ BOOLEAN Happy Path 1
- PASS 0ms Run Test. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: EQ BOOLEAN Happy Path 2
- PASS 0ms Run Test. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: EQ BOOLEAN Happy Path 3
- PASS 0ms Run Test. EQ - Expected "" and got ""
- ---- Test Case: EQ BOOLEAN Happy Sad 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "TRUE"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ BOOLEAN Happy Sad 2
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE"
- PASS 0ms against_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ BOOLEAN Happy Sad 3
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE"
- PASS 1ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "TRUE"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ BOOLEAN Happy Sad 4
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "FALSE"
- PASS 0ms against_this_in value. ISNULL - Expected NULL and got ""
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ NUMBER Happy Path 1
- PASS 0ms Run Test. EQ - Expected "4" and got "4"
- ---- Test Case: EQ NUMBER Happy Path 2
- PASS 0ms Run Test. EQ - Expected "9876543210987654321098765432109876543210" and got "9876543210987654321098765432109876543210"
- ---- Test Case: EQ NUMBER Happy Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "4"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "5"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ PLS_INTEGER Happy Path 1
- PASS 0ms Run Test. EQ - Expected "2" and got "2"
- ---- Test Case: EQ PLS_INTEGER Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "2"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "3"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ DATE Happy Path 1
- PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58" and got "29-JUN-2018 15:21:58"
- ---- Test Case: EQ DATE Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58"
- PASS 2ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ TIMSETAMP Happy Path 1
- PASS 0ms EQ TIMSETAMP Happy Path 1. EQ - Expected "29-JUN-2018 15:21:58.278000" and got "29-JUN-2018 15:21:58.278000"
- ---- Test Case: EQ TIMSETAMP Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1
- PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58.278000 -05:00" and got "29-JUN-2018 15:21:58.278000 -05:00"
- ---- Test Case: EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ TIMSETAMP WITH TIME ZONE Happy Path 1
- PASS 0ms Run Test. EQ - Expected "29-JUN-2018 15:21:58.278000 -05:00" and got "29-JUN-2018 15:21:58.278000 -05:00"
- ---- Test Case: EQ TIMSETAMP WITH TIME ZONE Sad Path 1
- PASS 1ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:21:58.278000 -05:00"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 16:21:58"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ INTERVAL DAY TO SECOND Happy Path 1
- PASS 0ms Run Test. EQ - Expected "+01 01:01:01.001000" and got "+01 01:01:01.001000"
- ---- Test Case: EQ INTERVAL DAY TO SECOND Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "+01 01:01:01.001000"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "+02 02:02:02.002000"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ INTERVAL YEAR TO MONTH Happy Path 1
- PASS 0ms Run Test. EQ - Expected "+01-01" and got "+01-01"
- ---- Test Case: EQ INTERVAL YEAR TO MONTH Sad Path 1
- PASS 0ms check_this_in value. ISNOTNULL - Expected NOT NULL and got "+01-01"
- PASS 0ms against_this_in value. ISNOTNULL - Expected NOT NULL and got "+02-02"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ XMLTYPE Happy Path 1
- PASS 58ms Run Test. EQ - Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " and got "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n "
- PASS 1ms temp_rec.last_pass value. ISNOTNULL - Expected NOT NULL and got "TRUE"
- PASS 0ms temp_rec.last_pass. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms g_rec.last_assert value. ISNOTNULL - Expected NOT NULL and got "EQ"
- PASS 0ms temp_rec.last_assert. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_msg value. ISNOTNULL - Expected NOT NULL and got "Run Test"
- PASS 0ms temp_rec.last_msg. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " and got "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n \n 4730\n GS35F4543G\n 0\n \n \n \n 2007-05-04 00:00:00\n 20
-07-04-15 00:00:00\n 2008-04-14 00:00:002"
- PASS 0ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ XMLTYPE Sad Path 2
- PASS 21ms last_pass = FALSE. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQ CLOB Happy Path 1
- PASS 3ms Run Test. EQ - Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 0
-0:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n 2007-04-15 00:00:00\n 2008-04-14 00:00:00\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n 2016-02-16 13:10:02\n \n \n \n \n 1625\n DOLF072J11595\n 0\n 0\n \n 4730\n GS35F4543G\n 0\n \n 2007-05-04 00:00:00\n
- 2007-04-15 00:00:00\n 2008-04-1"
- PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNOTNULL CLOB Sad Path 1
- PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNOTNULL CLOB Sad Path 2
- PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNOTNULL BLOB Happy Path 1
- PASS 0ms Run Test. ISNOTNULL - BLOB is NOT NULL
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "ISNOTNULL" and got "ISNOTNULL"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "BLOB is NOT NULL" and got "BLOB is NOT NULL"
- ---- Test Case: ISNOTNULL BLOB Sad Path 1
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNOTNULL BLOB Sad Path 2
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNULL VARCHAR2 Happy Path 1
- PASS 0ms Run Test. ISNULL - Expected NULL and got ""
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected NULL and got """ and got "Expected NULL and got """
- ---- Test Case: ISNULL VARCHAR2 Sad Path 1
- PASS 1ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNULL VARCHAR2 Sad Path 2
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNULL BOOLEAN Happy Path 1
- PASS 0ms Run Test. ISNULL - Expected NULL and got ""
- ---- Test Case: ISNULL BOOLEAN Sad Path 1
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNULL BOOLEAN Sad Path 2
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNULL CLOB Happy Path 1
- PASS 1ms Run Test. ISNULL - Expected NULL and got ""
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected NULL and got """ and got "Expected NULL and got """
- ---- Test Case: ISNULL CLOB Sad Path 1
- PASS 2ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNULL CLOB Sad Path 2
- PASS 2ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: ISNULL BLOB Happy Path 1
- PASS 0ms Run Test. ISNULL - BLOB is NULL
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "ISNULL" and got "ISNULL"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "BLOB is NULL" and got "BLOB is NULL"
- ---- Test Case: ISNULL BLOB Sad Path 1
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: ISNULL BLOB Sad Path 2
- PASS 0ms g_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Raises Tests Happy Path 1
- PASS 2ms RAISES Varchar2 Test. RAISES/THROWS - Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;".
- PASS 0ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "RAISES/THROWS" and got "RAISES/THROWS"
- PASS 0ms temp_rec.last_msg. EQ - Expected "RAISES Varchar2 Test" and got "RAISES Varchar2 Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"."
- ---- Test Case: Raises Tests Happy Path 2
- PASS 1ms RAISES Number Test. RAISES/THROWS - Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;".
- PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"."
- PASS 1ms THROWS Varchar2 Test. RAISES/THROWS - Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;".
- PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%PLS-00302: component 'BOGUS' must be declared%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"."
- PASS 1ms THROWS Number Test. RAISES/THROWS - Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;".
- PASS 0ms temp_rec.last_details value. EQ - Expected "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"." and got "Expected exception "%-00302%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;"."
- ---- Test Case: Raises Tests Happy Path 3
- PASS 2ms RAISES Varchar2 No Error. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".
- PASS 0ms temp_rec.last_details value. EQ - Expected "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." and got "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"."
- PASS 0ms RAISES Number No Error. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;".
- PASS 0ms temp_rec.last_details value. EQ - Expected "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"." and got "No exception was expected. Exception raised was "". Exception raised by: "begin wt_assert.set_NLS_DATE_FORMAT(wt_assert.get_NLS_DATE_FORMAT); end;"."
- ---- Test Case: Raises Tests Sad Path 1
- PASS 2ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected exception "%Incorrect Exception%". Actual exception raised was "ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored". Exception raised by: "begin wt_assert.bogus; end;". Error Stack: ORA-06550: line 1, column 17:\nPLS-00302: component 'BOGUS' must be declared\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored\nORA-06512: at "WTP.WT_ASSERT", line 2326\n"
- PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: Raises Tests Sad Path 2
- PASS 1ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected exception "%Incorrect Exception%". No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". Error Stack: " and got "Expected exception "%Incorrect Exception%". No exception was raised by: "begin wt_assert.set_NLS_DATE_FORMAT; end;". Error Stack: "
- ---- Test Case: EQQUERYVALUE VARCHAR2 Happy Path 1
- PASS 0ms Run Test. EQQUERYVALUE - Expected "X" and got "X" for Query: select dummy from DUAL
- PASS 1ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "EQQUERYVALUE" and got "EQQUERYVALUE"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details. EQ - Expected "Expected "X" and got "X" for Query: select dummy from DUAL" and got "Expected "X" and got "X" for Query: select dummy from DUAL"
- ---- Test Case: EQQUERYVALUE VARCHAR2 Happy Path 2
- PASS 0ms Run Test. EQQUERYVALUE - Expected "" and got "" for Query: select max(dummy) from DUAL where 0 = 1
- ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 1
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 2
- PASS 1ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQQUERYVALUE VARCHAR2 Sad Path 3
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details. ISNOTNULL - Expected NOT NULL and got "Exception raised for Query: Garbage query that won't work\nORA-00900: invalid SQL statement\nORA-06512: at "WTP.WT_ASSERT", line 2586\n"
- PASS 0ms temp_rec.last_details value. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQQUERYVALUE XMLTYPE Happy Path 1
- PASS 67ms Run Test. EQQUERYVALUE - Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " and got "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " for Query: select temp_xml from wt_self_test where id = 1
- PASS 1ms temp_rec.last_pass. EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms temp_rec.last_assert. EQ - Expected "EQQUERYVALUE" and got "EQQUERYVALUE"
- PASS 0ms temp_rec.last_msg. EQ - Expected "Run Test" and got "Run Test"
- PASS 0ms temp_rec.last_details value. ISNOTNULL - Expected NOT NULL and got "Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " and got "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n 2" and got "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n " for Query: select temp_xml from wt_self_test where id = 1"
- PASS 0ms temp_rec.last_details. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQQUERYVALUE XMLTYPE Sad Path 2
- PASS 20ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 1ms RAISE_EXC_IN Test, Exception Raised?. EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQQUERYVALUE XMLTYPE Sad Path 3
- PASS 0ms temp_rec.last_pass. EQ - Expected "FALSE" and got "FALSE"
- PASS 0ms temp_rec.last_details. ISNOTNULL - Expected NOT NULL and got "Exception raised for Query: Garbage query that won't work\nORA-00900: invalid SQL statement\nORA-06512: at "WTP.WT_ASSERT", line 2624\n"
- PASS 1ms temp_rec.last_details value. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: EQQUERYVALUE CLOB Happy Path 1
- PASS 13ms Run Test. EQQUERYVALUE - Expected "\n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n \n\n FPDS-NG search results for\n \n \n \n \n \n \n \n \n \n 2');
- 34 IGNR 0 0 0 0 temp_pint1 CONSTANT pls_integer := 2;
- 35 IGNR 0 0 0 0 temp_pint2 CONSTANT pls_integer := 3;
- 36 IGNR 0 0 0 0 temp_date CONSTANT date := sysdate;
- 37 IGNR 0 0 0 0 temp_tstmp CONSTANT timestamp := systimestamp;
- 38 IGNR 0 0 0 0 temp_tstlzn CONSTANT timestamp with local time zone := systimestamp;
- 39 IGNR 0 0 0 0 temp_tstzn CONSTANT timestamp with time zone := systimestamp;
- 40 IGNR 0 0 0 0 temp_intds1 CONSTANT interval day to second := interval '+01 01:01:01.001' day to second;
- 41 IGNR 0 0 0 0 temp_intds2 CONSTANT interval day to second := interval '+02 02:02:02.002' day to second;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 42 IGNR 0 0 0 0 temp_intym1 CONSTANT interval year to month := interval '+01-01' year to month;
- 43 IGNR 0 0 0 0 temp_intym2 CONSTANT interval year to month := interval '+02-02' year to month;
- 47 IGNR 0 0 0 0 wtplsql_skip_save boolean := FALSE;
- 55 UNKN 0 89 0 31 function boolean_to_status
- 60 EXEC 298 42 0 4 if in_boolean is null
- 62 EXEC 12 0 0 0 return '';
- 63 EXEC 286 47 0 1 elsif in_boolean
- 65 EXEC 169 38 1 5 return 'TRUE';
- 67 EXEC 117 36 0 2 return 'FALSE';
- 68 EXEC 298 43 0 2 end boolean_to_status;
- 72 IGNR 0 5 5 5 procedure t_boolean_to_status
- 75 IGNR 1 2 2 2 wt_assert.g_testcase := 'BOOLEAN_TO_STATUS';
- 77 IGNR 1 0 0 0 wt_assert.eq
- 81 IGNR 1 1 0 1 wt_assert.eq
- 86 IGNR 1 1 1 1 wt_assert.isnull
- 89 IGNR 1 0 0 0 end t_boolean_to_status;
- 94 UNKN 0 465 1 7 procedure process_assertion
- 99 IGNR 493 98 0 1 if not wtplsql_skip_save then
- 101 EXEC 404 159 0 4 wt_result.save
- 103 UNKN 0 499 1 6 ,in_status => case g_rec.last_pass
- 104 UNKN 0 83 0 1 when TRUE then C_PASS
- 114 EXEC 493 118 0 1 if g_rec.raise_exception and not g_rec.last_pass
- 116 EXEC 28 1781 1 171 raise_application_error(-20003, wt_text_report.format_test_result
- 124 UNKN 0 113 0 3 end process_assertion;
- 128 IGNR 0 0 0 0 procedure t_process_assertion
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 132 IGNR 1 1 1 1 g_testcase := 'PROCESS_ASSERTION';
- 133 IGNR 1 0 0 0 g_rec.last_assert := 'THIS';
- 134 IGNR 1 0 0 0 g_rec.last_pass := FALSE;
- 135 IGNR 1 1 1 1 g_rec.last_details := 'Expected "PASS" and got "FAIL"';
- 136 IGNR 1 0 0 0 g_rec.last_msg := 'Process Assertion Forced Failure';
- 137 IGNR 1 0 0 0 g_rec.raise_exception := TRUE;
- 138 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 139 IGNR 1 0 0 0 process_assertion; -- Should throw exception
- 140 IGNR 0 0 0 0 wtplsql_skip_save := FALSE;
- 143 IGNR 1 0 0 0 when ASSERT_FAILURE_EXCEPTION then
- 144 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 145 IGNR 1 1 0 1 end t_process_assertion;
- 150 EXEC 11 18 0 2 procedure compare_queries (
- 159 EXEC 11 20 1 3 l_qry_txt := 'with check_query as (' || check_query_in ||
- 168 EXEC 11 14 1 3 l_exec_txt :=
- 181 EXEC 11 11514 69 3349 execute immediate l_exec_txt using out l_ret_txt;
- 182 EXEC 8 12 1 3 if l_ret_txt = 'FOUND'
- 184 EXEC 5 8 1 2 g_rec.last_pass := FALSE; -- Some Difference Found
- 186 EXEC 3 6 2 2 g_rec.last_pass := TRUE; -- Nothing found, queries match
- 189 EXEC 8 96 4 61 g_rec.last_details := 'Comparison Query: ' || l_qry_txt;
- 191 EXEC 3 0 0 0 when OTHERS
- 193 EXEC 3 198 53 84 g_rec.last_details := SQLERRM || CHR(10) ||
- 195 EXEC 3 3 1 1 g_rec.last_pass := FALSE;
- 196 EXEC 11 19 3 3 end compare_queries;
- 200 IGNR 0 1 1 1 procedure t_compare_queries
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 204 IGNR 1 0 0 0 wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 1';
- 205 IGNR 1 0 0 0 compare_queries (
- 208 IGNR 1 4 4 4 temp_rec := g_rec;
- 209 IGNR 1 1 1 1 wt_assert.eq (
- 214 IGNR 1 1 1 1 wt_assert.isnotnull(
- 217 IGNR 1 10 10 10 wt_assert.this(
- 222 IGNR 1 0 0 0 wt_assert.g_testcase := 'COMPARE_QUERIES Bad Query Test 2';
- 223 IGNR 1 0 0 0 compare_queries (
- 226 IGNR 1 5 5 5 temp_rec := g_rec;
- 227 IGNR 1 1 1 1 wt_assert.eq (
- 232 IGNR 1 1 1 1 wt_assert.isnotnull(
- 235 IGNR 1 6 6 6 wt_assert.this(
- 240 IGNR 1 1 1 1 end t_compare_queries;
- 249 UNKN 0 1 1 1 function last_pass
- 253 EXEC 1 0 0 0 return g_rec.last_pass;
- 254 EXEC 1 0 0 0 end last_pass;
- 256 EXCL 0 0 0 0 function last_assert
- 260 EXEC 1 1 1 1 return g_rec.last_assert;
- 261 EXEC 1 0 0 0 end last_assert;
- 263 EXCL 0 0 0 0 function last_msg
- 267 EXEC 1 0 0 0 return g_rec.last_msg;
- 268 EXEC 1 1 1 1 end last_msg;
- 270 EXCL 0 0 0 0 function last_details
- 274 EXEC 1 0 0 0 return g_rec.last_details;
- 275 EXEC 1 0 0 0 end last_details;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 279 IGNR 0 1 1 1 procedure t_last_values
- 283 IGNR 1 0 0 0 wt_assert.g_testcase := 'Last Values Tests';
- 284 IGNR 1 0 0 0 wt_assert.eq (
- 289 IGNR 1 0 0 0 wt_assert.eq (
- 295 IGNR 1 0 0 0 temp_rec := g_rec;
- 296 IGNR 1 0 0 0 wt_assert.eq (
- 301 IGNR 1 2 1 1 wt_assert.eq (
- 306 IGNR 1 0 0 0 end t_last_values;
- 311 EXCL 0 0 0 0 procedure reset_globals
- 314 EXEC 1 0 0 0 g_testcase := '';
- 315 EXEC 1 0 0 0 g_rec.last_pass := NULL;
- 316 EXEC 1 1 1 1 g_rec.last_assert := '';
- 317 EXEC 1 0 0 0 g_rec.last_msg := '';
- 318 EXEC 1 0 0 0 g_rec.last_details := '';
- 319 EXEC 1 0 0 0 g_rec.raise_exception := FALSE;
- 320 EXEC 1 0 0 0 end reset_globals;
- 324 IGNR 0 1 1 1 procedure t_reset_globals
- 327 IGNR 1 0 0 0 reset_globals; -- Resets g_testcase
- 328 IGNR 1 0 0 0 temp_rec := g_rec;
- 329 IGNR 1 0 0 0 temp_testcase := g_testcase;
- 331 IGNR 1 0 0 0 g_testcase := 'RESET_GLOBALS';
- 332 IGNR 1 0 0 0 wt_assert.isnull(
- 335 IGNR 1 1 1 1 wt_assert.isnull
- 339 IGNR 1 0 0 0 wt_assert.eq(
- 343 IGNR 1 1 1 1 wt_assert.isnull
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 347 IGNR 1 1 1 1 wt_assert.isnull
- 350 IGNR 1 0 0 0 wt_assert.isnull
- 353 IGNR 1 1 1 1 end t_reset_globals;
- 358 UNKN 0 6 1 2 function get_NLS_DATE_FORMAT
- 363 EXEC 4 538 71 258 select value into l_format
- 366 EXEC 4 6 0 3 return l_format;
- 367 EXEC 4 5 1 2 end get_NLS_DATE_FORMAT;
- 369 UNKN 0 6 1 2 procedure set_NLS_DATE_FORMAT
- 373 EXEC 5 677 84 198 execute immediate 'alter session set NLS_DATE_FORMAT = ''' ||
- 375 EXEC 5 6 1 2 end set_NLS_DATE_FORMAT;
- 377 UNKN 0 3 1 2 function get_NLS_TIMESTAMP_FORMAT
- 382 EXEC 2 214 70 144 select value into l_format
- 385 EXEC 2 2 1 1 return l_format;
- 386 EXEC 2 2 1 1 end get_NLS_TIMESTAMP_FORMAT;
- 388 UNKN 0 2 1 1 procedure set_NLS_TIMESTAMP_FORMAT
- 392 EXEC 2 319 141 178 execute immediate 'alter session set NLS_TIMESTAMP_FORMAT = ''' ||
- 394 EXEC 2 0 0 0 end set_NLS_TIMESTAMP_FORMAT;
- 396 UNKN 0 2 1 1 function get_NLS_TIMESTAMP_TZ_FORMAT
- 401 EXEC 2 277 69 208 select value into l_format
- 404 EXEC 2 2 1 1 return l_format;
- 405 EXEC 2 2 1 1 end get_NLS_TIMESTAMP_TZ_FORMAT;
- 407 UNKN 0 2 1 1 procedure set_NLS_TIMESTAMP_TZ_FORMAT
- 411 EXEC 2 277 126 151 execute immediate 'alter session set NLS_TIMESTAMP_TZ_FORMAT = ''' ||
- 413 EXEC 2 2 1 1 end set_NLS_TIMESTAMP_TZ_FORMAT;
- 417 IGNR 0 3 3 3 procedure t_nls_settings
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 421 IGNR 1 1 1 1 wt_assert.g_testcase := 'NLS Settings';
- 422 IGNR 1 0 0 0 set_NLS_DATE_FORMAT('DD-MON-YYYY');
- 423 IGNR 1 2 1 1 wt_assert.eq
- 427 IGNR 1 0 0 0 set_NLS_DATE_FORMAT;
- 429 IGNR 1 1 0 1 wt_assert.eq
- 433 IGNR 1 1 1 1 set_NLS_TIMESTAMP_FORMAT('DD-MON-YYYY');
- 434 IGNR 1 0 0 0 wt_assert.eq
- 438 IGNR 1 0 0 0 set_NLS_TIMESTAMP_FORMAT;
- 440 IGNR 1 1 1 1 wt_assert.eq
- 444 IGNR 1 0 0 0 set_NLS_TIMESTAMP_TZ_FORMAT('DD-MON-YYYY');
- 446 IGNR 1 0 0 0 wt_assert.eq
- 450 IGNR 1 0 0 0 set_NLS_TIMESTAMP_TZ_FORMAT;
- 451 IGNR 1 2 1 1 wt_assert.eq
- 455 IGNR 1 1 1 1 end t_nls_settings;
- 464 UNKN 0 61 0 3 procedure this (
- 471 EXEC 80 60 1 26 g_rec.last_assert := 'THIS';
- 472 EXEC 80 37 0 1 g_rec.last_msg := msg_in;
- 473 EXEC 80 19 1 1 g_rec.last_pass := nvl(check_this_in, FALSE);
- 474 EXEC 80 91 0 3 g_rec.last_details := 'Expected "TRUE" and got "' ||
- 476 EXEC 80 17 0 2 g_rec.raise_exception := raise_exc_in;
- 477 EXEC 80 5 0 1 process_assertion;
- 478 EXEC 79 16 0 1 end this;
- 482 IGNR 0 1 1 1 procedure t_this
- 487 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Happy Path';
- 488 IGNR 1 0 0 0 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 491 IGNR 1 0 0 0 temp_rec := g_rec;
- 492 IGNR 1 0 0 0 wt_assert.eq (
- 497 IGNR 1 0 0 0 wt_assert.eq (
- 501 IGNR 1 1 1 1 wt_assert.eq (
- 505 IGNR 1 0 0 0 wt_assert.eq (
- 510 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 1';
- 511 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 512 IGNR 1 1 1 1 this (
- 515 IGNR 1 2 2 2 temp_rec := g_rec;
- 516 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 517 IGNR 1 0 0 0 wt_assert.eq (
- 522 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 2';
- 523 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 525 IGNR 1 0 0 0 this (
- 529 IGNR 0 0 0 0 l_found_exception := FALSE;
- 530 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 531 IGNR 1 0 0 0 l_found_exception := TRUE;
- 532 IGNR 0 1 1 1 end;
- 534 IGNR 1 1 1 1 temp_rec := g_rec;
- 535 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 536 IGNR 1 0 0 0 wt_assert.eq (
- 540 IGNR 1 0 0 0 wt_assert.eq (
- 545 IGNR 1 0 0 0 wt_assert.g_testcase := 'This Sad Path 3';
- 546 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 547 IGNR 1 0 0 0 this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 550 IGNR 1 1 1 1 temp_rec := g_rec;
- 551 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 552 IGNR 1 0 0 0 wt_assert.eq (
- 556 IGNR 1 1 1 1 end t_this;
- 562 UNKN 0 176 1 35 procedure eq (
- 570 EXEC 199 67 0 1 g_rec.last_assert := 'EQ';
- 571 EXEC 199 58 1 1 g_rec.last_msg := msg_in;
- 572 EXEC 199 211 0 10 g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
- 573 UNKN 0 14 0 2 or ( check_this_in is null
- 577 EXEC 199 435 1 103 g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
- 580 EXEC 199 27 1 1 g_rec.raise_exception := raise_exc_in;
- 581 EXEC 199 29 0 1 process_assertion;
- 582 EXEC 198 42 1 1 end eq;
- 585 UNKN 0 80 1 4 procedure eq (
- 593 EXEC 98 69 0 1 eq (msg_in => msg_in
- 598 EXEC 98 16 0 1 end eq;
- 601 UNKN 0 28 6 12 procedure eq (
- 609 EXEC 3 1 1 1 g_rec.last_assert := 'EQ';
- 610 EXEC 3 1 1 1 g_rec.last_msg := msg_in;
- 611 EXEC 3 52471 1 37004 g_rec.last_pass := (xmltype.getclobval(check_this_in) =
- 613 EXEC 3 36668 4 11763 g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) ||
- 616 EXEC 3 4 1 2 g_rec.raise_exception := raise_exc_in;
- 617 EXEC 3 4 1 2 process_assertion;
- 618 EXEC 2 175 58 117 end eq;
- 621 UNKN 0 362 5 157 procedure eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 629 EXEC 14 18 1 3 g_rec.last_assert := 'EQ';
- 630 EXEC 14 8 1 1 g_rec.last_msg := msg_in;
- 631 EXEC 14 4133 0 1644 g_rec.last_pass := ( nvl(check_this_in = against_this_in, false)
- 632 UNKN 0 20 1 3 or ( check_this_in is null
- 636 EXEC 14 24392 601 3388 g_rec.last_details := 'Expected "' || substr(against_this_in,1,1000) ||
- 639 EXEC 14 12 2 2 g_rec.raise_exception := raise_exc_in;
- 640 EXEC 14 9 1 2 process_assertion;
- 641 EXEC 12 919 62 113 end eq;
- 644 UNKN 0 6 1 2 procedure eq (
- 653 EXEC 7 42 0 39 g_rec.last_assert := 'EQ';
- 654 EXEC 7 1 0 1 g_rec.last_msg := msg_in;
- 655 EXEC 7 74 0 64 compare_results := nvl(DBMS_LOB.COMPARE(check_this_in, against_this_in),-1);
- 656 EXEC 7 38 1 32 g_rec.last_pass := ( (compare_results = 0)
- 657 UNKN 0 5 0 2 or ( check_this_in is null
- 661 EXEC 7 16 1 4 g_rec.last_details := 'DBMS_LOB.COMPARE on BLOBs, compare_results: ' || compare_results;
- 662 EXEC 7 1 0 1 g_rec.raise_exception := raise_exc_in;
- 663 EXEC 7 0 0 0 process_assertion;
- 664 EXEC 6 0 0 0 end eq;
- 672 IGNR 0 21 21 21 procedure t_eq
- 677 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 1';
- 678 IGNR 1 1 1 1 eq (
- 682 IGNR 1 0 0 0 temp_rec := g_rec;
- 684 IGNR 1 1 1 1 wt_assert.isnotnull (
- 687 IGNR 1 1 1 1 wt_assert.this (
- 691 IGNR 1 0 0 0 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 694 IGNR 1 0 0 0 wt_assert.this (
- 698 IGNR 1 0 0 0 wt_assert.isnotnull (
- 701 IGNR 1 0 0 0 wt_assert.this (
- 705 IGNR 1 1 1 1 wt_assert.isnotnull (
- 708 IGNR 1 1 1 1 wt_assert.this (
- 712 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 2';
- 713 IGNR 1 0 0 0 eq (
- 718 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Happy Path 3';
- 719 IGNR 1 0 0 0 eq (
- 725 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 1';
- 726 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 727 IGNR 1 0 0 0 eq (
- 731 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 732 IGNR 1 1 1 1 temp_rec := g_rec;
- 734 IGNR 1 0 0 0 wt_assert.isnotnull (
- 737 IGNR 1 0 0 0 wt_assert.isnotnull (
- 740 IGNR 1 0 0 0 wt_assert.this (
- 744 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 2';
- 745 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 747 IGNR 1 0 0 0 eq (
- 752 IGNR 0 0 0 0 l_found_exception := FALSE;
- 753 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 754 IGNR 1 0 0 0 l_found_exception := TRUE;
- 755 IGNR 0 1 1 1 end;
- 757 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 758 IGNR 1 0 0 0 temp_rec := g_rec;
- 759 IGNR 1 0 0 0 wt_assert.this (
- 762 IGNR 1 0 0 0 wt_assert.eq (
- 767 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 3';
- 768 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 769 IGNR 1 0 0 0 eq (
- 773 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 774 IGNR 1 1 1 1 temp_rec := g_rec;
- 776 IGNR 1 0 0 0 wt_assert.isnull (
- 779 IGNR 1 0 0 0 wt_assert.isnotnull (
- 782 IGNR 1 0 0 0 wt_assert.this (
- 786 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 4';
- 787 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 788 IGNR 1 0 0 0 eq (
- 792 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 793 IGNR 1 1 1 1 temp_rec := g_rec;
- 795 IGNR 1 0 0 0 wt_assert.isnull (
- 798 IGNR 1 0 0 0 wt_assert.isnull (
- 801 IGNR 1 0 0 0 wt_assert.this (
- 805 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 5';
- 806 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 807 IGNR 1 0 0 0 eq (
- 812 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 813 IGNR 1 1 1 1 temp_rec := g_rec;
- 815 IGNR 1 0 0 0 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 818 IGNR 1 0 0 0 wt_assert.isnotnull (
- 821 IGNR 1 0 0 0 wt_assert.this (
- 825 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ VARCHAR2 Sad Path 6';
- 826 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 827 IGNR 1 1 1 1 eq (
- 832 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 833 IGNR 1 1 1 1 temp_rec := g_rec;
- 835 IGNR 1 0 0 0 wt_assert.isnull (
- 838 IGNR 1 0 0 0 wt_assert.isnotnull (
- 841 IGNR 1 1 1 1 wt_assert.this (
- 846 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ ROWID Happy Path 1';
- 847 IGNR 1 1 1 1 eq (
- 852 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ ROWID Sad Path 1';
- 853 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 854 IGNR 1 0 0 0 eq (
- 858 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 859 IGNR 1 1 1 1 temp_rec := g_rec;
- 861 IGNR 1 0 0 0 wt_assert.isnotnull (
- 864 IGNR 1 1 1 1 wt_assert.isnotnull (
- 867 IGNR 1 1 1 1 wt_assert.this (
- 872 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LONG Happy Path 1';
- 873 IGNR 1 0 0 0 eq (
- 878 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LONG Sad Path 1';
- 879 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 880 IGNR 1 0 0 0 eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 884 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 885 IGNR 1 1 1 1 temp_rec := g_rec;
- 887 IGNR 1 0 0 0 wt_assert.isnotnull (
- 890 IGNR 1 0 0 0 wt_assert.isnotnull (
- 893 IGNR 1 1 1 1 wt_assert.this (
- 898 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ RAW Happy Path 1';
- 899 IGNR 1 1 1 1 eq (
- 904 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ RAW Sad Path 1';
- 905 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 906 IGNR 1 0 0 0 eq (
- 910 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 911 IGNR 1 1 1 1 temp_rec := g_rec;
- 913 IGNR 1 1 1 1 wt_assert.isnotnull (
- 916 IGNR 1 0 0 0 wt_assert.isnotnull (
- 919 IGNR 1 1 1 1 wt_assert.this (
- 924 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
- 925 IGNR 1 1 1 1 eq (
- 931 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
- 932 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 933 IGNR 1 1 1 1 eq (
- 938 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ LONG RAW Sad Path 1';
- 939 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 940 IGNR 1 0 0 0 temp_rec := g_rec;
- 941 IGNR 1 0 0 0 wt_assert.isnotnull (
- 945 IGNR 1 7 7 7 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 948 IGNR 1 1 1 1 wt_assert.this (
- 953 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NVARCHAR2 Happy Path 1';
- 954 IGNR 1 7 7 7 eq (
- 959 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NVARCHAR2 Sad Path 1';
- 960 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 961 IGNR 1 3 3 3 eq (
- 965 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 966 IGNR 1 1 1 1 temp_rec := g_rec;
- 968 IGNR 1 1 1 1 wt_assert.isnotnull (
- 971 IGNR 1 2 2 2 wt_assert.isnotnull (
- 974 IGNR 1 0 0 0 wt_assert.this (
- 978 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 1';
- 979 IGNR 1 0 0 0 eq (
- 983 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 2';
- 984 IGNR 1 0 0 0 eq (
- 990 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Path 3';
- 991 IGNR 1 1 1 1 eq (
- 997 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 1';
- 998 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 999 IGNR 1 0 0 0 eq (
- 1003 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1004 IGNR 1 0 0 0 temp_rec := g_rec;
- 1006 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1009 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1012 IGNR 1 1 1 1 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1016 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 2';
- 1017 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1018 IGNR 1 0 0 0 eq (
- 1022 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1023 IGNR 1 1 1 1 temp_rec := g_rec;
- 1025 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1028 IGNR 1 0 0 0 wt_assert.isnull (
- 1031 IGNR 1 1 1 1 wt_assert.this (
- 1035 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 3';
- 1036 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 1037 IGNR 1 0 0 0 eq (
- 1042 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1043 IGNR 1 1 1 1 temp_rec := g_rec;
- 1045 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1048 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1051 IGNR 1 0 0 0 wt_assert.this (
- 1055 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BOOLEAN Happy Sad 4';
- 1056 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1057 IGNR 1 0 0 0 eq (
- 1062 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 1063 IGNR 1 1 1 1 temp_rec := g_rec;
- 1065 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1068 IGNR 1 1 1 1 wt_assert.isnull (
- 1071 IGNR 1 0 0 0 wt_assert.this (
- 1075 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1076 IGNR 1 4 4 4 eq (
- 1080 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NUMBER Happy Path 2';
- 1081 IGNR 1 2 2 2 eq (
- 1086 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NUMBER Happy Path 1';
- 1087 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1088 IGNR 1 2 2 2 eq (
- 1092 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1093 IGNR 1 1 1 1 temp_rec := g_rec;
- 1095 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1098 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1101 IGNR 1 0 0 0 wt_assert.this (
- 1106 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ PLS_INTEGER Happy Path 1';
- 1107 IGNR 1 2 2 2 eq (
- 1111 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1113 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ PLS_INTEGER Sad Path 1';
- 1114 IGNR 1 2 2 2 eq (
- 1118 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1119 IGNR 1 1 1 1 temp_rec := g_rec;
- 1121 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1124 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1127 IGNR 1 0 0 0 wt_assert.this (
- 1131 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ DATE Happy Path 1';
- 1132 IGNR 1 12 12 12 eq (
- 1137 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ DATE Sad Path 1';
- 1138 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1139 IGNR 1 8 8 8 eq (
- 1143 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1144 IGNR 1 1 1 1 temp_rec := g_rec;
- 1146 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1149 IGNR 1 5 5 5 wt_assert.isnotnull (
- 1152 IGNR 1 2 2 2 wt_assert.this (
- 1157 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP Happy Path 1';
- 1158 IGNR 1 16 16 16 eq (
- 1163 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP Sad Path 1';
- 1164 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 1165 IGNR 1 13 13 13 eq (
- 1169 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1170 IGNR 1 2 2 2 temp_rec := g_rec;
- 1172 IGNR 1 2 2 2 wt_assert.isnotnull (
- 1175 IGNR 1 5 5 5 wt_assert.isnotnull (
- 1178 IGNR 1 1 1 1 wt_assert.this (
- 1183 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Happy Path 1';
- 1184 IGNR 1 5 5 5 eq (
- 1189 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP WITH LOCAL TIME ZONE Sad Path 1';
- 1190 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1191 IGNR 1 16 16 16 eq (
- 1195 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1196 IGNR 1 1 1 1 temp_rec := g_rec;
- 1198 IGNR 1 4 4 4 wt_assert.isnotnull (
- 1201 IGNR 1 5 5 5 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1204 IGNR 1 1 1 1 wt_assert.this (
- 1209 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Happy Path 1';
- 1210 IGNR 1 4 4 4 eq (
- 1215 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ TIMSETAMP WITH TIME ZONE Sad Path 1';
- 1216 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1217 IGNR 1 12 12 12 eq (
- 1221 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1222 IGNR 1 1 1 1 temp_rec := g_rec;
- 1224 IGNR 1 2 2 2 wt_assert.isnotnull (
- 1227 IGNR 1 5 5 5 wt_assert.isnotnull (
- 1230 IGNR 1 1 1 1 wt_assert.this (
- 1235 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Happy Path 1';
- 1236 IGNR 1 4 4 4 eq (
- 1241 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ INTERVAL DAY TO SECOND Sad Path 1';
- 1242 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1243 IGNR 1 3 3 3 eq (
- 1247 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1248 IGNR 1 2 2 2 temp_rec := g_rec;
- 1250 IGNR 1 2 2 2 wt_assert.isnotnull (
- 1253 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1256 IGNR 1 1 1 1 wt_assert.this (
- 1261 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Happy Path 1';
- 1262 IGNR 1 2 2 2 eq (
- 1267 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ INTERVAL YEAR TO MONTH Sad Path 1';
- 1268 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1269 IGNR 1 2 2 2 eq (
- 1273 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1274 IGNR 1 0 0 0 temp_rec := g_rec;
- 1276 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1279 IGNR 1 2 2 2 wt_assert.isnotnull (
- 1282 IGNR 1 0 0 0 wt_assert.this (
- 1286 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ XMLTYPE Happy Path 1';
- 1287 IGNR 1 1 1 1 eq (
- 1291 IGNR 1 5 5 5 temp_rec := g_rec;
- 1293 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1296 IGNR 1 1 1 1 wt_assert.this (
- 1300 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1303 IGNR 1 1 1 1 wt_assert.this (
- 1307 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1310 IGNR 1 1 1 1 wt_assert.this (
- 1314 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1317 IGNR 1 17 17 17 wt_assert.this (
- 1322 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 1';
- 1323 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1324 IGNR 1 0 0 0 eq (
- 1328 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1329 IGNR 1 4 4 4 temp_rec := g_rec;
- 1331 IGNR 1 4 0 4 wt_assert.isnotnull (
- 1334 IGNR 1 5 0 5 wt_assert.isnotnull (
- 1337 IGNR 1 1 1 1 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1341 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ XMLTYPE Sad Path 2';
- 1342 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1343 IGNR 0 0 0 0 begin
- 1344 IGNR 1 0 0 0 eq (
- 1349 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1350 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1351 IGNR 1 0 0 0 l_found_exception := TRUE;
- 1352 IGNR 0 2 2 2 end;
- 1354 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1355 IGNR 1 5 5 5 temp_rec := g_rec;
- 1356 IGNR 1 2 2 2 wt_assert.this (
- 1359 IGNR 1 0 0 0 wt_assert.eq (
- 1364 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Happy Path 1';
- 1365 IGNR 1 0 0 0 eq (
- 1369 IGNR 1 3 3 3 temp_rec := g_rec;
- 1371 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1374 IGNR 1 1 1 1 wt_assert.this (
- 1378 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1381 IGNR 1 1 1 1 wt_assert.this (
- 1385 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1388 IGNR 1 0 0 0 wt_assert.this (
- 1392 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1395 IGNR 1 17 17 17 wt_assert.this (
- 1400 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Happy Path 2';
- 1401 IGNR 1 0 0 0 eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1407 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ CLOB Happy Path 3';
- 1408 IGNR 1 1 1 1 eq (
- 1414 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ CLOB Sad Path 1';
- 1415 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1416 IGNR 1 0 0 0 eq (
- 1420 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1421 IGNR 1 5 5 5 temp_rec := g_rec;
- 1423 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1426 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1429 IGNR 1 1 1 1 wt_assert.this (
- 1433 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 2';
- 1434 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1436 IGNR 1 1 1 1 eq (
- 1441 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1442 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1443 IGNR 1 1 1 1 l_found_exception := TRUE;
- 1444 IGNR 0 2 2 2 end;
- 1446 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1447 IGNR 1 1 1 1 temp_rec := g_rec;
- 1448 IGNR 1 0 0 0 wt_assert.this (
- 1451 IGNR 1 1 1 1 wt_assert.eq (
- 1456 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 3';
- 1457 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1458 IGNR 1 0 0 0 eq (
- 1462 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1463 IGNR 1 2 2 2 temp_rec := g_rec;
- 1465 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1468 IGNR 1 1 1 1 wt_assert.isnull (
- 1471 IGNR 1 1 1 1 wt_assert.this (
- 1475 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ CLOB Sad Path 4';
- 1476 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1477 IGNR 1 0 0 0 eq (
- 1482 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 1483 IGNR 1 5 5 5 temp_rec := g_rec;
- 1485 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1488 IGNR 1 1 1 1 wt_assert.isnull (
- 1491 IGNR 1 1 1 1 wt_assert.this (
- 1495 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 1';
- 1496 IGNR 1 9341 9341 9341 eq (
- 1501 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 2';
- 1502 IGNR 1 10989 10989 10989 eq (
- 1508 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Happy Path 3';
- 1509 IGNR 1 3 3 3 eq (
- 1515 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ NCLOB Sad Path 1';
- 1516 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1517 IGNR 1 5318 5318 5318 eq (
- 1521 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1522 IGNR 1 6 6 6 temp_rec := g_rec;
- 1524 IGNR 1 4845 4845 4845 wt_assert.isnotnull (
- 1527 IGNR 1 121 121 121 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1530 IGNR 1 1 1 1 wt_assert.this (
- 1534 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 2';
- 1535 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1536 IGNR 0 0 0 0 begin
- 1537 IGNR 1 5776 5776 5776 eq (
- 1542 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1543 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1544 IGNR 1 1 1 1 l_found_exception := TRUE;
- 1545 IGNR 0 3 3 3 end;
- 1547 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1548 IGNR 1 5 5 5 temp_rec := g_rec;
- 1549 IGNR 1 2 2 2 wt_assert.this (
- 1552 IGNR 1 1 1 1 wt_assert.eq (
- 1557 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 3';
- 1558 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1559 IGNR 1 5180 5180 5180 eq (
- 1563 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1564 IGNR 1 4 4 4 temp_rec := g_rec;
- 1566 IGNR 1 4615 4615 4615 wt_assert.isnotnull (
- 1569 IGNR 1 17 17 17 wt_assert.isnull (
- 1572 IGNR 1 1 1 1 wt_assert.this (
- 1576 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ NCLOB Sad Path 4';
- 1577 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1578 IGNR 1 10241 10241 10241 eq (
- 1583 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1584 IGNR 1 7 7 7 temp_rec := g_rec;
- 1586 IGNR 1 10520 10520 10520 wt_assert.isnotnull (
- 1589 IGNR 1 442 442 442 wt_assert.isnull (
- 1592 IGNR 1 1 1 1 wt_assert.this (
- 1596 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BLOB Happy Path 1';
- 1597 IGNR 1 1 1 1 eq (
- 1601 IGNR 1 1 1 1 temp_rec := g_rec;
- 1603 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1606 IGNR 1 0 0 0 wt_assert.this (
- 1610 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1613 IGNR 1 0 0 0 wt_assert.this (
- 1617 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1620 IGNR 1 0 0 0 wt_assert.this (
- 1624 IGNR 1 1 1 1 wt_assert.isnotnull (
- 1627 IGNR 1 0 0 0 wt_assert.this (
- 1632 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Happy Path 2';
- 1633 IGNR 1 0 0 0 eq (
- 1639 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Happy Path 3';
- 1640 IGNR 1 0 0 0 eq (
- 1646 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 1';
- 1647 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1648 IGNR 1 0 0 0 eq (
- 1652 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1653 IGNR 1 2 2 2 temp_rec := g_rec;
- 1655 IGNR 1 0 0 0 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1658 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1661 IGNR 1 0 0 0 wt_assert.this (
- 1665 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 2';
- 1666 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 1668 IGNR 1 0 0 0 eq (
- 1673 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1674 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1675 IGNR 1 0 0 0 l_found_exception := TRUE;
- 1676 IGNR 0 1 1 1 end;
- 1678 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1679 IGNR 1 1 1 1 temp_rec := g_rec;
- 1680 IGNR 1 0 0 0 wt_assert.this (
- 1683 IGNR 1 1 1 1 wt_assert.eq (
- 1688 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQ BLOB Sad Path 3';
- 1689 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1690 IGNR 1 0 0 0 eq (
- 1694 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1695 IGNR 1 0 0 0 temp_rec := g_rec;
- 1697 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1700 IGNR 1 0 0 0 wt_assert.isnull (
- 1703 IGNR 1 1 1 1 wt_assert.this (
- 1707 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQ BLOB Sad Path 4';
- 1708 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1709 IGNR 1 0 0 0 eq (
- 1714 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1715 IGNR 1 0 0 0 temp_rec := g_rec;
- 1717 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1720 IGNR 1 1 1 1 wt_assert.isnull (
- 1723 IGNR 1 0 0 0 wt_assert.this (
- 1726 IGNR 1 1440 1440 1440 end t_eq;
- 1736 UNKN 0 44 1 2 procedure isnotnull (
- 1743 EXEC 82 41 1 1 g_rec.last_assert := 'ISNOTNULL';
- 1744 EXEC 82 29 1 1 g_rec.last_msg := msg_in;
- 1745 EXEC 82 16 0 1 g_rec.last_pass := (check_this_in is not null);
- 1746 EXEC 82 221 1 34 g_rec.last_details := 'Expected NOT NULL and got "' ||
- 1748 EXEC 82 24 0 7 g_rec.raise_exception := raise_exc_in;
- 1749 EXEC 82 14 0 1 process_assertion;
- 1750 EXEC 80 22 0 1 end isnotnull;
- 1753 UNKN 0 9 1 1 procedure isnotnull (
- 1760 EXEC 13 3 0 1 isnotnull (msg_in => msg_in
- 1764 EXEC 12 2 0 1 end isnotnull;
- 1767 UNKN 0 153 5 29 procedure isnotnull (
- 1774 EXEC 13 16 0 3 g_rec.last_assert := 'ISNOTNULL';
- 1775 EXEC 13 6 0 1 g_rec.last_msg := msg_in;
- 1776 EXEC 13 5 0 1 g_rec.last_pass := (check_this_in is not null);
- 1777 EXEC 13 19161 390 9579 g_rec.last_details := 'Expected NOT NULL and got "' ||
- 1779 EXEC 13 9 0 2 g_rec.raise_exception := raise_exc_in;
- 1780 EXEC 13 6 0 2 process_assertion;
- 1781 EXEC 12 736 48 127 end isnotnull;
- 1784 UNKN 0 4 0 1 procedure isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1791 EXEC 7 2 0 1 g_rec.last_assert := 'ISNOTNULL';
- 1792 EXEC 7 4 0 1 g_rec.last_msg := msg_in;
- 1793 EXEC 7 1 0 1 g_rec.last_pass := (check_this_in is not null);
- 1794 EXEC 7 0 0 0 if g_rec.last_pass
- 1796 EXEC 5 2 0 1 g_rec.last_details := 'BLOB is NOT NULL';
- 1798 EXEC 2 1 1 1 g_rec.last_details := 'BLOB is NULL';
- 1800 EXEC 7 1 0 1 g_rec.raise_exception := raise_exc_in;
- 1801 EXEC 7 1 1 1 process_assertion;
- 1802 EXEC 6 0 0 0 end isnotnull;
- 1806 IGNR 0 9 9 9 procedure t_isnotnull
- 1811 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Happy Path 1';
- 1812 IGNR 1 0 0 0 isnotnull (
- 1815 IGNR 1 1 1 1 temp_rec := g_rec;
- 1817 IGNR 1 1 1 1 wt_assert.eq (
- 1821 IGNR 1 0 0 0 wt_assert.eq (
- 1826 IGNR 1 1 1 1 wt_assert.eq (
- 1830 IGNR 1 0 0 0 wt_assert.eq (
- 1835 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 1';
- 1836 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1837 IGNR 1 1 1 1 isnotnull (
- 1840 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1841 IGNR 1 0 0 0 wt_assert.eq (
- 1846 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL VARCHAR2 Sad Path 2';
- 1847 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1849 IGNR 1 1 1 1 isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1853 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1854 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1855 IGNR 1 0 0 0 l_found_exception := TRUE;
- 1856 IGNR 0 1 1 1 end;
- 1858 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1859 IGNR 1 0 0 0 wt_assert.eq (
- 1863 IGNR 1 0 0 0 wt_assert.eq (
- 1868 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Happy Path 1';
- 1869 IGNR 1 1 1 1 isnotnull (
- 1873 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 1';
- 1874 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1875 IGNR 1 1 1 1 isnotnull (
- 1878 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1879 IGNR 1 0 0 0 wt_assert.eq (
- 1884 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BOOLEAN Sad Path 2';
- 1885 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1887 IGNR 1 1 1 1 isnotnull (
- 1891 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1892 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1893 IGNR 1 1 1 1 l_found_exception := TRUE;
- 1894 IGNR 0 1 1 1 end;
- 1896 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 1897 IGNR 1 0 0 0 wt_assert.eq (
- 1901 IGNR 1 0 0 0 wt_assert.eq (
- 1906 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Happy Path 1';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1907 IGNR 1 0 0 0 isnotnull (
- 1910 IGNR 1 2 2 2 temp_rec := g_rec;
- 1912 IGNR 1 0 0 0 wt_assert.eq (
- 1916 IGNR 1 0 0 0 wt_assert.eq (
- 1921 IGNR 1 0 0 0 wt_assert.eq (
- 1925 IGNR 1 0 0 0 wt_assert.isnotnull (
- 1928 IGNR 1 16 16 16 wt_assert.this (
- 1933 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 1';
- 1934 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1935 IGNR 1 0 0 0 isnotnull (
- 1938 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1939 IGNR 1 0 0 0 wt_assert.eq (
- 1944 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL CLOB Sad Path 2';
- 1945 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1947 IGNR 1 1 1 1 isnotnull (
- 1951 IGNR 0 0 0 0 l_found_exception := FALSE;
- 1952 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 1953 IGNR 1 0 0 0 l_found_exception := TRUE;
- 1954 IGNR 0 2 2 2 end;
- 1956 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1957 IGNR 1 0 0 0 wt_assert.eq (
- 1961 IGNR 1 0 0 0 wt_assert.eq (
- 1966 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BLOB Happy Path 1';
- 1967 IGNR 1 0 0 0 isnotnull (
- 1970 IGNR 1 1 1 1 temp_rec := g_rec;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1972 IGNR 1 0 0 0 wt_assert.eq (
- 1976 IGNR 1 0 0 0 wt_assert.eq (
- 1981 IGNR 1 0 0 0 wt_assert.eq (
- 1985 IGNR 1 1 1 1 wt_assert.eq (
- 1990 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 1';
- 1991 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 1992 IGNR 1 0 0 0 isnotnull (
- 1995 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 1996 IGNR 1 0 0 0 wt_assert.eq (
- 2001 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNOTNULL BLOB Sad Path 2';
- 2002 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2004 IGNR 1 0 0 0 isnotnull (
- 2008 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2009 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2010 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2011 IGNR 0 1 1 1 end;
- 2013 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2014 IGNR 1 0 0 0 wt_assert.eq (
- 2018 IGNR 1 0 0 0 wt_assert.eq (
- 2022 IGNR 1 3 3 3 end t_isnotnull;
- 2028 UNKN 0 10 0 1 procedure isnull (
- 2035 EXEC 18 5 0 1 g_rec.last_assert := 'ISNULL';
- 2036 EXEC 18 4 1 1 g_rec.last_msg := msg_in;
- 2037 EXEC 18 6 0 1 g_rec.last_pass := (check_this_in is null);
- 2038 EXEC 18 20 1 3 g_rec.last_details := 'Expected NULL and got "' ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2040 EXEC 18 9 0 7 g_rec.raise_exception := raise_exc_in;
- 2041 EXEC 18 4 0 1 process_assertion;
- 2042 EXEC 16 3 0 1 end isnull;
- 2045 UNKN 0 4 1 1 procedure isnull (
- 2052 EXEC 6 4 0 1 isnull (msg_in => msg_in
- 2056 EXEC 5 0 0 0 end isnull;
- 2059 UNKN 0 53 6 12 procedure isnull (
- 2066 EXEC 7 5 0 2 g_rec.last_assert := 'ISNULL';
- 2067 EXEC 7 2 0 1 g_rec.last_msg := msg_in;
- 2068 EXEC 7 3 1 1 g_rec.last_pass := (check_this_in is null);
- 2069 EXEC 7 4758 327 1715 g_rec.last_details := 'Expected NULL and got "' ||
- 2071 EXEC 7 6 1 2 g_rec.raise_exception := raise_exc_in;
- 2072 EXEC 7 3 1 1 process_assertion;
- 2073 EXEC 6 323 52 60 end isnull;
- 2076 UNKN 0 2 1 1 procedure isnull (
- 2083 EXEC 5 1 0 1 g_rec.last_assert := 'ISNULL';
- 2084 EXEC 5 2 1 1 g_rec.last_msg := msg_in;
- 2085 EXEC 5 3 0 1 g_rec.last_pass := (check_this_in is null);
- 2086 EXEC 5 1 0 1 if g_rec.last_pass
- 2088 EXEC 3 0 0 0 g_rec.last_details := 'BLOB is NULL';
- 2090 EXEC 2 2 1 1 g_rec.last_details := 'BLOB is NOT NULL';
- 2092 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2093 EXEC 5 1 0 1 process_assertion;
- 2094 EXEC 4 0 0 0 end isnull;
- 2098 IGNR 0 5 5 5 procedure t_isnull
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2103 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL VARCHAR2 Happy Path 1';
- 2104 IGNR 1 0 0 0 isnull (
- 2107 IGNR 1 0 0 0 temp_rec := g_rec;
- 2109 IGNR 1 0 0 0 wt_assert.eq (
- 2113 IGNR 1 0 0 0 wt_assert.eq (
- 2118 IGNR 1 1 1 1 wt_assert.eq (
- 2122 IGNR 1 1 1 1 wt_assert.eq (
- 2127 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 1';
- 2128 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2129 IGNR 1 0 0 0 isnull (
- 2132 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2133 IGNR 1 0 0 0 wt_assert.eq (
- 2138 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL VARCHAR2 Sad Path 2';
- 2139 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2141 IGNR 1 0 0 0 isnull (
- 2145 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2146 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2147 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2148 IGNR 0 0 0 0 end;
- 2149 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2151 IGNR 1 0 0 0 wt_assert.eq (
- 2155 IGNR 1 0 0 0 wt_assert.eq (
- 2160 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Happy Path 1';
- 2161 IGNR 1 0 0 0 isnull (
- 2165 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 1';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2166 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2167 IGNR 1 0 0 0 isnull (
- 2170 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2171 IGNR 1 0 0 0 wt_assert.eq (
- 2176 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BOOLEAN Sad Path 2';
- 2177 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 2179 IGNR 1 0 0 0 isnull (
- 2183 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2184 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2185 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2186 IGNR 0 1 1 1 end;
- 2187 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2189 IGNR 1 0 0 0 wt_assert.eq (
- 2193 IGNR 1 0 0 0 wt_assert.eq (
- 2198 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL CLOB Happy Path 1';
- 2199 IGNR 1 0 0 0 isnull (
- 2202 IGNR 1 1 1 1 temp_rec := g_rec;
- 2204 IGNR 1 0 0 0 wt_assert.eq (
- 2208 IGNR 1 1 1 1 wt_assert.eq (
- 2213 IGNR 1 0 0 0 wt_assert.eq (
- 2217 IGNR 1 1 1 1 wt_assert.eq (
- 2222 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL CLOB Sad Path 1';
- 2223 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2224 IGNR 1 0 0 0 isnull (
- 2227 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2228 IGNR 1 1 1 1 wt_assert.eq (
- 2233 IGNR 1 1 1 1 wt_assert.g_testcase := 'ISNULL CLOB Sad Path 2';
- 2234 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2236 IGNR 1 0 0 0 isnull (
- 2240 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2241 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2242 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2243 IGNR 0 2 2 2 end;
- 2245 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2246 IGNR 1 1 1 1 wt_assert.eq (
- 2250 IGNR 1 1 1 1 wt_assert.eq (
- 2255 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Happy Path 1';
- 2256 IGNR 1 1 1 1 isnull (
- 2259 IGNR 1 1 1 1 temp_rec := g_rec;
- 2261 IGNR 1 0 0 0 wt_assert.eq (
- 2265 IGNR 1 1 1 1 wt_assert.eq (
- 2270 IGNR 1 0 0 0 wt_assert.eq (
- 2274 IGNR 1 1 1 1 wt_assert.eq (
- 2279 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Sad Path 1';
- 2280 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2281 IGNR 1 1 1 1 isnull (
- 2284 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2285 IGNR 1 0 0 0 wt_assert.eq (
- 2290 IGNR 1 0 0 0 wt_assert.g_testcase := 'ISNULL BLOB Sad Path 2';
- 2291 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2293 IGNR 1 1 1 1 isnull (
- 2297 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2298 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2299 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2300 IGNR 0 1 1 1 end;
- 2302 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2303 IGNR 1 0 0 0 wt_assert.eq (
- 2307 IGNR 1 0 0 0 wt_assert.eq (
- 2311 IGNR 1 4 4 4 end t_isnull;
- 2317 EXEC 8 17 0 4 procedure raises (
- 2326 EXEC 8 7213 0 1298 execute immediate check_call_in;
- 2327 EXEC 5 0 0 0 exception when OTHERS then
- 2328 EXEC 5 177 26 41 l_sqlerrm := SQLERRM;
- 2329 EXEC 5 209 30 85 l_errstack := substr(dbms_utility.format_error_stack ||
- 2332 UNKN 0 4 1 1 end;
- 2334 EXEC 8 7 1 1 g_rec.last_assert := 'RAISES/THROWS';
- 2335 EXEC 8 4 1 1 g_rec.last_msg := msg_in;
- 2336 EXEC 8 3 0 1 if against_exc_in is null AND l_sqlerrm is null
- 2339 EXEC 2 1 0 1 g_rec.last_pass := TRUE;
- 2340#NOTX# 0 0 0 0 elsif against_exc_in is null OR l_sqlerrm is null
- 2344 EXEC 1 1 1 1 g_rec.last_pass := FALSE;
- 2347 EXEC 5 30 5 7 g_rec.last_pass := l_sqlerrm like '%' || against_exc_in || '%';
- 2349 EXEC 8 0 0 0 if against_exc_in is null
- 2351 EXEC 2 4 2 2 g_rec.last_details := 'No exception was expected' ||
- 2354 EXEC 6 1 0 1 elsif l_sqlerrm is null
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2356 EXEC 1 2 2 2 g_rec.last_details := 'Expected exception "%' || against_exc_in ||
- 2359 EXEC 5 6 1 2 g_rec.last_details := 'Expected exception "%' || against_exc_in ||
- 2363 EXEC 8 1 0 1 if not g_rec.last_pass
- 2365 EXEC 2 8 3 5 g_rec.last_details :=
- 2368 EXEC 8 2 1 1 process_assertion;
- 2369 EXEC 8 14 2 4 end raises;
- 2371 UNKN 0 3 1 1 procedure raises (
- 2377 EXEC 3 1 0 1 if against_exc_in is null
- 2379 EXEC 1 1 1 1 raises (
- 2384 EXEC 2 15 7 8 raises (
- 2389 EXEC 3 0 0 0 end raises;
- 2391 UNKN 0 1 1 1 procedure throws (
- 2397 EXEC 1 0 0 0 raises (
- 2401 EXEC 1 1 1 1 end throws;
- 2403 EXCL 0 0 0 0 procedure throws (
- 2409 EXEC 1 0 0 0 raises (
- 2413 EXEC 1 0 0 0 end throws;
- 2417 IGNR 0 2 2 2 procedure t_raises
- 2421 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 1';
- 2422 IGNR 1 0 0 0 raises (
- 2426 IGNR 1 2 2 2 temp_rec := g_rec;
- 2428 IGNR 1 1 1 1 wt_assert.eq (
- 2432 IGNR 1 1 1 1 wt_assert.eq (
- 2437 IGNR 1 0 0 0 wt_assert.eq (
- 2441 IGNR 1 5 5 5 wt_assert.eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2451 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 2';
- 2452 IGNR 1 0 0 0 raises (
- 2456 IGNR 1 1 1 1 temp_rec := g_rec;
- 2457 IGNR 1 3 3 3 wt_assert.eq (
- 2468 IGNR 1 0 0 0 throws (
- 2472 IGNR 1 1 1 1 temp_rec := g_rec;
- 2473 IGNR 1 3 3 3 wt_assert.eq (
- 2484 IGNR 1 0 0 0 throws (
- 2488 IGNR 1 2 2 2 temp_rec := g_rec;
- 2489 IGNR 1 3 3 3 wt_assert.eq (
- 2500 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Happy Path 3';
- 2501 IGNR 1 0 0 0 raises (
- 2505 IGNR 1 1 1 1 temp_rec := g_rec;
- 2506 IGNR 1 2 2 2 wt_assert.eq (
- 2513 IGNR 1 1 1 1 raises (
- 2517 IGNR 1 0 0 0 temp_rec := g_rec;
- 2518 IGNR 1 1 1 1 wt_assert.eq (
- 2525 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Sad Path 1';
- 2526 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2527 IGNR 1 1 1 1 raises (
- 2531 IGNR 1 11 11 11 temp_rec := g_rec;
- 2532 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2534 IGNR 1 0 0 0 wt_assert.eq (
- 2538 IGNR 1 0 0 0 wt_assert.isnotnull (
- 2541 IGNR 1 5 5 5 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2547 IGNR 1 0 0 0 wt_assert.g_testcase := 'Raises Tests Sad Path 2';
- 2548 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2549 IGNR 1 1 1 1 raises (
- 2553 IGNR 1 2 2 2 temp_rec := g_rec;
- 2554 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 2556 IGNR 1 0 0 0 wt_assert.eq (
- 2560 IGNR 1 2 2 2 wt_assert.eq (
- 2566 IGNR 1 0 0 0 end t_raises;
- 2572 EXEC 6 11 0 2 procedure eqqueryvalue (
- 2584 EXEC 6 0 0 0 g_rec.last_assert := 'EQQUERYVALUE';
- 2585 EXEC 6 1 0 1 g_rec.last_msg := msg_in;
- 2586 EXEC 6 3347 46 2815 open l_rc for check_query_in;
- 2587 EXEC 5 313 31 91 fetch l_rc into l_rc_buff;
- 2588 EXEC 5 71 10 19 close l_rc;
- 2589 EXEC 5 10 0 2 g_rec.last_pass := ( l_rc_buff = against_value_in
- 2590 UNKN 0 5 1 2 or ( l_rc_buff is null
- 2593 EXEC 5 30 4 10 g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
- 2596 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2597 EXEC 5 3 1 1 process_assertion;
- 2598 EXEC 2 0 0 0 exception when others then
- 2599 EXEC 2 124 52 72 l_errstack := substr(dbms_utility.format_error_stack ||
- 2601 EXEC 2 4 2 2 g_rec.last_details := 'Exception raised for Query: ' ||
- 2604 EXEC 2 0 0 0 g_rec.last_pass := FALSE;
- 2605 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2606 EXEC 2 0 0 0 process_assertion;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2607 EXEC 5 29 4 19 end eqqueryvalue;
- 2610 EXEC 4 46 10 14 procedure eqqueryvalue (
- 2622 EXEC 4 1 0 1 g_rec.last_assert := 'EQQUERYVALUE';
- 2623 EXEC 4 1 0 1 g_rec.last_msg := msg_in;
- 2624 EXEC 4 3847 358 2615 open l_rc for check_query_in;
- 2625 EXEC 3 687 211 246 fetch l_rc into l_rc_buff;
- 2626 EXEC 3 179 40 87 close l_rc;
- 2627 EXEC 3 56609 2 38968 g_rec.last_pass := (xmltype.getclobval(l_rc_buff) =
- 2629 EXEC 3 39064 4 9936 g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) ||
- 2632 EXEC 3 4 1 2 g_rec.raise_exception := raise_exc_in;
- 2633 EXEC 3 3 1 1 process_assertion;
- 2634 EXEC 2 0 0 0 exception when others then
- 2635 EXEC 2 212 94 118 l_errstack := substr(dbms_utility.format_error_stack ||
- 2637 EXEC 2 7 3 4 g_rec.last_details := 'Exception raised for Query: ' ||
- 2640 EXEC 2 0 0 0 g_rec.last_pass := FALSE;
- 2641 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2642 EXEC 2 1 1 1 process_assertion;
- 2643 EXEC 3 191 1 74 end eqqueryvalue;
- 2646 EXEC 4 43 1 10 procedure eqqueryvalue (
- 2658 EXEC 4 2 1 1 g_rec.last_assert := 'EQQUERYVALUE';
- 2659 EXEC 4 2 1 1 g_rec.last_msg := msg_in;
- 2660 EXEC 4 2128 156 1465 open l_rc for check_query_in;
- 2661 EXEC 3 219 56 98 fetch l_rc into l_rc_buff;
- 2662 EXEC 3 70 14 31 close l_rc;
- 2663 EXEC 3 10777 0 9404 g_rec.last_pass := ( l_rc_buff = against_value_in
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2664 UNKN 0 3 1 2 or ( l_rc_buff is null
- 2667 EXEC 3 6496 2072 2351 g_rec.last_details := 'Expected "' || substr(against_value_in,1,1000) ||
- 2670 EXEC 3 2 1 1 g_rec.raise_exception := raise_exc_in;
- 2671 EXEC 3 3 1 1 process_assertion;
- 2672 EXEC 2 0 0 0 exception when others then
- 2673 EXEC 2 226 43 183 l_errstack := substr(dbms_utility.format_error_stack ||
- 2675 EXEC 2 5 2 3 g_rec.last_details := 'Exception raised for Query: ' ||
- 2678 EXEC 2 1 1 1 g_rec.last_pass := FALSE;
- 2679 EXEC 2 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2680 EXEC 2 1 1 1 process_assertion;
- 2681 EXEC 3 140 25 59 end eqqueryvalue;
- 2684 EXEC 5 30 1 6 procedure eqqueryvalue (
- 2697 EXEC 5 2 0 1 g_rec.last_assert := 'EQQUERYVALUE';
- 2698 EXEC 5 2 0 1 g_rec.last_msg := msg_in;
- 2699 EXEC 5 3441 90 1669 open l_rc for check_query_in;
- 2700 EXEC 4 225 37 83 fetch l_rc into l_rc_buff;
- 2701 EXEC 4 78 14 27 close l_rc;
- 2702 EXEC 4 18 0 6 compare_results := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1);
- 2703 EXEC 4 10 0 3 g_rec.last_pass := ( (compare_results = 0)
- 2704 UNKN 0 4 1 2 or ( l_rc_buff is null
- 2707 EXEC 4 25 4 8 g_rec.last_details := 'DBMS_LOB.COMPARE between BLOB and Query: ' ||
- 2710 EXEC 4 0 0 0 g_rec.raise_exception := raise_exc_in;
- 2711 EXEC 4 3 1 1 process_assertion;
- 2712 EXEC 2 0 0 0 exception when others then
- 2713 EXEC 2 117 41 76 l_errstack := substr(dbms_utility.format_error_stack ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2715 EXEC 2 5 2 3 g_rec.last_details := 'Exception raised for Query: ' ||
- 2718 EXEC 2 0 0 0 g_rec.last_pass := FALSE;
- 2719 EXEC 2 1 1 1 g_rec.raise_exception := raise_exc_in;
- 2720 EXEC 2 0 0 0 process_assertion;
- 2721 EXEC 4 30 1 19 end eqqueryvalue;
- 2725 IGNR 0 6 6 6 procedure t_eqqueryvalue
- 2730 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 1';
- 2731 IGNR 1 0 0 0 eqqueryvalue (
- 2736 IGNR 1 0 0 0 temp_rec := g_rec;
- 2738 IGNR 1 0 0 0 wt_assert.eq (
- 2742 IGNR 1 1 1 1 wt_assert.eq (
- 2747 IGNR 1 1 1 1 wt_assert.eq (
- 2751 IGNR 1 0 0 0 wt_assert.eq (
- 2756 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Happy Path 2';
- 2757 IGNR 1 0 0 0 eqqueryvalue (
- 2763 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 1';
- 2764 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2765 IGNR 1 0 0 0 eqqueryvalue (
- 2769 IGNR 1 1 1 1 temp_rec := g_rec;
- 2770 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2771 IGNR 1 0 0 0 wt_assert.eq (
- 2776 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 2';
- 2777 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2779 IGNR 1 0 0 0 eqqueryvalue (
- 2784 IGNR 0 0 0 0 l_found_exception := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2785 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2786 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2787 IGNR 0 1 1 1 end;
- 2789 IGNR 1 2 2 2 temp_rec := g_rec;
- 2790 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2791 IGNR 1 1 1 1 wt_assert.eq (
- 2795 IGNR 1 0 0 0 wt_assert.eq (
- 2800 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE VARCHAR2 Sad Path 3';
- 2801 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2802 IGNR 1 0 0 0 eqqueryvalue (
- 2806 IGNR 1 2 2 2 temp_rec := g_rec;
- 2807 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2809 IGNR 1 0 0 0 wt_assert.eq (
- 2813 IGNR 1 0 0 0 wt_assert.isnotnull (
- 2816 IGNR 1 7 7 7 wt_assert.this (
- 2822 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Happy Path 1';
- 2823 IGNR 1 0 0 0 eqqueryvalue (
- 2827 IGNR 1 2 2 2 temp_rec := g_rec;
- 2829 IGNR 1 1 1 1 wt_assert.eq (
- 2833 IGNR 1 1 1 1 wt_assert.eq (
- 2838 IGNR 1 0 0 0 wt_assert.eq (
- 2842 IGNR 1 0 0 0 wt_assert.isnotnull (
- 2845 IGNR 1 18 18 18 wt_assert.this (
- 2850 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 1';
- 2851 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2852 IGNR 1 1 1 1 eqqueryvalue (
- 2856 IGNR 1 5 5 5 temp_rec := g_rec;
- 2857 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2859 IGNR 1 1 1 1 wt_assert.eq (
- 2863 IGNR 1 0 0 0 wt_assert.isnotnull (
- 2866 IGNR 1 14 14 14 wt_assert.this (
- 2872 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 2';
- 2873 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2875 IGNR 1 0 0 0 eqqueryvalue (
- 2880 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2881 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2882 IGNR 1 0 0 0 l_found_exception := TRUE;
- 2883 IGNR 0 3 3 3 end;
- 2885 IGNR 1 5 5 5 temp_rec := g_rec;
- 2886 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2887 IGNR 1 1 1 1 wt_assert.eq (
- 2891 IGNR 1 0 0 0 wt_assert.eq (
- 2896 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE XMLTYPE Sad Path 3';
- 2897 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2898 IGNR 1 0 0 0 eqqueryvalue (
- 2902 IGNR 1 3 3 3 temp_rec := g_rec;
- 2903 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2905 IGNR 1 1 1 1 wt_assert.eq (
- 2909 IGNR 1 1 1 1 wt_assert.isnotnull (
- 2912 IGNR 1 9 9 9 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2918 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 1';
- 2919 IGNR 1 1 1 1 eqqueryvalue (
- 2924 IGNR 1 5 5 5 temp_rec := g_rec;
- 2926 IGNR 1 0 0 0 wt_assert.eq (
- 2930 IGNR 1 1 1 1 wt_assert.eq (
- 2935 IGNR 1 0 0 0 wt_assert.eq (
- 2939 IGNR 1 1 1 1 wt_assert.isnotnull (
- 2942 IGNR 1 17 17 17 wt_assert.this (
- 2947 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Happy Path 2';
- 2948 IGNR 1 0 0 0 eqqueryvalue (
- 2953 IGNR 1 1 1 1 temp_rec := g_rec;
- 2955 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 1';
- 2956 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2957 IGNR 1 0 0 0 eqqueryvalue (
- 2961 IGNR 1 4 4 4 temp_rec := g_rec;
- 2962 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2964 IGNR 1 0 0 0 wt_assert.eq (
- 2968 IGNR 1 1 1 1 wt_assert.isnotnull (
- 2971 IGNR 1 12 12 12 wt_assert.this (
- 2977 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 2';
- 2978 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 2980 IGNR 1 0 0 0 eqqueryvalue (
- 2985 IGNR 0 0 0 0 l_found_exception := FALSE;
- 2986 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 2987 IGNR 1 0 0 0 l_found_exception := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2988 IGNR 0 1 1 1 end;
- 2990 IGNR 1 4 4 4 temp_rec := g_rec;
- 2991 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 2992 IGNR 1 0 0 0 wt_assert.eq (
- 2996 IGNR 1 0 0 0 wt_assert.eq (
- 3001 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE CLOB Sad Path 3';
- 3002 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 3003 IGNR 1 1 1 1 eqqueryvalue (
- 3007 IGNR 1 1 1 1 temp_rec := g_rec;
- 3008 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3010 IGNR 1 0 0 0 wt_assert.eq (
- 3014 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3017 IGNR 1 7 7 7 wt_assert.this (
- 3023 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 1';
- 3024 IGNR 1 0 0 0 eqqueryvalue (
- 3029 IGNR 1 1 1 1 temp_rec := g_rec;
- 3031 IGNR 1 0 0 0 wt_assert.eq (
- 3035 IGNR 1 1 1 1 wt_assert.eq (
- 3040 IGNR 1 0 0 0 wt_assert.eq (
- 3044 IGNR 1 1 1 1 wt_assert.eq (
- 3050 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Happy Path 2';
- 3051 IGNR 1 0 0 0 eqqueryvalue (
- 3057 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 1';
- 3058 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3059 IGNR 1 1 1 1 eqqueryvalue (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3063 IGNR 1 2 2 2 temp_rec := g_rec;
- 3064 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3066 IGNR 1 1 1 1 wt_assert.eq (
- 3070 IGNR 1 2 2 2 wt_assert.eq (
- 3076 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 2';
- 3077 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3079 IGNR 1 0 0 0 eqqueryvalue (
- 3084 IGNR 0 0 0 0 l_found_exception := FALSE;
- 3085 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3086 IGNR 1 0 0 0 l_found_exception := TRUE;
- 3087 IGNR 0 1 1 1 end;
- 3089 IGNR 1 2 2 2 temp_rec := g_rec;
- 3090 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3091 IGNR 1 1 1 1 wt_assert.eq (
- 3095 IGNR 1 1 1 1 wt_assert.eq (
- 3100 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERYVALUE BLOB Sad Path 3';
- 3101 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3102 IGNR 1 0 0 0 eqqueryvalue (
- 3106 IGNR 1 1 1 1 temp_rec := g_rec;
- 3107 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3109 IGNR 1 0 0 0 wt_assert.eq (
- 3113 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3116 IGNR 1 7 7 7 wt_assert.this (
- 3121 IGNR 1 2 2 2 end t_eqqueryvalue;
- 3126 UNKN 0 2 1 1 procedure eqquery (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3133 EXEC 4 3 1 1 g_rec.last_assert := 'EQQUERY';
- 3134 EXEC 4 3 1 1 g_rec.last_msg := msg_in;
- 3135 EXEC 4 2 1 1 compare_queries(check_query_in, against_query_in);
- 3136 EXEC 4 1 0 1 g_rec.raise_exception := raise_exc_in;
- 3137 EXEC 4 4 1 1 process_assertion;
- 3138 EXEC 3 2 0 1 end eqquery;
- 3142 IGNR 0 3 3 3 procedure t_eqquery
- 3147 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Happy Path 1';
- 3148 IGNR 1 0 0 0 wt_assert.eqquery (
- 3152 IGNR 1 2 2 2 temp_rec := g_rec;
- 3154 IGNR 1 1 1 1 wt_assert.eq (
- 3158 IGNR 1 0 0 0 wt_assert.eq (
- 3163 IGNR 1 1 1 1 wt_assert.eq (
- 3167 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3170 IGNR 1 3 3 3 wt_assert.this (
- 3175 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 1';
- 3176 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3177 IGNR 1 1 1 1 eqquery (
- 3181 IGNR 1 4 4 4 temp_rec := g_rec;
- 3182 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3184 IGNR 1 1 1 1 wt_assert.eq (
- 3188 IGNR 1 1 1 1 wt_assert.isnotnull (
- 3191 IGNR 1 3 3 3 wt_assert.this (
- 3196 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 2';
- 3197 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3199 IGNR 1 1 1 1 eqquery (
- 3204 IGNR 0 0 0 0 l_found_exception := FALSE;
- 3205 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3206 IGNR 1 0 0 0 l_found_exception := TRUE;
- 3207 IGNR 0 1 1 1 end;
- 3208 IGNR 1 4 4 4 temp_rec := g_rec;
- 3209 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3211 IGNR 1 1 1 1 wt_assert.eq (
- 3215 IGNR 1 1 1 1 wt_assert.eq (
- 3220 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQQUERY Tests Sad Path 3';
- 3221 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 3222 IGNR 1 0 0 0 eqquery (
- 3226 IGNR 1 4 4 4 temp_rec := g_rec;
- 3227 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3229 IGNR 1 1 1 1 wt_assert.eq (
- 3233 IGNR 1 1 1 1 wt_assert.isnotnull (
- 3236 IGNR 1 10 10 10 wt_assert.this (
- 3240 IGNR 1 1 1 1 end t_eqquery;
- 3245 UNKN 0 6 1 2 procedure eqtable (
- 3253 EXEC 5 5 1 1 l_check_query varchar2(16000) := 'select * from ' || check_this_in;
- 3254 EXEC 5 2 1 1 l_against_query varchar2(16000) := 'select * from ' || against_this_in;
- 3256 EXEC 5 4 1 1 g_rec.last_assert := 'EQTABLE';
- 3257 EXEC 5 3 0 1 g_rec.last_msg := msg_in;
- 3258 EXEC 5 1 0 1 if check_where_in is not null
- 3260 EXEC 3 2 0 1 l_check_query := l_check_query || ' where ' || check_where_in;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3262 EXEC 3 0 0 0 if against_where_in is not null
- 3264 EXEC 3 1 1 1 l_against_query := l_against_query || ' where ' || against_where_in;
- 3266 EXEC 5 1 0 1 compare_queries(l_check_query, l_against_query);
- 3267 EXEC 5 1 0 1 g_rec.raise_exception := raise_exc_in;
- 3268 EXEC 5 5 1 2 process_assertion;
- 3269 EXEC 4 3 1 1 end eqtable;
- 3273 IGNR 0 4 4 4 procedure t_eqtable
- 3278 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABLE Tests Happy Path 1';
- 3279 IGNR 1 0 0 0 wt_assert.eqtable (
- 3285 IGNR 1 1 1 1 temp_rec := g_rec;
- 3287 IGNR 1 1 1 1 wt_assert.eq (
- 3291 IGNR 1 0 0 0 wt_assert.eq (
- 3296 IGNR 1 1 1 1 wt_assert.eq (
- 3300 IGNR 1 1 1 1 wt_assert.isnotnull (
- 3303 IGNR 1 4 4 4 wt_assert.this (
- 3308 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Tests Happy Path 2';
- 3309 IGNR 1 9 1 5 eqtable (
- 3316 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 1';
- 3317 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3318 IGNR 1 4 1 3 eqtable (
- 3324 IGNR 1 6 6 6 temp_rec := g_rec;
- 3325 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3327 IGNR 1 1 1 1 wt_assert.eq (
- 3331 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3334 IGNR 1 7 7 7 wt_assert.this (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3339 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 2';
- 3340 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3342 IGNR 1 4 1 3 eqtable (
- 3349 IGNR 0 0 0 0 l_found_exception := FALSE;
- 3350 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3351 IGNR 1 1 1 1 l_found_exception := TRUE;
- 3352 IGNR 0 2 2 2 end;
- 3354 IGNR 1 4 4 4 temp_rec := g_rec;
- 3355 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3356 IGNR 1 1 1 1 wt_assert.eq (
- 3360 IGNR 1 0 0 0 wt_assert.eq (
- 3365 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABLE Sad Path 3';
- 3366 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 3367 IGNR 1 0 0 0 eqtable (
- 3371 IGNR 1 6 6 6 temp_rec := g_rec;
- 3372 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3374 IGNR 1 1 1 1 wt_assert.eq (
- 3378 IGNR 1 1 1 1 wt_assert.isnotnull (
- 3381 IGNR 1 11 11 11 wt_assert.this (
- 3385 IGNR 1 2 2 2 end t_eqtable;
- 3390 UNKN 0 10 1 2 procedure eqtabcount (
- 3398 EXEC 6 7 1 2 l_query varchar2(16000) := 'select count(*) from ' || check_this_in;
- 3402 EXEC 11 27 1 5 procedure l_run_query is
- 3406 EXEC 11 71425 112 68989 open l_rc for l_query;
- 3407 EXEC 10 200334 1177 33514 fetch l_rc into l_cnt;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3408 EXEC 10 666 41 154 close l_rc;
- 3409 EXEC 10 18 1 2 l_success := TRUE;
- 3411 EXEC 1 0 0 0 when OTHERS
- 3413 EXEC 1 231 231 231 g_rec.last_details := SQLERRM || CHR(10) ||
- 3415 EXEC 1 1 1 1 g_rec.last_pass := FALSE;
- 3416 EXEC 1 0 0 0 l_success := FALSE;
- 3417 EXEC 1 1 1 1 g_rec.raise_exception := raise_exc_in;
- 3418 EXEC 1 1 1 1 process_assertion;
- 3419 EXEC 11 86 1 38 end l_run_query;
- 3421 EXEC 6 2 0 1 g_rec.last_assert := 'EQTABCOUNT';
- 3422 EXEC 6 2 0 1 g_rec.last_msg := msg_in;
- 3424 EXEC 6 1 0 1 l_query := 'select count(*) from ' || check_this_in;
- 3425 EXEC 6 2 0 1 if check_where_in is not null
- 3427 EXEC 4 3 1 1 l_query := l_query || ' where ' || check_where_in;
- 3429 EXEC 6 1 0 1 l_run_query;
- 3430 EXEC 7 5 1 1 if NOT l_success then return; end if;
- 3431 EXEC 5 6 1 2 l_check_cnt := l_cnt;
- 3433 EXEC 5 22 4 5 l_query := 'select count(*) from ' || against_this_in;
- 3434 EXEC 5 1 0 1 if against_where_in is not null
- 3436 EXEC 3 4 1 2 l_query := l_query || ' where ' || against_where_in;
- 3438 EXEC 5 5 1 1 l_run_query;
- 3439 EXEC 5 2 0 1 if NOT l_success then return; end if;
- 3440 EXEC 5 11 2 3 g_rec.last_pass := (l_check_cnt = l_cnt);
- 3442 EXEC 5 54 10 11 g_rec.last_details := 'Expected ' || l_cnt || ' rows from "' || against_this_in ||
- 3445 EXEC 5 0 0 0 g_rec.raise_exception := raise_exc_in;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3446 EXEC 5 5 1 1 process_assertion;
- 3447 EXEC 4 3 1 1 end eqtabcount;
- 3451 IGNR 0 4 4 4 procedure t_eqtabcount
- 3456 IGNR 1 1 1 1 wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 1';
- 3457 IGNR 1 7 1 4 eqtabcount (
- 3463 IGNR 1 1 1 1 temp_rec := g_rec;
- 3465 IGNR 1 0 0 0 wt_assert.eq (
- 3469 IGNR 1 1 1 1 wt_assert.eq (
- 3474 IGNR 1 1 1 1 wt_assert.eq (
- 3478 IGNR 1 1 1 1 wt_assert.isnotnull (
- 3481 IGNR 1 8 8 8 wt_assert.this (
- 3487 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Tests Happy Path 2';
- 3488 IGNR 1 4 1 3 eqtabcount (
- 3495 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 1';
- 3496 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 3497 IGNR 1 3 1 2 eqtabcount (
- 3503 IGNR 1 5 5 5 temp_rec := g_rec;
- 3504 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3506 IGNR 1 0 0 0 wt_assert.eq (
- 3510 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3513 IGNR 1 8 8 8 wt_assert.this (
- 3519 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 2';
- 3520 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3522 IGNR 1 3 1 2 eqtabcount (
- 3529 IGNR 0 0 0 0 l_found_exception := FALSE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3530 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3531 IGNR 1 1 1 1 l_found_exception := TRUE;
- 3532 IGNR 0 1 1 1 end;
- 3534 IGNR 1 4 4 4 temp_rec := g_rec;
- 3535 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3536 IGNR 1 0 0 0 wt_assert.eq (
- 3540 IGNR 1 0 0 0 wt_assert.eq (
- 3545 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 3';
- 3546 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3547 IGNR 1 1 1 1 eqtabcount (
- 3551 IGNR 1 6 6 6 temp_rec := g_rec;
- 3552 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3554 IGNR 1 0 0 0 wt_assert.eq (
- 3558 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3561 IGNR 1 8 8 8 wt_assert.this (
- 3566 IGNR 1 0 0 0 wt_assert.g_testcase := 'EQTABCOUNT Sad Path 4';
- 3567 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3568 IGNR 1 0 0 0 eqtabcount (
- 3572 IGNR 1 4 4 4 temp_rec := g_rec;
- 3573 IGNR 1 1 1 1 wtplsql_skip_save := FALSE;
- 3575 IGNR 1 1 1 1 wt_assert.eq (
- 3579 IGNR 1 0 0 0 wt_assert.isnotnull (
- 3583 IGNR 1 6 6 6 wt_assert.this (
- 3587 IGNR 1 2 2 2 wt_assert.this (
- 3591 IGNR 1 2 2 2 end t_eqtabcount;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3596 EXEC 6 6 0 1 procedure objexists (
- 3605 EXEC 6 1 0 1 g_rec.last_assert := 'OBJEXISTS';
- 3606 EXEC 6 2 0 1 g_rec.last_msg := msg_in;
- 3607 EXEC 6 4528 118 1586 select count(*) into l_num_objects
- 3614 EXEC 6 15 0 3 g_rec.last_pass := case l_num_objects when 0 then FALSE else TRUE end;
- 3615 EXEC 6 5 0 2 g_rec.last_details := 'Number of objects found for "' ||
- 3616 UNKN 0 20 0 6 case when obj_owner_in is null then ''
- 3619 UNKN 0 31 1 6 case when obj_type_in is null then ''
- 3622 EXEC 6 0 0 0 g_rec.raise_exception := raise_exc_in;
- 3623 EXEC 6 4 1 1 process_assertion;
- 3624 EXEC 5 5 1 1 end objexists;
- 3627 UNKN 0 3 1 2 procedure objexists (
- 3633 EXEC 2 7 3 4 l_pos number := instr(check_this_in, '.');
- 3635 EXEC 2 7 3 4 objexists(msg_in => msg_in
- 3638 EXEC 2 0 0 0 end objexists;
- 3642 IGNR 0 2 2 2 procedure t_object_exists
- 3647 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 1';
- 3648 IGNR 1 0 0 0 objexists (
- 3652 IGNR 1 2 2 2 temp_rec := g_rec;
- 3654 IGNR 1 1 1 1 wt_assert.eq (
- 3658 IGNR 1 0 0 0 wt_assert.eq (
- 3663 IGNR 1 0 0 0 wt_assert.eq (
- 3667 IGNR 1 0 0 0 wt_assert.eq (
- 3672 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJEXISTS Happy Path 2';
- 3673 IGNR 1 1 1 1 objexists (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3679 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 3';
- 3680 IGNR 1 0 0 0 objexists (
- 3684 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Happy Path 4';
- 3685 IGNR 1 1 1 1 objexists (
- 3689 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJEXISTS Sad Path 1';
- 3690 IGNR 1 1 1 1 wtplsql_skip_save := TRUE;
- 3691 IGNR 1 1 1 1 objexists (
- 3695 IGNR 1 2 2 2 temp_rec := g_rec;
- 3696 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3698 IGNR 1 1 1 1 wt_assert.eq (
- 3702 IGNR 1 0 0 0 wt_assert.eq (
- 3707 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJEXISTS Sad Path 2';
- 3708 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3710 IGNR 1 0 0 0 objexists (
- 3715 IGNR 0 0 0 0 l_found_exception := FALSE;
- 3716 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3717 IGNR 1 0 0 0 l_found_exception := TRUE;
- 3718 IGNR 0 1 1 1 end;
- 3719 IGNR 1 1 1 1 temp_rec := g_rec;
- 3720 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3722 IGNR 1 0 0 0 wt_assert.eq (
- 3726 IGNR 1 0 0 0 wt_assert.eq (
- 3730 IGNR 1 0 0 0 end t_object_exists;
- 3735 EXEC 5 5 0 1 procedure objnotexists (
- 3744 EXEC 5 1 0 1 g_rec.last_assert := 'OBJNOTEXISTS';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3745 EXEC 5 0 0 0 g_rec.last_msg := msg_in;
- 3746 EXEC 5 888 121 249 select count(*) into l_num_objects
- 3753 EXEC 5 11 0 5 g_rec.last_pass := case l_num_objects when 0 then TRUE else FALSE end;
- 3754 EXEC 5 1 1 1 g_rec.last_details := 'Number of objects found for "' ||
- 3755 UNKN 0 8 0 2 case when obj_owner_in is null then ''
- 3758 UNKN 0 9 1 2 case when obj_type_in is null then ''
- 3761 EXEC 5 1 0 1 g_rec.raise_exception := raise_exc_in;
- 3762 EXEC 5 0 0 0 process_assertion;
- 3763 EXEC 4 2 1 1 end objnotexists;
- 3766 UNKN 0 2 2 2 procedure objnotexists (
- 3772 EXEC 1 2 2 2 l_pos number := instr(check_this_in, '.');
- 3774 EXEC 1 3 3 3 objnotexists(msg_in => msg_in
- 3777 EXEC 1 0 0 0 end objnotexists;
- 3781 IGNR 0 2 2 2 procedure t_object_not_exists
- 3786 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 1';
- 3787 IGNR 1 0 0 0 objnotexists (
- 3791 IGNR 1 1 1 1 temp_rec := g_rec;
- 3793 IGNR 1 1 1 1 wt_assert.eq (
- 3797 IGNR 1 0 0 0 wt_assert.eq (
- 3802 IGNR 1 1 1 1 wt_assert.eq (
- 3806 IGNR 1 1 1 1 wt_assert.eq (
- 3811 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 2';
- 3812 IGNR 1 0 0 0 objnotexists (
- 3818 IGNR 1 0 0 0 wt_assert.g_testcase := 'OBJNOTEXISTS Happy Path 3';
- 3819 IGNR 1 0 0 0 objnotexists (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3823 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 1';
- 3824 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3825 IGNR 1 0 0 0 objnotexists (
- 3829 IGNR 1 2 2 2 temp_rec := g_rec;
- 3830 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3832 IGNR 1 0 0 0 wt_assert.eq (
- 3836 IGNR 1 0 0 0 wt_assert.eq (
- 3841 IGNR 1 1 1 1 wt_assert.g_testcase := 'OBJNOTEXISTS Sad Path 2';
- 3842 IGNR 1 0 0 0 wtplsql_skip_save := TRUE;
- 3844 IGNR 1 0 0 0 objnotexists (
- 3849 IGNR 0 0 0 0 l_found_exception := FALSE;
- 3850 IGNR 1 0 0 0 exception when ASSERT_FAILURE_EXCEPTION then
- 3851 IGNR 1 0 0 0 l_found_exception := TRUE;
- 3852 IGNR 0 1 1 1 end;
- 3854 IGNR 1 1 1 1 temp_rec := g_rec;
- 3855 IGNR 1 0 0 0 wtplsql_skip_save := FALSE;
- 3856 IGNR 1 0 0 0 wt_assert.eq (
- 3860 IGNR 1 0 0 0 wt_assert.eq (
- 3864 IGNR 1 1 1 1 end t_object_not_exists;
- 3873 IGNR 0 5 5 5 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %--
- 3876 IGNR 1 2874 2874 2874 select temp_clob, temp_nclob, temp_xml, temp_blob
- 3880 IGNR 1 1 1 1 t_boolean_to_status;
- 3881 IGNR 1 0 0 0 t_process_assertion;
- 3882 IGNR 1 0 0 0 t_compare_queries;
- 3883 IGNR 1 0 0 0 t_nls_settings;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3884 IGNR 1 0 0 0 t_last_values;
- 3885 IGNR 1 0 0 0 t_reset_globals;
- 3886 IGNR 1 0 0 0 t_this;
- 3887 IGNR 1 0 0 0 t_eq;
- 3888 IGNR 1 0 0 0 t_isnotnull;
- 3889 IGNR 1 0 0 0 t_isnull;
- 3891 IGNR 1 0 0 0 t_raises;
- 3892 IGNR 1 0 0 0 t_eqqueryvalue;
- 3893 IGNR 1 1 1 1 t_eqquery;
- 3894 IGNR 1 0 0 0 t_eqtable;
- 3895 IGNR 1 1 1 1 t_eqtabcount;
- 3896 IGNR 1 1 1 1 t_object_exists;
- 3897 IGNR 1 0 0 0 t_object_not_exists;
- 3898 IGNR 1 2 2 2 end WTPLSQL_RUN;
- 3903 EXCL 0 0 0 0 end wt_assert;
-
-
- wtPLSQL 1.1.0 - Run ID 7: 29-Jun-2018 03:22:00 PM
-
- Test Results for WTP.WT_PROFILER
- Total Test Cases: 41 Total Assertions: 265
- Minimum Interval msec: 0 Failed Assertions: 1
- Average Interval msec: 5 Error Assertions: 0
- Maximum Interval msec: 129 Test Yield: 99.60%
- Total Run Time (sec): 1.3
-
- Code Coverage for PACKAGE BODY WTP.WT_PROFILER
- Ignored Lines: 534 Total Profiled Lines: 696
- Excluded Lines: 2 Total Executed Lines: 143
- Minimum LineExec usec: 0 Not Executed Lines: 6
- Average LineExec usec: 672 Unknown Lines: 11
- Maximum LineExec usec: 86060 Code Coverage: 96.00%
- Trigger Source Offset: 0
-
- - WTP.WT_PROFILER Test Result Details (Test Run ID 7)
------------------------------------------------------------
- ---- Test Case: Get Error Messages
- PASS 129ms ERROR_PARAM Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: A subprogram was called with an incorrect parameter."
- PASS 1ms ERROR_PARAM Test 2. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms ERROR_IO Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: Data flush operation failed. Check whether the profiler tables have been created, are accessible, and that there is adequate space."
- PASS 0ms ERROR_IO Test 2. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms ERROR_VERSION Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: There is a mismatch between package and database implementation. Oracle returns this error if an incorrect version of the DBMS_PROFILER package is installed, and if the version of the profiler package cannot work with this database version."
- PASS 0ms ERROR_VERSION Test 2. THIS - Expected "TRUE" and got "TRUE"
- PASS 0ms Unknown Error Test 1. ISNOTNULL - Expected NOT NULL and got "DBMS_PROFILER Error: Unknown error number -9999"
- PASS 0ms Unknown Error Test 2. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: Delete PL/SQL Profiler Records Happy Path 1
- PASS 1ms delete_plsql_profiler_recs(-99) 1. ISNULL - Expected NULL and got ""
- PASS 1ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -99
- PASS 5ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -99
- PASS 3ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -99
- ---- Test Case: Delete PL/SQL Profiler Records Happy Path 2
- PASS 4ms insert plsql_profiler_runs (-99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_runs (runid) values (-99)".
- PASS 6ms insert plsql_profiler_units (-99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_units (runid, unit_number, total_time) values (-99, -99, 0)".
- PASS 2ms insert plsql_profiler_data (RUNID: -99). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_data (runid, unit_number, line#) values (-99, -99, 0)".
- PASS 1ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_runs where runid = -99
- PASS 1ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -99
- PASS 0ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_data where runid = -99
- PASS 1ms delete_plsql_profiler_recs(-99) 2. ISNULL - Expected NULL and got ""
- PASS 0ms Number of plsql_profiler_runs (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -99
- PASS 0ms Number of plsql_profiler_units (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -99
- PASS 1ms Number of plsql_profiler_data (-99). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -99
- ---- Test Case: Find DBOUT Setup
- PASS 13ms Compile package WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_FIND_DBOUT is\n l_junk number;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 0ms Compile package WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_FIND_DBOUT package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE) is 1
- ---- Test Case: Find DBOUT Happy Path 1
- PASS 11ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 1ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Find DBOUT Happy Path 2
- PASS 20ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WT_PROFILE_FIND_DBOUT:PACKAGE BODY" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 88ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP"
- PASS 1ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT"
- PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY"
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Find DBOUT Happy Path 3
- PASS 22ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WTP.WT_PROFILE_FIND_DBOUT:PACKAGE BODY" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 0ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 75ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP"
- PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT"
- PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY"
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Find DBOUT Sad Path 1
- PASS 25ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "BOGUS1" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 0ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 72ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.error_message. EQ - Expected "Unable to find database object "BOGUS1"." and got "Unable to find database object "BOGUS1"."
- ---- Test Case: Find DBOUT Sad Path 2
- PASS 21ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "WTP.WT_PROFILE_FIND_DBOUT" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 2ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 2ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 69ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP"
- PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_FIND_DBOUT" and got "WT_PROFILE_FIND_DBOUT"
- PASS 0ms l_recTEST.error_message. EQ - Expected "Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT"." and got "Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT"."
- ---- Test Case: Find DBOUT Sad Path 3
- PASS 22ms Compile package body WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_FIND_DBOUT is\n --% WTPLSQL SET DBOUT "SYS.ALL_OBJECTS:VIEW" %--\nbegin\n l_junk := 1;\nend WT_PROFILE_FIND_DBOUT;".
- PASS 1ms Compile package body WT_PROFILE_FIND_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_FIND_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE BODY) is 1
- PASS 78ms l_recTEST.dbout_owner. EQ - Expected "SYS" and got "SYS"
- PASS 0ms l_recTEST.dbout_name. EQ - Expected "ALL_OBJECTS" and got "ALL_OBJECTS"
- PASS 0ms l_recTEST.dbout_type. EQ - Expected "VIEW" and got "VIEW"
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Find DBOUT Teardown
- PASS 23ms drop package WT_PROFILE_FIND_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_FIND_DBOUT".
- PASS 0ms WT_PROFILE_FIND_DBOUT package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_FIND_DBOUT"(PACKAGE) is 0
- ---- Test Case: Load Ignr Setup
- PASS 0ms Number of IGNR_AA elements. ISNOTNULL - Expected NOT NULL and got "0"
- PASS 14ms Compile package WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_LOAD_IGNR is\n l_junk number;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE) is 1
- ---- Test Case: Load Ignr Happy Path 1
- PASS 10ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 1ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 1ms l_ignrTest.COUNT. EQ - Expected "0" and got "0"
- ---- Test Case: Load Ignr Happy Path 2
- PASS 19ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 1;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 1ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 44ms l_ignrTest.COUNT. EQ - Expected "3" and got "3"
- PASS 0ms l_ignrTest.exists(3). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Load Ignr Happy Path 3
- PASS 20ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 1ms l_ignrTest.COUNT. EQ - Expected "3" and got "3"
- PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Load Ignr Happy Path 4
- PASS 18ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 2ms l_ignrTest.COUNT. EQ - Expected "6" and got "6"
- PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE"
- PASS 2ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(8). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(9). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(10). EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Load Ignr Sad Path 1
- PASS 25ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 0ms l_ignrTest.COUNT. EQ - Expected "0" and got "0"
- ---- Test Case: Load Ignr Sad Path 2
- PASS 21ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 4ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 2ms l_ignrTest.COUNT. EQ - Expected "3" and got "3"
- PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Load Ignr Sad Path 3
- PASS 21ms Compile package body WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_LOAD_IGNR is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 3;\n --%WTPLSQL_end_ignore_lines%--\n l_junk := 4;\nend WT_PROFILE_LOAD_IGNR;".
- PASS 0ms Compile package body WT_PROFILE_LOAD_IGNR Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_LOAD_IGNR package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE BODY) is 1
- PASS 1ms l_ignrTest.COUNT. EQ - Expected "5" and got "5"
- PASS 0ms l_ignrTest.exists(4). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(5). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(6). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(7). EQ - Expected "TRUE" and got "TRUE"
- PASS 0ms l_ignrTest.exists(8). EQ - Expected "TRUE" and got "TRUE"
- ---- Test Case: Load Ignr Teardown
- PASS 25ms drop package WT_PROFILE_LOAD_IGNR. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_LOAD_IGNR".
- PASS 1ms WT_PROFILE_LOAD_IGNR package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_LOAD_IGNR"(PACKAGE) is 0
- PASS 0ms Number of IGNR_AA elements. ISNOTNULL - Expected NOT NULL and got "0"
- ---- Test Case: Insert DBOUT Profile Setup
- PASS 15ms Compile package WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_INSERT_DBOUT is\n l_junk number;\nend WT_PROFILE_INSERT_DBOUT;".
- PASS 0ms Compile package WT_PROFILE_INSERT_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_INSERT_DBOUT package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE) is 1
- PASS 9ms Compile package body WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INSERT_DBOUT is\nbegin\n l_junk := 1;\n --%WTPLSQL_begin_ignore_lines%--\n l_junk := 2;\n --%WTPLSQL_end_ignore_lines%--\n if 0 = 1 then\n l_junk := 3;\n end if;\nend WT_PROFILE_INSERT_DBOUT;".
- PASS 1ms Compile package body WT_PROFILE_INSERT_DBOUT Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_INSERT_DBOUT package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE BODY) is 1
- PASS 2ms insert plsql_profiler_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_runs (runid) values (-97)".
- PASS 3ms insert plsql_profiler_units (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_units (runid, unit_number, total_time) values (-97, -97, 0)".
- PASS 3ms insert plsql_profiler_data (RUNID: -97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into plsql_profiler_data (runid, unit_number, line#) values (-97, -97, 0)".
- PASS 1ms Number of plsql_profiler_runs (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_runs where runid = -97
- PASS 2ms Number of plsql_profiler_units (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -97
- PASS 2ms Number of plsql_profiler_data (-97). EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_data where runid = -97
- PASS 1ms Insert wt_test_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-97, sysdate, USER, 'Insert DBOUT Test')".
- PASS 1ms wt_test_runs (-97) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -97
- PASS 2ms insert UNIT 1 into plsql_profiler_units. ISNULL - Expected NULL and got ""
- PASS 1ms Number of UNIT 1 plsql_profiler_units. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from plsql_profiler_units where runid = -97 and unit_number = 1
- PASS 4ms insert plsql_profiler_data (LINE#: 1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms insert plsql_profiler_data (LINE#: 2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms insert plsql_profiler_data (LINE#: 3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms insert plsql_profiler_data (LINE#: 5). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms insert plsql_profiler_data (LINE#: 7). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms insert plsql_profiler_data (LINE#: 8). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms insert plsql_profiler_data (LINE#: 9). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms insert plsql_profiler_data (LINE#: 10). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 5ms Number of UNIT 1 plsql_profiler_data. EQQUERYVALUE - Expected "8" and got "8" for Query: select count(*) from plsql_profiler_data where runid = -97 and unit_number = 1
- ---- Test Case: Insert DBOUT Profile Happy Path
- PASS 4ms SQLERRM. ISNULL - Expected NULL and got ""
- PASS 6ms wt_dbout_profiles line 1, column STATUS. EQQUERYVALUE - Expected "EXCL" and got "EXCL" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 1
- PASS 2ms wt_dbout_profiles line 1, column TEXT. EQQUERYVALUE - Expected "package body WT_PROFILE_INSERT_DBOUT is\n" and got "package body WT_PROFILE_INSERT_DBOUT is\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 1
-#FAIL# 2ms wt_dbout_profiles line 2, column STATUS. EQQUERYVALUE - Expected "UNKN" and got "NOTX" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 2
- PASS 1ms wt_dbout_profiles line 2, column TEXT. EQQUERYVALUE - Expected "begin\n" and got "begin\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 2
- PASS 1ms wt_dbout_profiles line 3, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 3
- PASS 1ms wt_dbout_profiles line 3, column TEXT. EQQUERYVALUE - Expected " l_junk := 1;\n" and got " l_junk := 1;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 3
- PASS 1ms wt_dbout_profiles line 5, column STATUS. EQQUERYVALUE - Expected "IGNR" and got "IGNR" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 5
- PASS 1ms wt_dbout_profiles line 5, column TEXT. EQQUERYVALUE - Expected " l_junk := 2;\n" and got " l_junk := 2;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 5
- PASS 2ms wt_dbout_profiles line 7, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 7
- PASS 2ms wt_dbout_profiles line 7, column TEXT. EQQUERYVALUE - Expected " if 0 = 1 then\n" and got " if 0 = 1 then\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 7
- PASS 2ms wt_dbout_profiles line 8, column STATUS. EQQUERYVALUE - Expected "NOTX" and got "NOTX" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 8
- PASS 1ms wt_dbout_profiles line 8, column TEXT. EQQUERYVALUE - Expected " l_junk := 3;\n" and got " l_junk := 3;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 8
- PASS 2ms wt_dbout_profiles line 9, column STATUS. EQQUERYVALUE - Expected "EXEC" and got "EXEC" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 9
- PASS 1ms wt_dbout_profiles line 9, column TEXT. EQQUERYVALUE - Expected " end if;\n" and got " end if;\n" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 9
- PASS 2ms wt_dbout_profiles line 10, column STATUS. EQQUERYVALUE - Expected "EXCL" and got "EXCL" for Query: select STATUS from wt_dbout_profiles where test_run_id = -97 and line = 10
- PASS 1ms wt_dbout_profiles line 10, column TEXT. EQQUERYVALUE - Expected "end WT_PROFILE_INSERT_DBOUT;" and got "end WT_PROFILE_INSERT_DBOUT;" for Query: select TEXT from wt_dbout_profiles where test_run_id = -97 and line = 10
- ---- Test Case: Insert DBOUT Profile Teardown
- PASS 4ms Delete wt_dbout_profiles (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -97".
- PASS 7ms wt_dbout_profiles (-97) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -97
- PASS 3ms Delete wt_test_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -97".
- PASS 0ms wt_test_runs (-97) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -97
- PASS 3ms delete plsql_profiler_data (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_data where runid = -97".
- PASS 3ms delete plsql_profiler_units (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_units where runid = -97".
- PASS 1ms delete plsql_profiler_runs (-97). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from plsql_profiler_runs where runid = -97".
- PASS 1ms Number of plsql_profiler_runs (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_runs where runid = -97
- PASS 0ms Number of plsql_profiler_units (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_units where runid = -97
- PASS 0ms Number of plsql_profiler_data (-97). EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from plsql_profiler_data where runid = -97
- PASS 24ms drop package WT_PROFILE_INSERT_DBOUT. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_INSERT_DBOUT".
- PASS 1ms WT_PROFILE_INSERT_DBOUT package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_INSERT_DBOUT"(PACKAGE) is 0
- ---- Test Case: Insert DBOUT Profile Setup
- PASS 22ms Compile package WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package WT_PROFILE_INITIALIZE is\n l_junk number;\nend WT_PROFILE_INITIALIZE;".
- PASS 1ms Compile package WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got ""
- PASS 0ms WT_PROFILE_INITIALIZE package. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE) is 1
- ---- Test Case: Initialize Test HAPPY Path 1
- PASS 16ms Compile package body WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INITIALIZE is\nbegin\n l_junk := 7;\nend WT_PROFILE_INITIALIZE;".
- PASS 0ms Compile package body WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_INITIALIZE package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE BODY) is 1
- PASS 0ms OUT dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms OUT dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms OUT dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms OUT prof_runid. ISNULL - Expected NULL and got ""
- PASS 1ms OUT trigger_offset. ISNULL - Expected NULL and got ""
- PASS 0ms OUT error_message. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.prof_runid. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.trigger_offset. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Initialize Test HAPPY Path 2
- PASS 17ms Compile package body WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "create or replace package body WT_PROFILE_INITIALIZE is\nbegin\n--% WTPLSQL SET DBOUT "WT_PROFILE_INITIALIZE:PACKAGE BODY" %--\n l_junk := 7;\nend WT_PROFILE_INITIALIZE;".
- PASS 1ms Compile package body WT_PROFILE_INITIALIZE Error. ISNULL - Expected NULL and got ""
- PASS 1ms WT_PROFILE_INITIALIZE package body. OBJEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE BODY) is 1
- PASS 86ms OUT dbout_owner. EQ - Expected "WTP" and got "WTP"
- PASS 0ms OUT dbout_name. EQ - Expected "WT_PROFILE_INITIALIZE" and got "WT_PROFILE_INITIALIZE"
- PASS 0ms OUT dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY"
- PASS 0ms OUT prof_runid. ISNOTNULL - Expected NOT NULL and got "5"
- PASS 1ms OUT trigger_offset. EQ - Expected "0" and got "0"
- PASS 0ms OUT error_message. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_owner. EQ - Expected "WTP" and got "WTP"
- PASS 0ms l_recTEST.dbout_name. EQ - Expected "WT_PROFILE_INITIALIZE" and got "WT_PROFILE_INITIALIZE"
- PASS 0ms l_recTEST.dbout_type. EQ - Expected "PACKAGE BODY" and got "PACKAGE BODY"
- PASS 0ms l_recTEST.prof_runid. ISNOTNULL - Expected NOT NULL and got "5"
- PASS 0ms l_recTEST.trigger_offset. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Initialize Test Sad Path 1
- PASS 1ms SQLERRM. EQ - Expected "ORA-20004: i_test_run_id is null" and got "ORA-20004: i_test_run_id is null"
- ---- Test Case: Insert DBOUT Profile Teardown
- PASS 22ms drop package WT_PROFILE_INITIALIZE. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "drop package WT_PROFILE_INITIALIZE".
- PASS 2ms WT_PROFILE_INITIALIZE package. OBJNOTEXISTS - Number of objects found for "WTP.WT_PROFILE_INITIALIZE"(PACKAGE) is 0
- ---- Test Case: Finalize Happy Path 1
- PASS 0ms g_rec.prof_runid. ISNULL - Expected NULL and got ""
- PASS 0ms format_error_stack and format_error_backtrace. ISNULL - Expected NULL and got ""
- ---- Test Case: Finalize Happy Path 2
- PASS 0ms SQLERRM. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got ""
- PASS 1ms l_recTEST.dbout_owner. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_name. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.dbout_type. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.prof_runid. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.trigger_offset. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.error_message. ISNULL - Expected NULL and got ""
- ---- Test Case: Finalize Sad Path 1
- PASS 0ms SQLERRM. EQ - Expected "ORA-20000: g_rec.test_run_id is null" and got "ORA-20000: g_rec.test_run_id is null"
- ---- Test Case: Trigger Offset Happy Path
- PASS 22ms Trigger Test. EQ - Expected "3" and got "3"
- PASS 1ms Package Test. EQ - Expected "0" and got "0"
- ---- Test Case: Trigger Offset Sad Path
- PASS 0ms Non Existent Object. EQ - Expected "0" and got "0"
- ---- Test Case: Calculate Percent Coverage Setup
- PASS 1ms Insert wt_test_runs (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-95, sysdate, USER, 'Calculate Offset Test')".
- PASS 2ms wt_test_runs (-95) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -95
- ---- Test Case: Calculate Percent Coverage Happy Path 1
- PASS 0ms Insert wt_dbout_profiles (-95,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 2ms wt_dbout_profiles (-95,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 1
- PASS 0ms Insert wt_dbout_profiles (-95,2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 2ms wt_dbout_profiles (-95,2) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 2
- PASS 0ms Insert wt_dbout_profiles (-95,3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 2ms wt_dbout_profiles (-95,3) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 3
- PASS 4ms Main Test. EQ - Expected "66.67" and got "66.67"
- PASS 5ms Delete wt_dbout_profiles (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -95".
- PASS 4ms wt_dbout_profiles (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95
- ---- Test Case: Calculate Percent Coverage Happy Path 2
- PASS 2ms Insert wt_dbout_profiles (-95,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms wt_dbout_profiles (-95,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 1
- PASS 1ms Insert wt_dbout_profiles (-95,2). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms wt_dbout_profiles (-95,2) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 2
- PASS 0ms Insert wt_dbout_profiles (-95,3). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms wt_dbout_profiles (-95,3) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95 and line = 3
- PASS 0ms Main Test. EQ - Expected "-1" and got "-1"
- PASS 1ms Delete wt_dbout_profiles (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_dbout_profiles where test_run_id = -95".
- PASS 0ms wt_dbout_profiles (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -95
- ---- Test Case: Calculate Percent Coverage Sad Path
- PASS 0ms Missing Test Run ID. ISNULL - Expected NULL and got ""
- PASS 0ms NULL Test Run ID. ISNULL - Expected NULL and got ""
- ---- Test Case: Calculate Percent Coverage Teardown
- PASS 2ms Delete wt_test_runs (-95). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -95".
- PASS 0ms wt_test_runs (-95) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -95
- ---- Test Case: Delete Records Setup
- PASS 2ms wt_test_runs Count 0. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -98
- PASS 6ms wt_dbout_profiles Count 0. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98
- PASS 1ms Insert wt_test_runs (-98). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into wt_test_runs (id, start_dtm, runner_owner, runner_name) values (-98, sysdate, USER, 'Delete Records Test')".
- PASS 0ms wt_test_runs (-98) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_test_runs where id = -98
- PASS 1ms Insert wt_dbout_profiles (-98,1). EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 1ms wt_dbout_profiles (-98,1) Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98 and line = 1
- ---- Test Case: Delete Records Happy Path 1
- PASS 1ms SQLERRM. ISNULL - Expected NULL and got ""
- PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98
- ---- Test Case: Delete Records Sad Path 1
- PASS 1ms SQLERRM. ISNULL - Expected NULL and got ""
- PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98
- ---- Test Case: Delete Records Sad Path 2
- PASS 0ms SQLERRM. ISNULL - Expected NULL and got ""
- PASS 0ms wt_dbout_profiles Count 2. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_dbout_profiles where test_run_id = -98
- ---- Test Case: Delete Records Teardown
- PASS 2ms Delete wt_test_runs (-98). RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from wt_test_runs where id = -98".
- PASS 0ms wt_test_runs (-98) Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_test_runs where id = -98
-
- - WTP.WT_PROFILER PACKAGE BODY Code Coverage Details (Test Run ID 7)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 EXCL 0 0 0 0 package body wt_profiler
- 20 IGNR 0 0 0 0 g_skip_insert boolean := FALSE;
- 21 IGNR 0 0 0 0 g_skip_add boolean := FALSE;
- 33 IGNR 0 191 5 49 procedure tl_compile_db_object
- 39 IGNR 20 10 0 1 l_errtxt varchar2(32000) := '';
- 43 IGNR 20 83 2 8 l_sql_txt := 'create or replace ' || in_ptype || ' ' ||
- 47 IGNR 20 41 1 5 wt_assert.raises
- 52 IGNR 40 5932 20 1212 for buff in (select * from user_errors
- 58 IGNR 0 0 0 0 l_errtxt := l_errtxt || buff.line || ', ' ||
- 61 IGNR 20 205 4 113 wt_assert.isnull
- 66 IGNR 20 215 2 15 wt_assert.objexists (
- 71 IGNR 20 50 1 4 end tl_compile_db_object;
- 74 IGNR 0 5 1 2 procedure tl_drop_db_object
- 81 IGNR 4 4 1 1 l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
- 82 IGNR 4 5 1 2 wt_assert.raises
- 86 IGNR 4 54 2 16 wt_assert.objnotexists (
- 91 IGNR 4 3 1 1 end tl_drop_db_object;
- 94 IGNR 0 11 1 5 procedure tl_count_plsql_profiler_recs
- 100 IGNR 5 43 5 16 wt_assert.eqqueryvalue
- 105 IGNR 5 24 3 8 wt_assert.eqqueryvalue
- 111 IGNR 5 25 3 8 wt_assert.eqqueryvalue
- 116 IGNR 5 1 0 1 end tl_count_plsql_profiler_recs;
- 119 IGNR 0 3 1 2 procedure tl_insert_plsql_profiler_recs
- 125 IGNR 2 7 3 4 l_sql_txt := 'insert into plsql_profiler_runs (runid)' ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 127 IGNR 2 5 2 3 wt_assert.raises (
- 132 IGNR 2 11 5 6 l_sql_txt := 'insert into plsql_profiler_units (runid, unit_number, total_time)' ||
- 134 IGNR 2 6 3 3 wt_assert.raises (
- 139 IGNR 2 12 6 6 l_sql_txt := 'insert into plsql_profiler_data (runid, unit_number, line#)' ||
- 141 IGNR 2 8 3 5 wt_assert.raises (
- 145 IGNR 2 1296 161 1136 commit;
- 146 IGNR 2 4 1 3 end tl_insert_plsql_profiler_recs;
- 149 IGNR 0 3 3 3 procedure tl_delete_plsql_profiler_recs
- 155 IGNR 1 5 5 5 l_sql_txt := 'delete from plsql_profiler_data' ||
- 157 IGNR 1 3 3 3 wt_assert.raises (
- 162 IGNR 1 7 7 7 l_sql_txt := 'delete from plsql_profiler_units' ||
- 164 IGNR 1 3 3 3 wt_assert.raises (
- 169 IGNR 1 4 4 4 l_sql_txt := 'delete from plsql_profiler_runs' ||
- 171 IGNR 1 2 2 2 wt_assert.raises (
- 175 IGNR 1 85 85 85 commit;
- 176 IGNR 1 1 1 1 end tl_delete_plsql_profiler_recs;
- 179 IGNR 0 6 2 2 procedure tl_insert_test_runs
- 186 IGNR 3 13 3 7 l_sql_txt := 'insert into wt_test_runs' ||
- 190 IGNR 3 3 1 1 wt_assert.raises (
- 194 IGNR 3 21 7 7 wt_assert.eqqueryvalue (
- 199 IGNR 3 439 134 159 commit;
- 200 IGNR 3 3 1 1 end tl_insert_test_runs;
- 203 IGNR 0 7 1 5 procedure tl_delete_test_runs
- 209 IGNR 3 13 1 10 l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
- 210 IGNR 3 8 1 5 wt_assert.raises (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 214 IGNR 3 23 6 10 wt_assert.eqqueryvalue (
- 219 IGNR 3 762 111 481 commit;
- 220 IGNR 3 4 1 3 end tl_delete_test_runs;
- 223 IGNR 0 17 1 7 procedure tl_insert_dbout_profiles
- 230 IGNR 7 2324 159 713 insert into wt_dbout_profiles values in_rec;
- 231 IGNR 7 15 1 4 l_sqlerrm := SQLERRM;
- 232 IGNR 7 1212 78 531 commit;
- 233 IGNR 0 0 0 0 exception when others then
- 234 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 235 IGNR 0 0 0 0 end;
- 237 IGNR 7 53 5 16 wt_assert.eq (
- 242 IGNR 7 39 5 7 wt_assert.eqqueryvalue (
- 249 IGNR 7 6 1 1 end tl_insert_dbout_profiles;
- 252 IGNR 0 5 1 2 procedure tl_delete_dbout_profiles
- 258 IGNR 3 6 1 3 l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' ||
- 260 IGNR 3 6 1 3 wt_assert.raises (
- 264 IGNR 3 23 4 10 wt_assert.eqqueryvalue (
- 269 IGNR 3 1292 81 643 commit;
- 270 IGNR 3 8 1 4 end tl_delete_dbout_profiles;
- 277 UNKN 0 7 1 1 function get_error_msg
- 281 EXEC 8 1 0 1 l_msg_prefix varchar2(50) := 'DBMS_PROFILER Error: ';
- 283 EXEC 8 0 0 0 case retnum_in
- 284 EXEC 10 11 0 5 when dbms_profiler.error_param then return l_msg_prefix ||
- 286 EXEC 8 4 0 2 when dbms_profiler.error_io then return l_msg_prefix ||
- 290 EXEC 6 6 0 2 when dbms_profiler.error_version then return l_msg_prefix ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 295 EXEC 2 6 1 5 else return l_msg_prefix ||
- 298 EXEC 8 3 0 1 end get_error_msg;
- 302 IGNR 0 5 5 5 procedure t_get_error_msg
- 306 IGNR 2 6 1 5 wt_assert.g_testcase := 'Get Error Messages';
- 307 IGNR 1 1 1 1 wt_assert.isnotnull (
- 310 IGNR 1 24 1 23 wt_assert.this (
- 315 IGNR 1 1 0 1 wt_assert.isnotnull (
- 318 IGNR 1 7 7 7 wt_assert.this (
- 323 IGNR 1 2 1 1 wt_assert.isnotnull (
- 326 IGNR 1 28 28 28 wt_assert.this (
- 331 IGNR 1 2 1 1 wt_assert.isnotnull (
- 334 IGNR 1 7 7 7 wt_assert.this (
- 338 IGNR 1 2 2 2 end t_get_error_msg;
- 343 UNKN 0 3 1 1 procedure delete_plsql_profiler_recs
- 347 EXEC 4 69 13 20 begin
- 348 EXEC 4 972 112 395 delete from plsql_profiler_data
- 350 EXEC 4 510 60 227 delete from plsql_profiler_units
- 352 EXEC 4 355 46 134 delete from plsql_profiler_runs
- 354 EXEC 4 325 54 105 COMMIT;
- 355 EXEC 4 39 9 10 end delete_plsql_profiler_recs;
- 359 IGNR 0 2 2 2 procedure t_delete_profiler_recs
- 361 IGNR 1 1 1 1 c_test_run_id constant number := -99;
- 365 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
- 367 IGNR 1 0 0 0 delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- 368 IGNR 1 47 47 47 l_err_stack := dbms_utility.format_error_stack ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 370 IGNR 0 0 0 0 exception when others then
- 371 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 373 IGNR 0 0 0 0 end;
- 375 IGNR 1 8 8 8 wt_assert.isnull (
- 378 IGNR 1 0 0 0 tl_count_plsql_profiler_recs(c_test_run_id, 0);
- 380 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
- 381 IGNR 1 1 1 1 tl_insert_plsql_profiler_recs(c_test_run_id);
- 382 IGNR 1 1 1 1 tl_count_plsql_profiler_recs(c_test_run_id, 1);
- 384 IGNR 1 0 0 0 delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- 385 IGNR 1 6 6 6 l_err_stack := dbms_utility.format_error_stack ||
- 387 IGNR 0 0 0 0 exception when others then
- 388 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 390 IGNR 0 0 0 0 end;
- 392 IGNR 1 5 5 5 wt_assert.isnull (
- 395 IGNR 1 0 0 0 tl_count_plsql_profiler_recs(c_test_run_id, 0);
- 396 IGNR 1 2 2 2 end t_delete_profiler_recs;
- 401 UNKN 0 33 3 5 procedure find_dbout
- 445 EXEC 8 2 0 1 C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "';
- 446 EXEC 8 1 0 1 C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+';
- 447 EXEC 8 3 0 1 C_TAIL_RE CONSTANT varchar2(30) := '" %--';
- 449#NOTX# 0 0 0 0 cursor c_annotation is
- 450 EXEC 8 1355 118 320 select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT
- 456 UNKN 0 7 1 1 order by src.line;
- 459 UNKN 0 5 1 2 cursor c_readable is
- 460 EXEC 4 903 179 352 select *
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 464 UNKN 0 8 2 2 and src.type = g_rec.dbout_type;
- 471 EXEC 8 0 0 0 open c_annotation;
- 472 EXEC 8 1861 200 277 fetch c_annotation into l_target;
- 473 EXEC 8 11 1 2 if c_annotation%NOTFOUND
- 476 EXEC 2 15 3 12 close c_annotation;
- 477 EXEC 2 3 1 2 return;
- 479 EXEC 6 190 29 37 close c_annotation;
- 481 EXEC 6 197 26 58 l_target := regexp_replace(SRCSTR => l_target
- 487 EXEC 6 72 10 14 l_target := regexp_replace(SRCSTR => l_target
- 493 EXEC 6 25 4 5 l_dot_pos := instr(l_target,'.');
- 494 EXEC 6 6 1 2 l_cln_pos := instr(l_target,':');
- 496 EXEC 6 460474 68570 86060 select obj.owner
- 528 EXEC 1 0 0 0 when NO_DATA_FOUND
- 530 EXEC 1 10 10 10 g_rec.error_message := 'Unable to find database object "' ||
- 532 EXEC 1 1 1 1 return;
- 533 EXEC 1 0 0 0 when TOO_MANY_ROWS
- 535 EXEC 1 10 10 10 g_rec.error_message := 'Found too many database objects "' ||
- 537 EXEC 1 1 1 1 return;
- 540 EXEC 4 4 1 1 open c_readable;
- 541 EXEC 4 2085 125 1201 fetch c_readable into b_readable;
- 542 EXEC 4 7 1 2 if c_readable%NOTFOUND
- 544 EXEC 1 4 0 3 if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY',
- 549 IGNR 0 0 0 0 g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type ||
- 553 EXEC 1 1 1 1 g_rec.prof_runid := -1; -- Don't run profiler.
- 554 EXEC 1 0 0 0 end if;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 556 EXEC 4 129 15 47 close c_readable;
- 558 EXEC 6 46 6 9 end find_dbout;
- 562 IGNR 1 4 4 4 procedure t_find_dbout
- 567 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
- 569 IGNR 0 3 0 1 procedure run_find_dbout is begin
- 570 IGNR 6 10 1 2 l_recSAVE := g_rec;
- 571 IGNR 6 5 1 1 g_rec := l_recNULL;
- 572 IGNR 6 3 0 1 find_dbout(l_pname);
- 573 IGNR 6 31 2 8 l_recTEST := g_rec;
- 574 IGNR 6 4 1 1 g_rec := l_recSAVE;
- 575 IGNR 6 0 0 0 end run_find_dbout;
- 578 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Setup';
- 579 IGNR 1 1 1 1 tl_compile_db_object
- 584 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
- 585 IGNR 1 6 6 6 tl_compile_db_object
- 590 IGNR 1 0 0 0 run_find_dbout;
- 592 IGNR 1 2 2 2 wt_assert.isnull
- 595 IGNR 1 1 1 1 wt_assert.isnull
- 599 IGNR 1 1 1 1 wt_assert.isnull
- 602 IGNR 1 0 0 0 wt_assert.isnull
- 606 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
- 607 IGNR 1 6 6 6 tl_compile_db_object
- 615 IGNR 1 0 0 0 run_find_dbout;
- 617 IGNR 1 8 3 5 wt_assert.eq
- 621 IGNR 1 1 1 1 wt_assert.eq
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 626 IGNR 1 1 1 1 wt_assert.eq
- 630 IGNR 1 1 1 1 wt_assert.isnull
- 634 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
- 635 IGNR 1 13 2 11 tl_compile_db_object
- 644 IGNR 1 1 1 1 run_find_dbout;
- 646 IGNR 1 8 3 5 wt_assert.eq
- 650 IGNR 1 0 0 0 wt_assert.eq
- 655 IGNR 1 1 1 1 wt_assert.eq
- 659 IGNR 1 1 1 1 wt_assert.isnull
- 663 IGNR 1 1 1 1 wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
- 664 IGNR 1 5 5 5 tl_compile_db_object
- 672 IGNR 1 0 0 0 run_find_dbout;
- 674 IGNR 1 5 5 5 wt_assert.isnull
- 677 IGNR 1 0 0 0 wt_assert.isnull
- 681 IGNR 1 0 0 0 wt_assert.isnull
- 684 IGNR 1 0 0 0 wt_assert.eq
- 689 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
- 690 IGNR 1 7 1 6 tl_compile_db_object
- 698 IGNR 1 0 0 0 run_find_dbout;
- 700 IGNR 1 8 4 4 wt_assert.eq
- 704 IGNR 1 1 1 1 wt_assert.eq
- 708 IGNR 1 0 0 0 wt_assert.eq
- 713 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Sad Path 3';
- 714 IGNR 1 5 5 5 tl_compile_db_object
- 722 IGNR 1 1 1 1 run_find_dbout;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 724 IGNR 1 4 4 4 wt_assert.eq
- 728 IGNR 1 0 0 0 wt_assert.eq
- 733 IGNR 1 0 0 0 wt_assert.eq
- 737 IGNR 1 1 1 1 wt_assert.isnull
- 741 IGNR 1 0 0 0 wt_assert.g_testcase := 'Find DBOUT Teardown';
- 742 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package');
- 743 IGNR 1 4 4 4 end t_find_dbout;
- 748 EXEC 8 40 4 6 procedure load_ignr_aa
- 750 UNKN 0 6 1 1 cursor c_find_begin is
- 751 EXEC 8 24214 111 23121 select line
- 758 IGNR 0 8 1 2 order by line;
- 760 IGNR 0 7 1 1 cursor c_find_end (in_line in number, in_col in number) is
- 761 IGNR 8 909 43 253 with q1 as (
- 778 UNKN 0 5 1 1 ,col;
- 781 EXEC 8 11 1 2 g_ignr_aa.delete;
- 782 EXEC 8 6 1 1 open c_find_begin;
- 783 EXEC 16 0 0 0 loop
- 784 EXEC 16 2786 16 1002 fetch c_find_begin into buff_find_begin;
- 785 EXEC 16 17 0 4 exit when c_find_begin%NOTFOUND;
- 786 EXEC 8 3 0 1 open c_find_end (buff_find_begin.line, buff_find_begin.col);
- 787 EXEC 8 830 76 130 fetch c_find_end into buff_find_end;
- 788 EXEC 8 10 1 2 if c_find_end%NOTFOUND
- 790 EXEC 2 20550 466 20084 select max(line)
- 797 EXEC 8 283 11 105 close c_find_end;
- 798 EXEC 34 45 1 7 for i in buff_find_begin.line + g_rec.trigger_offset ..
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 801 EXEC 26 52 0 8 g_ignr_aa(i) := 'X';
- 804 EXEC 8 129 11 37 close c_find_begin;
- 805 EXEC 8 25 1 8 end load_ignr_aa;
- 809 IGNR 1 8 8 8 procedure t_load_ignr_aa
- 814 IGNR 1 0 0 0 l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
- 816 IGNR 0 7 1 1 procedure run_load_ignr is begin
- 817 IGNR 7 14 2 2 l_recSAVE := g_rec;
- 818 IGNR 7 18 2 3 l_ignrSAVE := g_ignr_aa;
- 819 IGNR 7 8 1 2 g_ignr_aa.delete;
- 820 IGNR 7 3 0 3 g_rec.dbout_owner := USER;
- 821 IGNR 7 3 0 1 g_rec.dbout_name := l_pname;
- 822 IGNR 7 2 1 1 g_rec.dbout_type := 'PACKAGE BODY';
- 823 IGNR 7 1 0 1 g_rec.trigger_offset := 0;
- 824 IGNR 7 4 1 1 load_ignr_aa;
- 825 IGNR 7 43 1 10 l_ignrTEST := g_ignr_aa;
- 826 IGNR 7 19 2 6 g_ignr_aa := l_ignrSAVE;
- 827 IGNR 7 16 1 4 g_rec := l_recSAVE;
- 828 IGNR 7 1 0 1 end run_load_ignr;
- 831 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Setup';
- 832 IGNR 1 5 5 5 wt_assert.isnotnull
- 835 IGNR 1 1 1 1 tl_compile_db_object
- 840 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Happy Path 1';
- 841 IGNR 1 6 6 6 tl_compile_db_object
- 846 IGNR 1 0 0 0 run_load_ignr;
- 847 IGNR 1 7 7 7 wt_assert.eq
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 852 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Happy Path 2';
- 853 IGNR 1 6 6 6 tl_compile_db_object
- 861 IGNR 1 0 0 0 run_load_ignr;
- 863 IGNR 1 11 11 11 wt_assert.eq
- 867 IGNR 4 0 0 0 for i in 3 .. 5
- 869 IGNR 3 10 2 5 wt_assert.eq
- 875 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Happy Path 3';
- 876 IGNR 1 7 7 7 tl_compile_db_object
- 886 IGNR 1 0 0 0 run_load_ignr;
- 888 IGNR 1 5 5 5 wt_assert.eq
- 892 IGNR 4 0 0 0 for i in 4 .. 6
- 894 IGNR 3 10 2 5 wt_assert.eq
- 900 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Happy Path 4';
- 901 IGNR 1 7 7 7 tl_compile_db_object
- 914 IGNR 1 0 0 0 run_load_ignr;
- 916 IGNR 1 14 14 14 wt_assert.eq
- 920 IGNR 4 1 0 1 for i in 4 .. 6
- 922 IGNR 3 38 2 30 wt_assert.eq
- 928 IGNR 3 1 0 1 for i in 8 .. 10
- 930 IGNR 3 9 2 4 wt_assert.eq
- 936 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Sad Path 1';
- 937 IGNR 1 4 4 4 tl_compile_db_object
- 944 IGNR 1 0 0 0 run_load_ignr;
- 945 IGNR 1 5 5 5 wt_assert.eq
- 950 IGNR 1 1 1 1 wt_assert.g_testcase := 'Load Ignr Sad Path 2';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 951 IGNR 1 6 6 6 tl_compile_db_object
- 963 IGNR 1 1 1 1 run_load_ignr;
- 965 IGNR 1 10 10 10 wt_assert.eq
- 969 IGNR 4 2 0 1 for i in 4 .. 6
- 971 IGNR 3 12 2 7 wt_assert.eq
- 977 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Sad Path 3';
- 978 IGNR 1 8 8 8 tl_compile_db_object
- 990 IGNR 1 1 1 1 run_load_ignr;
- 992 IGNR 1 6 6 6 wt_assert.eq
- 996 IGNR 6 1 0 1 for i in 4 .. 8
- 998 IGNR 5 15 2 5 wt_assert.eq
- 1004 IGNR 1 0 0 0 wt_assert.g_testcase := 'Load Ignr Teardown';
- 1005 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package');
- 1006 IGNR 1 5 5 5 wt_assert.isnotnull
- 1009 IGNR 1 122 122 122 end t_load_ignr_aa;
- 1014 EXEC 1 11 1 10 procedure insert_dbout_profile
- 1019 UNKN 0 21 2 6 procedure l_set_status is begin
- 1020 EXEC 8 19 2 4 if g_ignr_aa.EXISTS(prof_rec.line)
- 1023 EXEC 1 1 1 1 prof_rec.status := 'IGNR';
- 1024 EXEC 1 1 1 1 return;
- 1026 EXEC 7 3 0 2 if prof_rec.total_occur > 0
- 1029 EXEC 3 1 0 1 prof_rec.status := 'EXEC';
- 1030 EXEC 3 2 1 1 return;
- 1032 EXEC 4 2 0 1 if prof_rec.total_occur = 0
- 1036 EXEC 4 79 13 31 if regexp_like(prof_rec.text, '^[[:space:]]*' ||
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1041 EXEC 2 1 1 1 prof_rec.status := 'EXCL';
- 1042 EXEC 3 3 2 2 elsif prof_rec.line = l_max_line
- 1048 EXEC 2 0 0 0 prof_rec.status := 'NOTX';
- 1050 EXEC 4 10 2 4 return;
- 1053#NOTX# 0 0 0 0 prof_rec.status := 'UNKN';
- 1054#NOTX# 0 0 0 0 end l_set_status;
- 1055 EXEC 1 20 20 20 begin
- 1057 EXEC 1 257 257 257 select max(ppd.line#) into l_max_line
- 1066 EXEC 1 0 0 0 load_ignr_aa;
- 1067 EXEC 1 1 1 1 prof_rec.test_run_id := g_rec.test_run_id;
- 1068 EXEC 3 768 1 731 for buf1 in (
- 1069#NOTX# 0 0 0 0 select src.line
- 1089 EXEC 8 8 1 3 prof_rec.line := buf1.line;
- 1090 EXEC 8 3 1 1 prof_rec.total_occur := buf1.total_occur;
- 1091 EXEC 8 8 0 2 prof_rec.total_usecs := buf1.total_time/1000;
- 1092 EXEC 8 1 1 1 prof_rec.min_usecs := buf1.min_time/1000;
- 1093 EXEC 8 5 1 1 prof_rec.max_usecs := buf1.max_time/1000;
- 1094 EXEC 8 10 1 2 prof_rec.text := buf1.text;
- 1095 EXEC 8 0 0 0 prof_rec.status := NULL;
- 1096 EXEC 8 2 0 1 l_set_status;
- 1097 EXEC 8 1086 81 408 insert into wt_dbout_profiles values prof_rec;
- 1100 IGNR 8 0 0 0 if not g_skip_add then
- 1102 IGNR 0 0 0 0 wt_test_run_stat.add_profile(prof_rec);
- 1108 EXEC 1 109 109 109 COMMIT;
- 1111 EXEC 1 5 5 5 g_ignr_aa.delete;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1112 EXEC 1 2 2 2 delete_plsql_profiler_recs(g_rec.prof_runid);
- 1113 EXEC 1 6 6 6 end insert_dbout_profile;
- 1117 IGNR 1 9 9 9 procedure t_insert_dbout_profile
- 1123 IGNR 1 0 0 0 c_test_run_id constant number := -97;
- 1124 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
- 1128 IGNR 0 8 1 2 procedure insert_plsql_profiler_data
- 1134 IGNR 8 5 1 1 data_rec.line# := in_line#;
- 1135 IGNR 8 1 0 1 data_rec.total_occur := in_total_occur;
- 1136 IGNR 8 0 0 0 data_rec.total_time := in_total_time;
- 1139 IGNR 8 2464 95 979 insert into plsql_profiler_data values data_rec;
- 1140 IGNR 8 4392 77 2632 commit;
- 1141 IGNR 8 31 2 7 l_sqlerrm := SQLERRM;
- 1142 IGNR 0 0 0 0 exception when others then
- 1143 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 1144 IGNR 0 0 0 0 end;
- 1145 IGNR 8 72 4 16 wt_assert.eq (
- 1149 IGNR 8 6 1 1 end insert_plsql_profiler_data;
- 1151 IGNR 0 14 1 2 procedure test_dbout_profiler
- 1157 IGNR 16 169 3 76 wt_assert.eqqueryvalue
- 1165 IGNR 16 10 0 1 end test_dbout_profiler;
- 1168 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
- 1169 IGNR 1 0 0 0 tl_compile_db_object
- 1174 IGNR 1 8 8 8 tl_compile_db_object
- 1186 IGNR 1 1 1 1 tl_insert_plsql_profiler_recs(c_test_run_id);
- 1187 IGNR 1 1 1 1 tl_count_plsql_profiler_recs(c_test_run_id, 1);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1188 IGNR 1 1 1 1 tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
- 1190 IGNR 1 1 1 1 units_rec.runid := c_test_run_id;
- 1191 IGNR 1 1 1 1 units_rec.unit_number := 1;
- 1192 IGNR 1 2 0 2 units_rec.unit_owner := USER;
- 1193 IGNR 1 0 0 0 units_rec.unit_name := l_pname;
- 1194 IGNR 1 1 1 1 units_rec.unit_type := 'PACKAGE BODY';
- 1195 IGNR 1 0 0 0 units_rec.total_time := 0;
- 1198 IGNR 1 1005 1005 1005 insert into plsql_profiler_units values units_rec;
- 1199 IGNR 1 101 101 101 commit;
- 1200 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack ||
- 1202 IGNR 0 0 0 0 exception when others then
- 1203 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1205 IGNR 0 0 0 0 end;
- 1207 IGNR 1 3 3 3 wt_assert.isnull (
- 1210 IGNR 1 9 9 9 wt_assert.eqqueryvalue
- 1217 IGNR 1 0 0 0 data_rec.runid := c_test_run_id;
- 1218 IGNR 1 0 0 0 data_rec.unit_number := 1;
- 1219 IGNR 1 1 1 1 data_rec.min_time := 0;
- 1220 IGNR 1 0 0 0 data_rec.max_time := 1;
- 1221 IGNR 1 1 1 1 insert_plsql_profiler_data(1, 0, 0);
- 1222 IGNR 1 1 1 1 insert_plsql_profiler_data(2, 0, 1);
- 1223 IGNR 1 0 0 0 insert_plsql_profiler_data(3, 1, 1);
- 1224 IGNR 1 1 1 1 insert_plsql_profiler_data(5, 1, 1);
- 1225 IGNR 1 1 1 1 insert_plsql_profiler_data(7, 1, 1);
- 1226 IGNR 1 0 0 0 insert_plsql_profiler_data(8, 0, 0);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1227 IGNR 1 0 0 0 insert_plsql_profiler_data(9, 1, 1);
- 1228 IGNR 1 1 1 1 insert_plsql_profiler_data(10, 0, 0);
- 1230 IGNR 1 7 7 7 wt_assert.eqqueryvalue
- 1237 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
- 1238 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1239 IGNR 1 1 1 1 g_rec.test_run_id := c_test_run_id;
- 1240 IGNR 1 3 1 2 g_rec.dbout_owner := USER;
- 1241 IGNR 1 1 1 1 g_rec.dbout_name := l_pname;
- 1242 IGNR 1 0 0 0 g_rec.dbout_type := 'PACKAGE BODY';
- 1243 IGNR 1 1 1 1 g_rec.prof_runid := c_test_run_id;
- 1244 IGNR 1 0 0 0 g_rec.trigger_offset := 0;
- 1245 IGNR 1 0 0 0 g_rec.error_message := '';
- 1247 IGNR 1 0 0 0 g_skip_add := TRUE;
- 1249 IGNR 1 1 1 1 insert_dbout_profile;
- 1250 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack ||
- 1252 IGNR 0 0 0 0 exception when others then
- 1253 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1255 IGNR 0 0 0 0 end;
- 1256 IGNR 1 0 0 0 g_skip_add := FALSE;
- 1257 IGNR 1 2 2 2 g_rec := l_recSAVE;
- 1258 IGNR 1 4 4 4 wt_assert.isnull (
- 1262 IGNR 1 0 0 0 test_dbout_profiler(1, 'STATUS', 'EXCL');
- 1263 IGNR 1 8 8 8 test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
- 1264 IGNR 1 1 1 1 test_dbout_profiler(2, 'STATUS', 'UNKN');
- 1265 IGNR 1 3 3 3 test_dbout_profiler(2, 'TEXT', 'begin' || CHR(10));
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1266 IGNR 1 1 1 1 test_dbout_profiler(3, 'STATUS', 'EXEC');
- 1267 IGNR 1 2 2 2 test_dbout_profiler(3, 'TEXT', ' l_junk := 1;' || CHR(10));
- 1268 IGNR 1 1 1 1 test_dbout_profiler(5, 'STATUS', 'IGNR');
- 1269 IGNR 1 2 2 2 test_dbout_profiler(5, 'TEXT', ' l_junk := 2;' || CHR(10));
- 1270 IGNR 1 0 0 0 test_dbout_profiler(7, 'STATUS', 'EXEC');
- 1271 IGNR 1 2 2 2 test_dbout_profiler(7, 'TEXT', ' if 0 = 1 then' || CHR(10));
- 1272 IGNR 1 1 1 1 test_dbout_profiler(8, 'STATUS', 'NOTX');
- 1273 IGNR 1 3 3 3 test_dbout_profiler(8, 'TEXT', ' l_junk := 3;' || CHR(10));
- 1274 IGNR 1 0 0 0 test_dbout_profiler(9, 'STATUS', 'EXEC');
- 1275 IGNR 1 3 3 3 test_dbout_profiler(9, 'TEXT', ' end if;' || CHR(10));
- 1276 IGNR 1 0 0 0 test_dbout_profiler(10, 'STATUS', 'EXCL');
- 1277 IGNR 1 1 1 1 test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;');
- 1279 IGNR 1 0 0 0 wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- 1280 IGNR 1 0 0 0 tl_delete_dbout_profiles(c_test_run_id);
- 1281 IGNR 1 1 1 1 tl_delete_test_runs(c_test_run_id);
- 1282 IGNR 1 1 1 1 tl_delete_plsql_profiler_recs(c_test_run_id);
- 1283 IGNR 1 2 2 2 tl_count_plsql_profiler_recs(c_test_run_id, 0);
- 1284 IGNR 1 0 0 0 tl_drop_db_object(l_pname, 'package');
- 1285 IGNR 1 3 3 3 end t_insert_dbout_profile;
- 1295 EXEC 3 8 2 3 procedure initialize
- 1309 EXEC 3 2 0 1 out_dbout_owner := '';
- 1310 EXEC 3 0 0 0 out_dbout_name := '';
- 1311 EXEC 3 0 0 0 out_dbout_type := '';
- 1312 EXEC 3 0 0 0 out_trigger_offset := NULL;
- 1313 EXEC 3 0 0 0 out_profiler_runid := NULL;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1314 EXEC 3 0 0 0 out_error_message := '';
- 1315 EXEC 3 0 0 0 g_rec := l_rec_NULL;
- 1319 IGNR 3 2 1 1 g_skip_insert := FALSE;
- 1320 IGNR 3 0 0 0 g_skip_add := FALSE;
- 1323 EXEC 3 1 1 1 if in_test_run_id is null
- 1325 EXEC 1 88 88 88 raise_application_error (-20004, 'i_test_run_id is null');
- 1327 EXEC 2 1 0 1 g_rec.test_run_id := in_test_run_id;
- 1329 EXEC 2 1 0 1 find_dbout(in_pkg_name => in_runner_name);
- 1330 EXEC 2 3 1 2 out_dbout_owner := g_rec.dbout_owner;
- 1331 EXEC 2 1 1 1 out_dbout_name := g_rec.dbout_name;
- 1332 EXEC 2 1 1 1 out_dbout_type := g_rec.dbout_type;
- 1333 EXEC 2 0 0 0 out_error_message := g_rec.error_message;
- 1335 EXEC 2 2 2 2 if g_rec.dbout_name is null -- No DBOUT notation
- 1339 EXEC 1 0 0 0 g_rec.prof_runid := NULL;
- 1340 EXEC 1 0 0 0 return;
- 1343 EXEC 1 2 1 1 g_rec.trigger_offset := wt_profiler.trigger_offset
- 1347 EXEC 1 1 1 1 out_trigger_offset := g_rec.trigger_offset;
- 1349 EXEC 1 6 1 5 l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
- 1350 EXEC 1 1 1 1 if l_retnum <> 0 then
- 1353 IGNR 0 0 0 0 raise_application_error(-20005,
- 1359 EXEC 1 295 0 289 l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid);
- 1360 EXEC 2 1 0 1 if l_retnum <> 0 then
- 1362 IGNR 0 0 0 0 raise_application_error(-20006,
- 1367 EXEC 2 4 1 3 out_profiler_runid := g_rec.prof_runid;
- 1369 EXEC 2 8 1 7 end initialize;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1373 IGNR 0 8 8 8 procedure t_initialize
- 1375 IGNR 1 0 0 0 c_test_run_id constant number := -96;
- 1376 IGNR 1 1 1 1 l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE';
- 1383 IGNR 1 1 1 1 wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
- 1384 IGNR 1 1 1 1 tl_compile_db_object
- 1389 IGNR 1 1 1 1 wt_assert.g_testcase := 'Initialize Test HAPPY Path 1';
- 1390 IGNR 1 5 5 5 tl_compile_db_object
- 1397 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1398 IGNR 1 4 1 3 initialize
- 1407 IGNR 1 1 1 1 l_recTEST := g_rec;
- 1408 IGNR 1 0 0 0 g_rec := l_recSAVE;
- 1410 IGNR 1 2 2 2 wt_assert.isnull (
- 1413 IGNR 1 1 1 1 wt_assert.isnull (
- 1417 IGNR 1 1 1 1 wt_assert.isnull (
- 1420 IGNR 1 1 1 1 wt_assert.isnull (
- 1424 IGNR 1 1 1 1 wt_assert.isnull (
- 1427 IGNR 1 1 1 1 wt_assert.isnull (
- 1431 IGNR 1 1 1 1 wt_assert.isnull (
- 1434 IGNR 1 1 1 1 wt_assert.isnull (
- 1438 IGNR 1 1 1 1 wt_assert.isnull (
- 1441 IGNR 1 1 1 1 wt_assert.isnull (
- 1445 IGNR 1 1 1 1 wt_assert.isnull (
- 1448 IGNR 1 1 1 1 wt_assert.isnull (
- 1452 IGNR 1 0 0 0 wt_assert.g_testcase := 'Initialize Test HAPPY Path 2';
- 1453 IGNR 1 4 4 4 tl_compile_db_object
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1462 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1463 IGNR 1 5 2 3 initialize
- 1472 IGNR 1 4 4 4 l_recTEST := g_rec;
- 1473 IGNR 1 1 1 1 g_rec := l_recSAVE;
- 1475 IGNR 1 4 1 3 wt_assert.eq (
- 1479 IGNR 1 1 1 1 wt_assert.eq (
- 1484 IGNR 1 0 0 0 wt_assert.eq (
- 1488 IGNR 1 5 5 5 wt_assert.isnotnull (
- 1492 IGNR 1 4 4 4 wt_assert.eq (
- 1496 IGNR 1 1 1 1 wt_assert.isnull (
- 1500 IGNR 1 2 1 1 wt_assert.eq (
- 1504 IGNR 1 0 0 0 wt_assert.eq (
- 1509 IGNR 1 0 0 0 wt_assert.eq (
- 1513 IGNR 1 4 4 4 wt_assert.isnotnull (
- 1517 IGNR 1 2 2 2 wt_assert.eq (
- 1521 IGNR 1 1 1 1 wt_assert.isnull (
- 1525 IGNR 1 1 1 1 wt_assert.g_testcase := 'Initialize Test Sad Path 1';
- 1526 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1528 IGNR 1 1 1 1 initialize
- 1537 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 1539 IGNR 1 0 0 0 exception when others then
- 1540 IGNR 1 87 87 87 l_sqlerrm := SQLERRM;
- 1541 IGNR 0 3 3 3 end;
- 1542 IGNR 1 1 1 1 l_recTEST := g_rec;
- 1543 IGNR 1 1 1 1 g_rec := l_recSAVE;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1544 IGNR 1 1 1 1 wt_assert.eq (
- 1549 IGNR 1 0 0 0 wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- 1550 IGNR 1 0 0 0 tl_drop_db_object
- 1553 IGNR 1 2 2 2 end t_initialize;
- 1560 EXEC 4 8 1 4 procedure finalize
- 1564 EXEC 4 1 0 1 if g_rec.prof_runid is null
- 1566 EXEC 1 0 0 0 return;
- 1568 EXEC 3 0 0 0 if g_rec.test_run_id is null
- 1570 EXEC 1 43 43 43 raise_application_error (-20000, 'g_rec.test_run_id is null');
- 1574 IGNR 0 0 0 0 if not g_skip_insert
- 1580 IGNR 1 1 1 1 dbms_profiler.STOP_PROFILER;
- 1581 IGNR 0 0 0 0 exception when others then
- 1582 IGNR 0 0 0 0 g_rec := l_rec_NULL;
- 1584 IGNR 0 0 0 0 raise;
- 1586 IGNR 0 0 0 0 insert_dbout_profile;
- 1591 EXEC 1 1 1 1 g_rec := l_rec_NULL;
- 1592 EXEC 1 0 0 0 end finalize;
- 1596 IGNR 1 6 1 5 procedure t_finalize
- 1604 IGNR 1 1 1 1 wt_assert.g_testcase := 'Finalize Happy Path 1';
- 1605 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1606 IGNR 1 1 1 1 g_rec.prof_runid := NULL;
- 1607 IGNR 1 2 2 2 wt_assert.isnull (
- 1612 IGNR 1 1 1 1 finalize;
- 1613 IGNR 1 7 7 7 l_err_stack := dbms_utility.format_error_stack ||
- 1615 IGNR 0 0 0 0 exception when others then
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1616 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1618 IGNR 0 0 0 0 end;
- 1619 IGNR 1 1 1 1 g_rec := l_recSAVE;
- 1620 IGNR 1 1 1 1 wt_assert.isnull (
- 1624 IGNR 1 1 1 1 wt_assert.g_testcase := 'Finalize Happy Path 2';
- 1625 IGNR 1 0 0 0 l_recSAVE := g_rec;
- 1626 IGNR 1 0 0 0 g_rec.test_run_id := -1;
- 1627 IGNR 1 0 0 0 g_rec.dbout_owner := 'TEST OWNER';
- 1628 IGNR 1 0 0 0 g_rec.dbout_name := 'TEST NAME';
- 1629 IGNR 1 1 1 1 g_rec.dbout_type := 'TEST TYPE';
- 1630 IGNR 1 0 0 0 g_rec.prof_runid := -2;
- 1631 IGNR 1 0 0 0 g_rec.trigger_offset := -3;
- 1632 IGNR 1 1 1 1 g_rec.error_message := 'TEST MESSAGE';
- 1634 IGNR 1 1 1 1 g_skip_insert := TRUE;
- 1636 IGNR 1 0 0 0 finalize;
- 1637 IGNR 1 2 2 2 l_err_stack := dbms_utility.format_error_stack ||
- 1639 IGNR 0 0 0 0 exception when others then
- 1640 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1642 IGNR 0 0 0 0 end;
- 1643 IGNR 1 0 0 0 g_skip_insert := FALSE;
- 1645 IGNR 1 0 0 0 l_recTEST := g_rec;
- 1646 IGNR 1 0 0 0 g_rec := l_recSAVE;
- 1647 IGNR 1 0 0 0 wt_assert.isnull (
- 1651 IGNR 1 1 1 1 wt_assert.isnull (
- 1654 IGNR 1 0 0 0 wt_assert.isnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1658 IGNR 1 1 1 1 wt_assert.isnull (
- 1661 IGNR 1 0 0 0 wt_assert.isnull (
- 1665 IGNR 1 1 1 1 wt_assert.isnull (
- 1668 IGNR 1 1 1 1 wt_assert.isnull (
- 1671 IGNR 1 0 0 0 wt_assert.isnull (
- 1675 IGNR 1 0 0 0 wt_assert.g_testcase := 'Finalize Sad Path 1';
- 1676 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 1677 IGNR 1 0 0 0 g_rec.prof_runid := -1;
- 1678 IGNR 1 0 0 0 g_rec.test_run_id := NULL;
- 1680 IGNR 1 1 1 1 finalize;
- 1681 IGNR 1 0 0 0 exception when others then
- 1682 IGNR 1 42 42 42 l_sqlerrm := SQLERRM;
- 1683 IGNR 0 1 1 1 end;
- 1685 IGNR 1 1 1 1 g_rec := l_recSAVE;
- 1686 IGNR 1 2 2 2 wt_assert.eq (
- 1690 IGNR 1 1 1 1 end t_finalize;
- 1696 UNKN 0 37 3 18 function trigger_offset
- 1703 EXEC 4 2 0 1 if dbout_type_in != 'TRIGGER'
- 1705 EXEC 2 0 0 0 return 0;
- 1707 EXEC 4 22048 3 21861 for buff in (
- 1708#NOTX# 0 0 0 0 select line, text from dba_source
- 1714 EXEC 4 163 4 72 if regexp_instr(buff.text,
- 1726 EXEC 1 41 2 39 return buff.line - 1;
- 1729 EXEC 1 0 0 0 return 0;
- 1730 EXEC 4 10 1 7 end trigger_offset;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1734 IGNR 0 2 2 2 procedure t_trigger_offset
- 1738 IGNR 1 1 1 1 wt_assert.g_testcase := 'Trigger Offset Happy Path';
- 1739 IGNR 1 12 11 11 wt_assert.eq (
- 1746 IGNR 1 5 4 4 wt_assert.eq (
- 1753 IGNR 1 0 0 0 wt_assert.g_testcase := 'Trigger Offset Sad Path';
- 1754 IGNR 1 4 4 4 wt_assert.eq (
- 1760 IGNR 1 1 1 1 end t_trigger_offset;
- 1765 UNKN 0 20 2 7 function calc_pct_coverage
- 1770 EXEC 8 4265 2 3991 for buff in (
- 1776 EXEC 4 6 1 3 if buff.hits + buff.misses = 0
- 1778 EXEC 1 26 2 19 return -1;
- 1780 EXEC 3 11 1 8 return round(100 * buff.hits / (buff.hits + buff.misses),2);
- 1783#NOTX# 0 0 0 0 return null;
- 1784 EXEC 4 11 2 5 END calc_pct_coverage;
- 1788 IGNR 0 4 4 4 procedure t_calc_pct_coverage
- 1790 IGNR 1 1 1 1 c_test_run_id constant number := -95;
- 1794 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
- 1795 IGNR 1 0 0 0 tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
- 1796 IGNR 1 1 1 1 l_rec.test_run_id := c_test_run_id;
- 1797 IGNR 1 0 0 0 l_rec.total_occur := 1;
- 1798 IGNR 1 1 1 1 l_rec.total_usecs := 1;
- 1799 IGNR 1 0 0 0 l_rec.min_usecs := 1;
- 1800 IGNR 1 1 1 1 l_rec.max_usecs := 1;
- 1802 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
- 1803 IGNR 1 0 0 0 l_rec.line := 1;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1804 IGNR 1 1 1 1 l_rec.status := 'EXEC';
- 1805 IGNR 1 6 6 6 l_rec.text := 'Testing ' || l_rec.line;
- 1806 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1808 IGNR 1 0 0 0 l_rec.line := 2;
- 1809 IGNR 1 0 0 0 l_rec.status := 'NOTX';
- 1810 IGNR 1 3 3 3 l_rec.text := 'Testing ' || l_rec.line;
- 1811 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1813 IGNR 1 0 0 0 l_rec.line := 3;
- 1814 IGNR 1 1 1 1 l_rec.status := 'EXEC';
- 1815 IGNR 1 3 3 3 l_rec.text := 'Testing ' || l_rec.line;
- 1816 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1817 IGNR 1 10 10 10 wt_assert.eq (
- 1821 IGNR 1 0 0 0 tl_delete_dbout_profiles(c_test_run_id);
- 1823 IGNR 1 3 3 3 wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
- 1824 IGNR 1 1 1 1 l_rec.line := 1;
- 1825 IGNR 1 1 1 1 l_rec.status := 'EXCL';
- 1826 IGNR 1 12 12 12 l_rec.text := 'Testing ' || l_rec.line;
- 1827 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1829 IGNR 1 1 1 1 l_rec.line := 2;
- 1830 IGNR 1 0 0 0 l_rec.status := 'UNKN';
- 1831 IGNR 1 2 2 2 l_rec.text := 'Testing ' || l_rec.line;
- 1832 IGNR 1 0 0 0 tl_insert_dbout_profiles(l_rec);
- 1834 IGNR 1 1 1 1 l_rec.line := 3;
- 1835 IGNR 1 0 0 0 l_rec.status := 'EXCL';
- 1836 IGNR 1 2 2 2 l_rec.text := 'Testing ' || l_rec.line;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1837 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1838 IGNR 1 6 1 5 wt_assert.eq (
- 1842 IGNR 1 1 1 1 tl_delete_dbout_profiles(c_test_run_id);
- 1844 IGNR 1 1 1 1 wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
- 1845 IGNR 1 2 1 1 wt_assert.isnull (
- 1848 IGNR 1 2 2 2 wt_assert.isnull (
- 1852 IGNR 1 0 0 0 wt_assert.g_testcase := 'Calculate Percent Coverage Teardown';
- 1853 IGNR 1 0 0 0 tl_delete_test_runs(c_test_run_id);
- 1854 IGNR 1 3 3 3 end t_calc_pct_coverage;
- 1859 EXEC 3 5 0 1 procedure delete_records
- 1864 EXEC 3 360 62 161 select profiler_runid into l_profiler_runid
- 1866 EXEC 1 0 0 0 delete_plsql_profiler_recs(l_profiler_runid);
- 1867 EXEC 1 283 283 283 delete from wt_dbout_profiles
- 1870 EXEC 2 0 0 0 when NO_DATA_FOUND
- 1872 EXEC 2 1 0 1 return;
- 1873 EXEC 3 3 1 1 end delete_records;
- 1877 IGNR 0 6 6 6 procedure t_delete_records
- 1879 IGNR 1 0 0 0 c_test_run_id constant number := -98;
- 1884 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Setup';
- 1885 IGNR 1 7 7 7 wt_assert.eqqueryvalue (
- 1890 IGNR 1 12 12 12 wt_assert.eqqueryvalue (
- 1895 IGNR 1 1 1 1 tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
- 1897 IGNR 1 1 1 1 l_rec.test_run_id := c_test_run_id;
- 1898 IGNR 1 0 0 0 l_rec.line := 1;
- 1899 IGNR 1 0 0 0 l_rec.status := 'EXEC';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1900 IGNR 1 0 0 0 l_rec.total_occur := 1;
- 1901 IGNR 1 0 0 0 l_rec.total_usecs := 1;
- 1902 IGNR 1 0 0 0 l_rec.min_usecs := 1;
- 1903 IGNR 1 0 0 0 l_rec.max_usecs := 1;
- 1904 IGNR 1 2 2 2 l_rec.text := 'Testing';
- 1905 IGNR 1 1 1 1 tl_insert_dbout_profiles(l_rec);
- 1907 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Happy Path 1';
- 1908 IGNR 0 0 0 0 begin
- 1909 IGNR 1 0 0 0 delete_records(c_test_run_id);
- 1910 IGNR 1 6 6 6 l_err_stack := dbms_utility.format_error_stack ||
- 1912 IGNR 0 0 0 0 exception when others then
- 1913 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1915 IGNR 0 0 0 0 end;
- 1917 IGNR 1 1 1 1 wt_assert.isnull (
- 1920 IGNR 1 6 6 6 wt_assert.eqqueryvalue (
- 1926 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Sad Path 1';
- 1928 IGNR 1 0 0 0 delete_records(-9876);
- 1929 IGNR 1 2 2 2 l_err_stack := dbms_utility.format_error_stack ||
- 1931 IGNR 0 0 0 0 exception when others then
- 1932 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1934 IGNR 0 0 0 0 end;
- 1936 IGNR 1 1 1 1 wt_assert.isnull (
- 1939 IGNR 1 3 3 3 wt_assert.eqqueryvalue (
- 1945 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Sad Path 2';
- 1947 IGNR 1 1 1 1 delete_records(NULL);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1948 IGNR 1 3 3 3 l_err_stack := dbms_utility.format_error_stack ||
- 1950 IGNR 0 0 0 0 exception when others then
- 1951 IGNR 0 0 0 0 l_err_stack := dbms_utility.format_error_stack ||
- 1953 IGNR 0 0 0 0 end;
- 1955 IGNR 1 1 1 1 wt_assert.isnull (
- 1958 IGNR 1 3 3 3 wt_assert.eqqueryvalue (
- 1964 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Teardown';
- 1965 IGNR 1 0 0 0 tl_delete_test_runs(c_test_run_id);
- 1966 IGNR 1 3 3 3 end t_delete_records;
- 1973 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %--
- 1976 IGNR 1 1 1 1 t_get_error_msg;
- 1977 IGNR 1 1 1 1 t_delete_profiler_recs;
- 1978 IGNR 1 0 0 0 t_find_dbout;
- 1979 IGNR 1 0 0 0 t_load_ignr_aa;
- 1980 IGNR 1 1 1 1 t_insert_dbout_profile;
- 1981 IGNR 1 1 1 1 t_initialize;
- 1982 IGNR 1 1 1 1 t_finalize;
- 1983 IGNR 1 1 1 1 t_trigger_offset;
- 1984 IGNR 1 1 1 1 t_calc_pct_coverage;
- 1985 IGNR 1 1 1 1 t_delete_records;
- 1986 IGNR 1 2 2 2 end WTPLSQL_RUN;
- 1991 EXCL 0 0 0 0 end wt_profiler;
-
-
- wtPLSQL 1.1.0 - Run ID 8: 29-Jun-2018 03:22:02 PM
-
- Test Results for WTP.WT_RESULT
- Total Test Cases: 7 Total Assertions: 35
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 3 Error Assertions: 0
- Maximum Interval msec: 87 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for PACKAGE BODY WTP.WT_RESULT
- Ignored Lines: 144 Total Profiled Lines: 185
- Excluded Lines: 2 Total Executed Lines: 36
- Minimum LineExec usec: 0 Not Executed Lines: 1
- Average LineExec usec: 21 Unknown Lines: 2
- Maximum LineExec usec: 287 Code Coverage: 97.30%
- Trigger Source Offset: 0
-
- - WTP.WT_RESULT Test Result Details (Test Run ID 8)
------------------------------------------------------------
- ---- Test Case: Initialize Happy Path
- PASS 87ms l_results_recTEST.test_run_id. EQ - Expected "-99" and got "-99"
- PASS 0ms l_results_recTEST.result_seq. EQ - Expected "0" and got "0"
- PASS 0ms l_results_recTEST.executed_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:22:02.761000"
- PASS 0ms l_results_recTEST.interval_msecs. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_recTEST.assertion. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_recTEST.status. ISNULL - Expected NULL and got ""
- PASS 1ms l_results_recTEST.details. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_recTEST.testcase. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_recTEST.message. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_ntTEST.COUNT. EQ - Expected "1" and got "1"
- PASS 0ms l_results_ntTEST(1).test_run_id. ISNULL - Expected NULL and got ""
- PASS 3ms Raises ORA-20009. RAISES/THROWS - Expected exception "%ORA-20009: "in_test_run_id" cannot be NULL%". Actual exception raised was "ORA-20009: "in_test_run_id" cannot be NULL". Exception raised by: "begin wt_result.initialize(NULL); end;".
- ---- Test Case: Finalize Happy Path
- PASS 8ms Before NULL Test Record Count. EQ - Expected "0" and got "0"
- PASS 1ms After NULL Test Record Count. EQ - Expected "0" and got "0"
- PASS 0ms l_results_recTEST.test_run_id. ISNULL - Expected NULL and got ""
- PASS 0ms l_results_ntTEST.COUNT. EQ - Expected "1" and got "1"
- PASS 0ms Record Count Test. EQ - Expected "1" and got "1"
- ---- Test Case: Ad Hoc Save Happy Path Setup
- PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0"
- ---- Test Case: Ad Hoc Save Testing Happy Path
- PASS 0ms DBMS_OUTPUT Status. EQ - Expected "0" and got "0"
- PASS 0ms DBMS_OUTPUT Line. ISNOTNULL - Expected NOT NULL and got " ---- Test Case: Ad Hoc Save Testing Happy Path\n PASS t_save_testing Message. SELFTEST1 - t_save_testing Details"
- PASS 0ms Save Testing NULL Test DBMS_OUTPUT 3 Message. THIS - Expected "TRUE" and got "TRUE"
- ---- Test Case: Ad Hoc Save Happy Path Teardown
- PASS 0ms l_dbmsout_buff.COUNT - 1. ISNOTNULL - Expected NOT NULL and got "0"
- ---- Test Case: Save Testing Happy Path
- PASS 1ms t_save_testing Testing Message. SELFTEST2 - t_save_testing Testing Details
- PASS 0ms g_results_nt.COUNT. EQ - Expected "24" and got "24"
- PASS 0ms g_results_nt(23).assetion. EQ - Expected "SELFTEST2" and got "SELFTEST2"
- PASS 0ms g_results_nt(23).status. EQ - Expected "PASS" and got "PASS"
- PASS 0ms g_results_nt(23).details. EQ - Expected "t_save_testing Testing Details" and got "t_save_testing Testing Details"
- PASS 0ms g_results_nt(23).testcase. EQ - Expected "Save Testing Happy Path" and got "Save Testing Happy Path"
- PASS 0ms g_results_nt(23).message. EQ - Expected "t_save_testing Testing Message" and got "t_save_testing Testing Message"
- PASS 0ms g_results_nt(23).interval_msecs. ISNOTNULL - Expected NOT NULL and got "1"
- PASS 0ms g_results_nt(23).executed_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-2018 15:22:02.777000"
- PASS 0ms g_results_nt(23).result_seq. ISNOTNULL - Expected NOT NULL and got "23"
- ---- Test Case: Delete Records Happy Path
- PASS 1ms Before Insert Count. ISNOTNULL - Expected NOT NULL and got "0"
- PASS 5ms After Insert Count. EQQUERYVALUE - Expected "1" and got "1" for Query: select count(*) from wt_results where test_run_id = -99
- PASS 1ms After Test Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_results where test_run_id = -99
- PASS 0ms After ROLLBACK Count. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from wt_results where test_run_id = -99
-
- - WTP.WT_RESULT PACKAGE BODY Code Coverage Details (Test Run ID 8)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 EXCL 0 0 0 0 package body wt_result
- 9 IGNR 0 0 0 0 g_skip_add BOOLEAN := FALSE;
- 22 EXEC 2 28 10 19 procedure initialize
- 27 EXEC 2 1 1 1 if in_test_run_id is NULL
- 29 EXEC 1 89 89 89 raise_application_error(-20009, '"in_test_run_id" cannot be NULL');
- 31 EXEC 1 0 0 0 g_results_rec := l_results_recNULL;
- 32 EXEC 1 1 1 1 g_results_rec.test_run_id := in_test_run_id;
- 33 EXEC 1 0 0 0 g_results_rec.result_seq := 0;
- 34 EXEC 1 7 3 4 g_results_rec.executed_dtm := systimestamp;
- 35 EXEC 1 2 2 2 g_results_nt := results_nt_type(null);
- 37 IGNR 1 0 0 0 g_skip_add := FALSE;
- 39 EXEC 1 2 2 2 end initialize;
- 43 IGNR 1 16 16 16 procedure t_initialize
- 52 IGNR 1 10 10 10 l_results_ntSAVE := g_results_nt;
- 53 IGNR 1 1 1 1 l_results_recSAVE := g_results_rec;
- 54 IGNR 1 0 0 0 g_results_rec := l_results_recNULL;
- 55 IGNR 1 1 1 1 initialize(-99);
- 56 IGNR 1 0 0 0 l_results_recTEST := g_results_rec;
- 57 IGNR 1 0 0 0 g_results_rec := l_results_recSAVE;
- 58 IGNR 1 2 2 2 l_results_ntTEST := g_results_nt;
- 59 IGNR 1 1 1 1 g_results_nt := l_results_ntSAVE;
- 61 IGNR 2 7 1 6 wt_assert.g_testcase := 'Initialize Happy Path';
- 62 IGNR 1 9 9 9 wt_assert.eq (
- 67 IGNR 1 5 5 5 wt_assert.eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 71 IGNR 1 18 18 18 wt_assert.isnotnull (
- 75 IGNR 1 2 2 2 wt_assert.isnull (
- 78 IGNR 1 1 1 1 wt_assert.isnull (
- 82 IGNR 1 0 0 0 wt_assert.isnull (
- 85 IGNR 1 3 3 3 wt_assert.isnull (
- 89 IGNR 1 1 1 1 wt_assert.isnull (
- 92 IGNR 1 0 0 0 wt_assert.isnull (
- 95 IGNR 1 5 5 5 wt_assert.eq (
- 100 IGNR 1 2 2 2 wt_assert.isnull (
- 103 IGNR 1 0 0 0 wt_assert.raises (
- 107 IGNR 1 4 4 4 end t_initialize;
- 114 EXEC 2 35 12 24 procedure finalize
- 118 EXEC 2 21 8 13 begin
- 119 EXEC 2 1 0 1 if g_results_rec.test_run_id IS NULL
- 121 EXEC 1 10 10 10 return;
- 124 EXEC 1 185 185 185 forall i in 1 .. g_results_nt.COUNT - 1
- 125#NOTX# 0 0 0 0 insert into wt_results values g_results_nt(i);
- 126 EXEC 1 78 78 78 COMMIT;
- 127 EXEC 1 8 8 8 g_results_nt := results_nt_type(null);
- 128 EXEC 1 0 0 0 g_results_rec := l_results_recNULL;
- 129 EXEC 1 0 0 0 g_results_nt := results_nt_type(null);
- 130 EXEC 1 12 12 12 end finalize;
- 134 IGNR 1 13 13 13 procedure t_finalize
- 148 IGNR 1 1 1 1 wt_assert.g_testcase := ' ';
- 149 IGNR 1 17 17 17 l_results_ntSAVE := g_results_nt; -- Capture Original Values
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 150 IGNR 1 1 1 1 l_results_recSAVE := g_results_rec; -- Capture Original Values
- 153 IGNR 1 0 0 0 g_results_rec := l_results_recNULL;
- 154 IGNR 1 0 0 0 g_results_rec.test_run_id := -99;
- 155 IGNR 1 0 0 0 g_results_rec.result_seq := 1;
- 156 IGNR 1 2 1 1 g_results_rec.executed_dtm := systimestamp;
- 157 IGNR 1 0 0 0 g_results_rec.interval_msecs := 99;
- 159 IGNR 1 1 1 1 g_results_rec.assertion := 'FINALTEST';
- 160 IGNR 1 1 1 1 g_results_rec.status := wt_assert.C_PASS;
- 161 IGNR 1 0 0 0 g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test';
- 162 IGNR 1 9 9 9 g_results_nt := results_nt_type(null);
- 163 IGNR 1 1 1 1 g_results_nt(1) := g_results_rec;
- 164 IGNR 1 1 1 1 g_results_nt.extend; -- Finalize expects that last element to be NULL
- 167 IGNR 1 1 1 1 g_results_rec.test_run_id := NULL;
- 168 IGNR 1 3158 3158 3158 select count(*)
- 172 IGNR 1 1 1 1 finalize;
- 174 IGNR 1 188 188 188 select count(*)
- 178 IGNR 1 45 45 45 rollback; -- UNDO all database changes
- 179 IGNR 1 1 1 1 g_results_rec.test_run_id := -99;
- 182 IGNR 1 0 0 0 l_test_runs_rec.id := -99;
- 183 IGNR 1 6 2 4 l_test_runs_rec.start_dtm := systimestamp;
- 184 IGNR 1 2 2 2 l_test_runs_rec.runner_name := 'Finalize Test';
- 185 IGNR 1 0 0 0 l_test_runs_rec.runner_owner := 'BOGUS';
- 186 IGNR 1 302 302 302 insert into wt_test_runs values l_test_runs_rec;
- 187 IGNR 1 124 124 124 commit; -- Must commit because finalize is AUTONOMOUS TRANSACTION
- 189 IGNR 1 1 1 1 finalize; -- g_results_nt is still loaded with one element
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 190 IGNR 1 4 4 4 l_results_ntTEST := g_results_nt;
- 191 IGNR 1 0 0 0 l_results_recTEST := g_results_rec;
- 192 IGNR 1 238 238 238 select count(*)
- 196 IGNR 1 2420 2420 2420 delete from wt_results where test_run_id = -99;
- 197 IGNR 1 1216 1216 1216 delete from wt_test_runs where id = -99;
- 198 IGNR 1 131 131 131 commit; -- UNDO all database changes
- 200 IGNR 1 2 2 2 wt_assert.g_testcase := 'Finalize Happy Path';
- 202 IGNR 1 5 5 5 g_results_rec := l_results_recSAVE;
- 203 IGNR 1 21 21 21 g_results_nt := l_results_ntSAVE;
- 205 IGNR 1 11 11 11 wt_assert.eq (
- 209 IGNR 1 4 4 4 wt_assert.eq (
- 214 IGNR 1 2 2 2 wt_assert.isnull (
- 217 IGNR 1 3 3 3 wt_assert.eq (
- 221 IGNR 1 2 2 2 wt_assert.eq (
- 225 IGNR 1 6 6 6 end t_finalize;
- 230 UNKN 0 218 2 57 procedure save
- 239 EXEC 37 9 0 2 if g_results_rec.test_run_id IS NULL
- 241 EXEC 1 14 14 14 wt_text_report.ad_hoc_result
- 247 EXEC 1 2 2 2 return;
- 250 EXEC 36 61 1 4 l_current_tstamp := systimestamp;
- 251 EXEC 36 313 5 28 g_results_rec.interval_msecs := extract(day from (
- 254 EXEC 36 7 1 1 g_results_rec.executed_dtm := l_current_tstamp;
- 256 EXEC 36 13 0 1 g_results_rec.assertion := in_assertion;
- 257 EXEC 36 11 1 1 g_results_rec.status := in_status;
- 258 EXEC 36 45 1 3 g_results_rec.details := substr(in_details,1,4000);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 259 EXEC 36 15 1 1 g_results_rec.testcase := substr(in_testcase,1,50);
- 260 EXEC 36 12 1 1 g_results_rec.message := substr(in_message,1,200);
- 262 EXEC 36 20 0 1 g_results_rec.result_seq := g_results_rec.result_seq + 1;
- 263 EXEC 36 83 1 8 g_results_nt(g_results_nt.COUNT) := g_results_rec;
- 264 EXEC 36 79 1 6 g_results_nt.extend;
- 267 IGNR 36 3 0 1 if not g_skip_add then
- 269 IGNR 35 34 1 3 wt_test_run_stat.add_result(g_results_rec);
- 274 EXEC 35 62 1 10 end save;
- 278 IGNR 0 10 10 10 procedure t_save_testing
- 282 IGNR 1 4 4 4 l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1);
- 289 IGNR 1 1 1 1 wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup';
- 291 IGNR 1 0 0 0 loop
- 292 IGNR 1 41 41 41 DBMS_OUTPUT.GET_LINE (
- 295 IGNR 1 1 1 1 exit when l_dbmsout_stat != 0;
- 296 IGNR 0 0 0 0 l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
- 297 IGNR 0 0 0 0 l_dbmsout_buff.extend;
- 299 IGNR 1 3 3 3 wt_assert.isnotnull (
- 303 IGNR 1 0 0 0 wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path';
- 304 IGNR 1 1 1 1 l_test_run_id := g_results_rec.test_run_id;
- 305 IGNR 1 0 0 0 g_results_rec.test_run_id := NULL;
- 306 IGNR 1 0 0 0 g_skip_add := TRUE;
- 307 IGNR 1 1 1 1 wt_result.save (
- 313 IGNR 1 1 1 1 g_skip_add := FALSE;
- 314 IGNR 1 1 1 1 g_results_rec.test_run_id := l_test_run_id;
- 316 IGNR 1 1 0 1 DBMS_OUTPUT.GET_LINE (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 319 IGNR 1 2 2 2 wt_assert.eq (
- 324 IGNR 1 1 0 1 if wt_assert.last_pass
- 326 IGNR 1 1 1 1 wt_assert.isnotnull (
- 329 IGNR 1 7 7 7 wt_assert.this (
- 334 IGNR 1 0 0 0 if not wt_assert.last_pass
- 337 IGNR 0 0 0 0 DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
- 338 IGNR 0 0 0 0 end if;
- 341 IGNR 1 0 0 0 wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown';
- 343 IGNR 1 0 0 0 for i in 1 .. l_dbmsout_buff.COUNT - 1
- 345 IGNR 0 0 0 0 DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
- 347 IGNR 1 1 1 1 wt_assert.isnotnull (
- 351 IGNR 1 0 0 0 wt_assert.g_testcase := 'Save Testing Happy Path';
- 352 IGNR 1 1 1 1 l_nt_count := g_results_nt.COUNT;
- 353 IGNR 1 0 0 0 g_skip_add := TRUE;
- 354 IGNR 1 0 0 0 wt_result.save (
- 360 IGNR 1 1 1 1 g_skip_add := FALSE;
- 362 IGNR 1 3 3 3 wt_assert.eq (
- 366 IGNR 1 0 0 0 if not wt_assert.last_pass
- 368 IGNR 0 0 0 0 return; -- Something went wrong, end this now.
- 371 IGNR 1 3 3 3 wt_assert.eq (
- 375 IGNR 1 2 2 2 wt_assert.eq (
- 380 IGNR 1 2 2 2 wt_assert.eq (
- 384 IGNR 1 2 2 2 wt_assert.eq (
- 389 IGNR 1 2 2 2 wt_assert.eq (
- 393 IGNR 1 2 2 2 wt_assert.isnotnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 397 IGNR 1 15 15 15 wt_assert.isnotnull (
- 400 IGNR 1 2 2 2 wt_assert.isnotnull (
- 406 IGNR 1 1 1 1 end t_save_testing;
- 411 UNKN 0 1 1 1 procedure delete_records
- 415 EXEC 1 287 287 287 delete from wt_results
- 417 EXEC 1 2 2 2 end delete_records;
- 421 IGNR 1 5 0 5 procedure t_delete_records
- 429 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Happy Path';
- 430 IGNR 1 232 232 232 select count(*) into l_num_recs
- 433 IGNR 1 3 3 3 wt_assert.isnotnull (
- 437 IGNR 1 1 1 1 l_test_runs_rec.id := -99;
- 438 IGNR 1 1 0 1 l_test_runs_rec.start_dtm := sysdate;
- 439 IGNR 1 0 0 0 l_test_runs_rec.runner_name := 'Delete Records Test';
- 440 IGNR 1 0 0 0 l_test_runs_rec.runner_owner := 'BOGUS';
- 441 IGNR 1 318 318 318 insert into wt_test_runs values l_test_runs_rec;
- 442 IGNR 1 0 0 0 l_results_rec.test_run_id := -99;
- 444 IGNR 1 0 0 0 l_results_rec.result_seq := 1;
- 445 IGNR 1 3 1 2 l_results_rec.executed_dtm := sysdate;
- 446 IGNR 1 0 0 0 l_results_rec.interval_msecs := 99;
- 447 IGNR 1 1 1 1 l_results_rec.assertion := 'DELRECTEST';
- 448 IGNR 1 1 1 1 l_results_rec.status := wt_assert.C_PASS;
- 449 IGNR 1 3 3 3 l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test';
- 450 IGNR 1 1265 1265 1265 insert into wt_results values l_results_rec;
- 452 IGNR 1 9 9 9 wt_assert.eqqueryvalue (
- 457 IGNR 1 1 1 1 delete_records(-99);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 459 IGNR 1 7 7 7 wt_assert.eqqueryvalue (
- 464 IGNR 1 291 291 291 rollback;
- 465 IGNR 1 4 4 4 wt_assert.eqqueryvalue (
- 470 IGNR 1 2 2 2 end t_delete_records;
- 477 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %--
- 481 IGNR 1 1 1 1 t_initialize;
- 482 IGNR 1 1 1 1 t_finalize;
- 483 IGNR 1 0 0 0 t_save_testing;
- 484 IGNR 1 0 0 0 t_delete_records;
- 485 IGNR 1 1 1 1 end WTPLSQL_RUN;
- 490 EXCL 0 0 0 0 end wt_result;
-
-
- wtPLSQL 1.1.0 - Run ID 9: 29-Jun-2018 03:22:02 PM
-
- Test Results for WTP.WT_TEST_RUN_STAT
- Total Test Cases: 12 Total Assertions: 108
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 1 Error Assertions: 0
- Maximum Interval msec: 94 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- Code Coverage for PACKAGE BODY WTP.WT_TEST_RUN_STAT
- Ignored Lines: 302 Total Profiled Lines: 402
- Excluded Lines: 2 Total Executed Lines: 94
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 39 Unknown Lines: 4
- Maximum LineExec usec: 1966 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP.WT_TEST_RUN_STAT Test Result Details (Test Run ID 9)
------------------------------------------------------------
- ---- Test Case: Initialize Happy Path 1 Setup
- PASS 94ms l_tc_aaTEST('TESTCASE1').test_run_id. EQ - Expected "-2" and got "-2"
- PASS 0ms l_recTEST.test_run_id. EQ - Expected "-1" and got "-1"
- ---- Test Case: Initialize Happy Path 1
- PASS 0ms l_tc_aaTEST.COUNT. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got ""
- ---- Test Case: Add Result Testing
- PASS 0ms Add Result Sad Path 1. EQ - Expected "ORA-20010: Unknown Result status "ABC"" and got "ORA-20010: Unknown Result status "ABC""
- PASS 0ms l_recTEST.test_run_id. EQ - Expected "-10" and got "-10"
- PASS 0ms l_recTEST.asserts. EQ - Expected "3" and got "3"
- PASS 1ms l_recTEST.passes. EQ - Expected "1" and got "1"
- PASS 0ms l_recTEST.failures. EQ - Expected "1" and got "1"
- PASS 0ms l_recTEST.errors. EQ - Expected "1" and got "1"
- PASS 0ms l_recTEST.min_interval_msecs. EQ - Expected "10" and got "10"
- PASS 0ms l_recTEST.max_interval_msecs. EQ - Expected "30" and got "30"
- PASS 0ms l_recTEST.tot_interval_msecs. EQ - Expected "60" and got "60"
- PASS 0ms l_tc_aaTEST('TESTCASE1').test_run_id. EQ - Expected "-10" and got "-10"
- PASS 0ms l_tc_aaTEST('TESTCASE1').asserts. EQ - Expected "3" and got "3"
- PASS 0ms l_tc_aaTEST('TESTCASE1').passes. EQ - Expected "1" and got "1"
- PASS 0ms l_tc_aaTEST('TESTCASE1').failures. EQ - Expected "1" and got "1"
- PASS 0ms l_tc_aaTEST('TESTCASE1').errors. EQ - Expected "1" and got "1"
- PASS 0ms l_tc_aaTEST('TESTCASE1').min_interval_msecs. EQ - Expected "10" and got "10"
- PASS 0ms l_tc_aaTEST('TESTCASE1').max_interval_msecs. EQ - Expected "30" and got "30"
- PASS 0ms l_tc_aaTEST('TESTCASE1').tot_interval_msecs. EQ - Expected "60" and got "60"
- ---- Test Case: Add Profile Testing
- PASS 2ms l_recTEST.test_run_id. EQ - Expected "-20" and got "-20"
- PASS 0ms l_recTEST.profiled_lines. EQ - Expected "15" and got "15"
- PASS 1ms l_recTEST.min_executed_usecs. EQ - Expected "10" and got "10"
- PASS 0ms l_recTEST.max_executed_usecs. EQ - Expected "20" and got "20"
- PASS 0ms l_recTEST.tot_executed_usecs. EQ - Expected "150" and got "150"
- PASS 0ms l_recTEST.executed_lines. EQ - Expected "5" and got "5"
- PASS 0ms l_recTEST.ignored_lines. EQ - Expected "4" and got "4"
- PASS 1ms l_recTEST.notexec_lines. EQ - Expected "3" and got "3"
- PASS 0ms l_recTEST.excluded_lines. EQ - Expected "2" and got "2"
- PASS 0ms l_recTEST.unknown_lines. EQ - Expected "1" and got "1"
- PASS 0ms Add Result Sad Path 1. EQ - Expected "ORA-20011: Unknown Profile status "ABC"" and got "ORA-20011: Unknown Profile status "ABC""
- ---- Test Case: FINALIZE Happy Path Setup
- PASS 3ms Insert WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUNS (id, start_dtm, runner_owner, runner_name) values (-102, sysdate, USER, 'TESTRUNNER3')".
- ---- Test Case: FINALIZE Happy Path 1
- PASS 1ms Run Finalize for Happy Path 1. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 3ms Retieve WT_TEST_RUN_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms l_recTEST.test_run_id. EQ - Expected "-102" and got "-102"
- PASS 0ms l_recTEST.test_yield. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.asserts. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.passes. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.failures. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.errors. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.testcases. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.min_interval_msecs. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.avg_interval_msecs. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.max_interval_msecs. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.tot_interval_msecs. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.code_coverage. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.profiled_lines. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.executed_lines. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.ignored_lines. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.excluded_lines. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.notexec_lines. ISNULL - Expected NULL and got ""
- PASS 1ms l_recTEST.unknown_lines. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.avg_executed_usecs. ISNULL - Expected NULL and got ""
- PASS 2ms There should be no WT_TESTCASE_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TESTCASE_STATS where test_run_id = -102
- PASS 2ms Delete WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUN_STATS where test_run_id = -102".
- PASS 2ms There should be no WT_TEST_RUN_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUN_STATS where test_run_id = -102
- ---- Test Case: FINALIZE Happy Path 2
- PASS 3ms Run Finalize for Happy Path 2. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 2ms Retieve WT_TESTCASE_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms l_tstat_rec.test_run_id. EQ - Expected "-102" and got "-102"
- PASS 1ms l_tstat_rec.testcase. EQ - Expected "TC2a" and got "TC2a"
- PASS 0ms l_tstat_rec.asserts. EQ - Expected "3" and got "3"
- PASS 0ms l_tstat_rec.passes. EQ - Expected "2" and got "2"
- PASS 0ms l_tstat_rec.failures. EQ - Expected "1" and got "1"
- PASS 0ms l_tstat_rec.errors. EQ - Expected "0" and got "0"
- PASS 0ms l_tstat_rec.test_yield. EQ - Expected ".667" and got ".667"
- PASS 0ms l_tstat_rec.avg_interval_msecs. EQ - Expected "100" and got "100"
- PASS 1ms Retieve WT_TESTCASE_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms l_tstat_rec.test_run_id. EQ - Expected "-102" and got "-102"
- PASS 0ms l_tstat_rec.testcase. EQ - Expected "TC2b" and got "TC2b"
- PASS 0ms l_tstat_rec.asserts. EQ - Expected "3" and got "3"
- PASS 1ms l_tstat_rec.passes. EQ - Expected "2" and got "2"
- PASS 0ms l_tstat_rec.failures. EQ - Expected "1" and got "1"
- PASS 0ms l_tstat_rec.errors. EQ - Expected "0" and got "0"
- PASS 0ms l_tstat_rec.test_yield. EQ - Expected ".667" and got ".667"
- PASS 0ms l_tstat_rec.avg_interval_msecs. EQ - Expected "100" and got "100"
- PASS 0ms Retieve WT_TEST_RUN_STATS record. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms l_recTEST.test_run_id. EQ - Expected "-102" and got "-102"
- PASS 0ms l_recTEST.test_yield. EQ - Expected ".667" and got ".667"
- PASS 0ms l_recTEST.asserts. EQ - Expected "6" and got "6"
- PASS 0ms l_recTEST.passes. EQ - Expected "4" and got "4"
- PASS 0ms l_recTEST.failures. EQ - Expected "2" and got "2"
- PASS 0ms l_recTEST.errors. EQ - Expected "0" and got "0"
- PASS 1ms l_recTEST.testcases. EQ - Expected "2" and got "2"
- PASS 0ms l_recTEST.avg_interval_msecs. EQ - Expected "100" and got "100"
- PASS 0ms l_recTEST.code_coverage. EQ - Expected ".8" and got ".8"
- PASS 0ms l_recTEST.profiled_lines. EQ - Expected "20" and got "20"
- PASS 0ms l_recTEST.executed_lines. EQ - Expected "8" and got "8"
- PASS 0ms l_recTEST.ignored_lines. EQ - Expected "6" and got "6"
- PASS 0ms l_recTEST.excluded_lines. EQ - Expected "4" and got "4"
- PASS 0ms l_recTEST.notexec_lines. EQ - Expected "2" and got "2"
- PASS 0ms l_recTEST.unknown_lines. EQ - Expected "0" and got "0"
- PASS 0ms l_recTEST.avg_executed_usecs. EQ - Expected "200" and got "200"
- PASS 2ms Delete WT_TESTCASE_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TESTCASE_STATS where test_run_id = -102".
- PASS 1ms There should be no WT_TESTCASE_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TESTCASE_STATS where test_run_id = -102
- PASS 0ms Delete WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUN_STATS where test_run_id = -102".
- PASS 1ms There should be no WT_TEST_RUN_STATS records. EQQUERYVALUE - Expected "0" and got "0" for Query: select count(*) from WT_TEST_RUN_STATS where test_run_id = -102
- ---- Test Case: FINALIZE Sad Path 1
- PASS 0ms Run Finalize for Sad Path 1. EQ - Expected "ORA-0000: normal, successful completion" and got "ORA-0000: normal, successful completion"
- PASS 0ms l_recTEST.test_run_id. ISNULL - Expected NULL and got ""
- PASS 0ms l_recTEST.asserts. ISNULL - Expected NULL and got ""
- ---- Test Case: FINALIZE Happy Path Teardown
- PASS 1ms Delete WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUNS where id = -102".
- ---- Test Case: Delete Records Happy Path Setup
- PASS 2ms Insert WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUNS (id, start_dtm, runner_owner, runner_name) values (-100, sysdate, USER, 'TESTRUNNER2')".
- PASS 3ms Insert WT_TEST_RUN_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TEST_RUN_STATS (test_run_id) values (-100)".
- PASS 4ms Insert WT_TESTCASE_STATS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into WT_TESTCASE_STATS (test_run_id, testcase) values (-100, 'TESTCASE2')".
- ---- Test Case: Delete Records Happy Path and Teardown
- PASS 3ms Delete Records with NULL ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(-100); end;".
- PASS 3ms Delete WT_TEST_RUNS Record. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "delete from WT_TEST_RUNS where id = -100".
- ---- Test Case: Delete Records Test Sad Paths
- PASS 1ms Delete Records with NULL ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(null); end;".
- PASS 2ms Delete Records with Invalid ID. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "begin wt_test_run_stat.delete_records(-0.01); end;".
-
- - WTP.WT_TEST_RUN_STAT PACKAGE BODY Code Coverage Details (Test Run ID 9)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 EXCL 0 0 0 0 package body wt_test_run_stat
- 22 EXEC 4 25 2 15 procedure initialize
- 26 EXEC 4 4 0 3 g_rec := l_recNULL;
- 27 EXEC 4 12 0 9 g_tc_aa.delete;
- 28 EXEC 4 5 0 4 end initialize;
- 32 IGNR 2 25 25 25 procedure t_initialize
- 40 IGNR 2 10 2 8 wt_assert.g_testcase := 'Initialize Happy Path 1 Setup';
- 41 IGNR 1 9 9 9 l_tc_aaTEST('TESTCASE1').test_run_id := -2;
- 42 IGNR 1 0 0 0 l_recTEST.test_run_id := -1;
- 43 IGNR 1 9 9 9 wt_assert.eq (
- 47 IGNR 1 8 8 8 wt_assert.eq (
- 52 IGNR 1 9 9 9 l_tc_aaSAVE := g_tc_aa;
- 53 IGNR 1 1 1 1 l_recSAVE := g_rec;
- 54 IGNR 1 5 5 5 g_tc_aa := l_tc_aaTEST;
- 55 IGNR 1 1 1 1 g_rec := l_recTEST;
- 56 IGNR 1 0 0 0 initialize;
- 57 IGNR 1 0 0 0 l_tc_aaTEST := g_tc_aa;
- 58 IGNR 1 0 0 0 l_recTEST := g_rec;
- 59 IGNR 1 1 1 1 g_tc_aa := l_tc_aaSAVE;
- 60 IGNR 1 0 0 0 g_rec := l_recSAVE;
- 62 IGNR 1 0 0 0 wt_assert.g_testcase := 'Initialize Happy Path 1';
- 63 IGNR 1 3 3 3 wt_assert.eq (
- 67 IGNR 1 1 1 1 wt_assert.isnull (
- 70 IGNR 1 3 3 3 end t_initialize;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 75 UNKN 0 135 1 7 procedure add_result
- 82 EXEC 112 72 1 53 case in_results_rec.status
- 83 EXEC 112 45 0 2 when 'PASS' then
- 84 EXEC 109 69 1 3 g_rec.passes := nvl(g_rec.passes,0) + 1;
- 85 EXEC 3 1 0 1 when 'FAIL' then
- 86 EXEC 1 0 0 0 g_rec.failures := nvl(g_rec.failures,0) + 1;
- 87 EXEC 2 1 0 1 when 'ERR' then
- 88 EXEC 1 0 0 0 g_rec.errors := nvl(g_rec.errors,0) + 1;
- 90 EXEC 1 105 105 105 raise_application_error(-20010, 'Unknown Result status "' ||
- 93 EXEC 111 35 0 1 g_rec.test_run_id := in_results_rec.test_run_id;
- 94 EXEC 111 30 0 1 g_rec.asserts := nvl(g_rec.asserts,0) + 1;
- 95 EXEC 111 68 1 2 g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999)
- 97 EXEC 111 30 0 1 g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0)
- 99 EXEC 111 38 0 1 g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) +
- 101 EXEC 111 71 1 44 if in_results_rec.testcase is not null
- 103 EXEC 111 19 0 1 tc := in_results_rec.testcase;
- 104 EXEC 111 311 1 66 g_tc_aa(tc).testcase := tc;
- 105 EXEC 111 19 0 2 g_tc_aa(tc).test_run_id := in_results_rec.test_run_id;
- 106 EXEC 111 49 0 1 g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1;
- 107 EXEC 111 0 0 0 case in_results_rec.status
- 108 EXEC 111 15 0 1 when 'PASS' then
- 109 EXEC 109 214 0 174 g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1;
- 110 EXEC 2 0 0 0 when 'FAIL' then
- 111 EXEC 1 0 0 0 g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1;
- 112 EXEC 1 0 0 0 when 'ERR' then
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 113 EXEC 1 0 0 0 g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1;
- 116 EXEC 111 46 1 4 g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999)
- 118 EXEC 111 32 0 1 g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0)
- 120 EXEC 111 29 0 1 g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) +
- 123 EXEC 111 32 1 1 end add_result;
- 127 IGNR 1 14 14 14 procedure t_add_result
- 145 IGNR 1 2 2 2 l_tc_aaSAVE := g_tc_aa;
- 146 IGNR 1 0 0 0 l_recSAVE := g_rec;
- 147 IGNR 1 1 1 1 g_tc_aa := l_tc_aaTEST;
- 148 IGNR 1 1 1 1 g_rec := l_recTEST;
- 149 IGNR 1 0 0 0 l_resultTEST.test_run_id := -10;
- 150 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 10;
- 151 IGNR 1 1 1 1 l_resultTEST.status := 'PASS';
- 152 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1';
- 153 IGNR 1 0 0 0 add_result(l_resultTEST);
- 155 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 20;
- 156 IGNR 1 0 0 0 l_resultTEST.status := 'FAIL';
- 157 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1';
- 158 IGNR 1 0 0 0 add_result(l_resultTEST);
- 159 IGNR 1 1 1 1 l_resultTEST.interval_msecs := 30;
- 160 IGNR 1 0 0 0 l_resultTEST.status := 'ERR';
- 161 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1';
- 162 IGNR 1 0 0 0 add_result(l_resultTEST);
- 164 IGNR 1 0 0 0 l_resultTEST.interval_msecs := 40;
- 165 IGNR 1 1 1 1 l_resultTEST.status := 'ABC';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 166 IGNR 1 0 0 0 l_resultTEST.testcase := 'TESTCASE1';
- 168 IGNR 1 0 0 0 add_result(l_resultTEST);
- 169 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 170 IGNR 1 0 0 0 exception when others then
- 171 IGNR 1 123 123 123 l_sqlerrm := SQLERRM;
- 172 IGNR 0 3 3 3 end;
- 174 IGNR 1 6 6 6 l_tc_aaTEST := g_tc_aa;
- 175 IGNR 1 1 1 1 l_recTEST := g_rec;
- 176 IGNR 1 3 3 3 g_tc_aa := l_tc_aaSAVE;
- 177 IGNR 1 1 1 1 g_rec := l_recSAVE;
- 178 IGNR 1 0 0 0 wt_assert.g_testcase := 'Add Result Testing';
- 179 IGNR 1 2 2 2 wt_assert.eq (
- 184 IGNR 1 5 5 5 wt_assert.eq (
- 188 IGNR 1 2 2 2 wt_assert.eq (
- 193 IGNR 1 2 2 2 wt_assert.eq (
- 197 IGNR 1 2 2 2 wt_assert.eq (
- 202 IGNR 1 2 2 2 wt_assert.eq (
- 206 IGNR 1 3 3 3 wt_assert.eq (
- 211 IGNR 1 2 2 2 wt_assert.eq (
- 215 IGNR 1 2 2 2 wt_assert.eq (
- 220 IGNR 1 4 4 4 wt_assert.eq (
- 224 IGNR 1 3 3 3 wt_assert.eq (
- 229 IGNR 1 2 2 2 wt_assert.eq (
- 233 IGNR 1 2 2 2 wt_assert.eq (
- 238 IGNR 1 1 1 1 wt_assert.eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 242 IGNR 1 2 2 2 wt_assert.eq (
- 247 IGNR 1 2 2 2 wt_assert.eq (
- 251 IGNR 1 2 2 2 wt_assert.eq (
- 255 IGNR 1 4 4 4 end t_add_result;
- 260 UNKN 0 5 0 1 procedure add_profile
- 266 EXEC 16 2 0 1 case in_dbout_profiles_rec.status
- 267 EXEC 16 6 0 1 when 'EXEC' then
- 268 EXEC 5 0 0 0 g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
- 270 EXEC 5 3 1 1 g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999)
- 272 EXEC 5 1 0 1 g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0)
- 274 EXEC 5 3 0 1 g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) +
- 277 EXEC 11 0 0 0 when 'IGNR' then
- 278 EXEC 4 4 1 1 g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
- 279 EXEC 7 2 1 1 when 'EXCL' then
- 280 EXEC 2 1 1 1 g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
- 281 EXEC 5 0 0 0 when 'NOTX' then
- 282 EXEC 3 1 0 1 g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
- 283 EXEC 2 0 0 0 when 'UNKN' then
- 284 EXEC 1 1 1 1 g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
- 286 EXEC 1 1527 1527 1527 raise_application_error(-20011, 'Unknown Profile status "' ||
- 289 EXEC 15 3 0 1 g_rec.test_run_id := in_dbout_profiles_rec.test_run_id;
- 290 EXEC 15 1 0 1 g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
- 291 EXEC 15 1 0 1 end add_profile;
- 295 IGNR 1 60 60 60 procedure t_add_profile
- 311 IGNR 1 1 1 1 l_recSAVE := g_rec;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 312 IGNR 1 1 1 1 g_rec := l_recTEST;
- 313 IGNR 1 1 1 1 l_profileTEST.test_run_id := -20;
- 314 IGNR 1 1 1 1 l_profileTEST.min_usecs := 10;
- 315 IGNR 1 0 0 0 l_profileTEST.max_usecs := 20;
- 316 IGNR 1 1 1 1 l_profileTEST.total_usecs := 30;
- 317 IGNR 1 0 0 0 l_profileTEST.total_occur := 1;
- 318 IGNR 1 1 1 1 l_profileTEST.status := 'EXEC';
- 319 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 320 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC';
- 321 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 323 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC';
- 324 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 325 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC';
- 326 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 327 IGNR 1 0 0 0 l_profileTEST.status := 'EXEC';
- 328 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 329 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR';
- 330 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 331 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR';
- 332 IGNR 1 1 1 1 add_profile(l_profileTEST);
- 334 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR';
- 335 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 336 IGNR 1 0 0 0 l_profileTEST.status := 'IGNR';
- 337 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 338 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX';
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 339 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 340 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX';
- 341 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 342 IGNR 1 0 0 0 l_profileTEST.status := 'NOTX';
- 343 IGNR 1 1 1 1 add_profile(l_profileTEST);
- 345 IGNR 1 0 0 0 l_profileTEST.status := 'EXCL';
- 346 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 347 IGNR 1 0 0 0 l_profileTEST.status := 'EXCL';
- 348 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 349 IGNR 1 0 0 0 l_profileTEST.status := 'UNKN';
- 350 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 352 IGNR 1 0 0 0 l_profileTEST.status := 'ABC';
- 354 IGNR 1 0 0 0 add_profile(l_profileTEST);
- 355 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 356 IGNR 1 0 0 0 exception when others then
- 357 IGNR 1 131 131 131 l_sqlerrm := SQLERRM;
- 358 IGNR 0 3 3 3 end;
- 359 IGNR 1 5 5 5 l_recTEST := g_rec;
- 360 IGNR 1 2 2 2 g_rec := l_recSAVE;
- 362 IGNR 1 1 1 1 wt_assert.g_testcase := 'Add Profile Testing';
- 363 IGNR 1 17 17 17 wt_assert.eq (
- 367 IGNR 1 5 5 5 wt_assert.eq (
- 372 IGNR 1 295 295 295 wt_assert.eq (
- 376 IGNR 1 3 3 3 wt_assert.eq (
- 381 IGNR 1 2 2 2 wt_assert.eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 385 IGNR 1 2 2 2 wt_assert.eq (
- 390 IGNR 1 2 2 2 wt_assert.eq (
- 394 IGNR 1 4 4 4 wt_assert.eq (
- 399 IGNR 1 6 6 6 wt_assert.eq (
- 403 IGNR 1 4 4 4 wt_assert.eq (
- 408 IGNR 1 0 0 0 wt_assert.eq (
- 412 IGNR 1 3 3 3 end t_add_profile;
- 417 UNKN 0 10 3 4 procedure finalize
- 422 EXEC 3 48 15 17 begin
- 423 EXEC 3 3 1 1 if g_rec.test_run_id is null
- 425 EXEC 1 0 0 0 initialize;
- 426 EXEC 1 6 6 6 return;
- 428 EXEC 2 2 1 1 g_rec.testcases := g_tc_aa.COUNT;
- 429 EXEC 2 0 0 0 g_rec.asserts := nvl(g_rec.asserts ,0);
- 430 EXEC 2 1 0 1 g_rec.passes := nvl(g_rec.passes ,0);
- 431 EXEC 2 0 0 0 g_rec.failures := nvl(g_rec.failures,0);
- 432 EXEC 2 0 0 0 g_rec.errors := nvl(g_rec.errors ,0);
- 433 EXEC 2 1 0 1 if g_rec.asserts != 0
- 435 EXEC 1 3 3 3 g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3);
- 436 EXEC 1 1 1 1 g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3);
- 438 EXEC 2 1 0 1 if g_rec.profiled_lines is not null
- 440 EXEC 1 1 1 1 g_rec.executed_lines := nvl(g_rec.executed_lines ,0);
- 441 EXEC 1 0 0 0 g_rec.ignored_lines := nvl(g_rec.ignored_lines,0);
- 442 EXEC 1 0 0 0 g_rec.excluded_lines := nvl(g_rec.excluded_lines ,0);
- 443 EXEC 1 0 0 0 g_rec.notexec_lines := nvl(g_rec.notexec_lines ,0);
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 444 EXEC 1 1 1 1 g_rec.unknown_lines := nvl(g_rec.unknown_lines ,0);
- 445 EXEC 1 0 0 0 l_executable_lines := g_rec.executed_lines + g_rec.notexec_lines;
- 446 EXEC 1 0 0 0 if l_executable_lines != 0
- 448 EXEC 1 1 1 1 g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3);
- 449 EXEC 1 1 1 1 g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3);
- 450 EXEC 1 0 0 0 end if;
- 452 EXEC 2 421 171 250 insert into wt_test_run_stats values g_rec;
- 453 EXEC 2 2 1 1 if g_rec.testcases > 0
- 455 EXEC 1 4 4 4 tc := g_tc_aa.FIRST;
- 456 EXEC 2 0 0 0 loop
- 457 EXEC 2 3 1 2 g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0);
- 458 EXEC 2 0 0 0 g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0);
- 459 EXEC 2 0 0 0 g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0);
- 460 EXEC 2 0 0 0 g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0);
- 461 EXEC 2 0 0 0 if g_rec.asserts != 0
- 463 EXEC 2 4 2 2 g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes /
- 465 EXEC 2 2 1 1 g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs /
- 468 EXEC 2 439 79 360 insert into wt_testcase_stats values g_tc_aa(tc);
- 469 EXEC 2 6 2 4 exit when tc = g_tc_aa.LAST;
- 470 EXEC 1 2 2 2 tc := g_tc_aa.NEXT(tc);
- 473 EXEC 2 2303 337 1966 COMMIT;
- 474 EXEC 2 2 1 1 initialize;
- 475 EXEC 2 34 11 23 end finalize;
- 479 IGNR 1 23 23 23 procedure t_finalize
- 487 IGNR 1 0 0 0 l_test_run_id number := -102;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 488 IGNR 1 1 1 1 l_tc varchar2(50) := 'TC2';
- 492 IGNR 0 4 1 2 procedure run_finalize (in_msg_txt in varchar2) is begin
- 493 IGNR 3 47 14 18 l_tc_aaSAVE := g_tc_aa;
- 494 IGNR 3 4 1 2 l_recSAVE := g_rec;
- 495 IGNR 3 14 4 5 g_tc_aa := l_tc_aaTEST;
- 496 IGNR 3 3 1 1 g_rec := l_recTEST;
- 498 IGNR 3 2 1 1 finalize;
- 499 IGNR 3 10 2 5 l_sqlerrm := SQLERRM;
- 500 IGNR 0 0 0 0 exception when others then
- 501 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 502 IGNR 0 0 0 0 end;
- 504 IGNR 3 7 1 5 l_tc_aaTEST := g_tc_aa;
- 505 IGNR 3 3 1 2 l_recTEST := g_rec;
- 506 IGNR 3 22 5 12 g_tc_aa := l_tc_aaSAVE;
- 507 IGNR 3 1 0 1 g_rec := l_recSAVE;
- 508 IGNR 3 8 1 5 wt_assert.eq (
- 512 IGNR 3 0 0 0 end run_finalize;
- 515 IGNR 1 2 2 2 wt_assert.g_testcase := 'FINALIZE Happy Path Setup';
- 516 IGNR 1 3 3 3 l_sql_txt := 'insert into WT_TEST_RUNS' ||
- 519 IGNR 1 1 1 1 wt_assert.raises (
- 523 IGNR 1 167 167 167 commit;
- 525 IGNR 1 1 1 1 wt_assert.g_testcase := 'FINALIZE Happy Path 1';
- 526 IGNR 1 3 3 3 l_tc_aaTEST.delete;
- 527 IGNR 1 2 2 2 l_recTEST := l_recNULL;
- 528 IGNR 1 1 1 1 l_recTEST.test_run_id := l_test_run_id;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 529 IGNR 1 1 1 1 run_finalize('Run Finalize for Happy Path 1'); -- AUTONOMOUS COMMIT
- 532 IGNR 1 2866 2866 2866 select * into l_recTEST
- 535 IGNR 1 6 6 6 l_sqlerrm := SQLERRM;
- 536 IGNR 0 0 0 0 exception when others then
- 537 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 538 IGNR 0 0 0 0 end;
- 540 IGNR 1 3 3 3 wt_assert.eq (
- 544 IGNR 1 5 5 5 wt_assert.eq (
- 549 IGNR 1 1 1 1 wt_assert.isnull (
- 552 IGNR 1 3 3 3 wt_assert.eq (
- 557 IGNR 1 2 2 2 wt_assert.eq (
- 561 IGNR 1 1 1 1 wt_assert.eq (
- 566 IGNR 1 2 2 2 wt_assert.eq (
- 570 IGNR 1 1 1 1 wt_assert.eq (
- 575 IGNR 1 0 0 0 wt_assert.isnull (
- 578 IGNR 1 1 1 1 wt_assert.isnull (
- 581 IGNR 1 1 1 1 wt_assert.isnull (
- 585 IGNR 1 1 1 1 wt_assert.isnull (
- 588 IGNR 1 1 1 1 wt_assert.isnull (
- 591 IGNR 1 0 0 0 wt_assert.isnull (
- 595 IGNR 1 1 1 1 wt_assert.isnull (
- 598 IGNR 1 1 1 1 wt_assert.isnull (
- 601 IGNR 1 0 0 0 wt_assert.isnull (
- 605 IGNR 1 1 1 1 wt_assert.isnull (
- 608 IGNR 1 0 0 0 wt_assert.isnull (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 611 IGNR 1 1 1 1 wt_assert.isnull (
- 615 IGNR 1 4 4 4 wt_assert.eqqueryvalue (
- 621 IGNR 1 6 6 6 wt_assert.raises (
- 626 IGNR 1 144 144 144 commit;
- 627 IGNR 1 9 9 9 wt_assert.eqqueryvalue (
- 633 IGNR 1 0 0 0 wt_assert.g_testcase := 'FINALIZE Happy Path 2';
- 634 IGNR 1 2 2 2 l_tc_aaTEST.delete;
- 635 IGNR 1 6 6 6 l_tc_aaTEST(l_tc||'a').test_run_id := l_test_run_id;
- 636 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').testcase := l_tc||'a';
- 637 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').asserts := 3;
- 638 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').passes := 2;
- 639 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').failures := 1;
- 641 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300;
- 643 IGNR 1 2 2 2 l_tc_aaTEST(l_tc||'b').test_run_id := l_test_run_id;
- 644 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').testcase := l_tc||'b';
- 645 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').asserts := 3;
- 646 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').passes := 2;
- 647 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').failures := 1;
- 649 IGNR 1 1 1 1 l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300;
- 651 IGNR 1 1 1 1 l_recTEST := l_recNULL;
- 652 IGNR 1 0 0 0 l_recTEST.test_run_id := l_test_run_id;
- 653 IGNR 1 1 1 1 l_recTEST.asserts := 6;
- 654 IGNR 1 0 0 0 l_recTEST.passes := 4;
- 655 IGNR 1 1 1 1 l_recTEST.failures := 2;
- 657 IGNR 1 0 0 0 l_recTEST.tot_interval_msecs := 600;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 659 IGNR 1 0 0 0 l_recTEST.profiled_lines := 20;
- 660 IGNR 1 0 0 0 l_recTEST.executed_lines := 8;
- 661 IGNR 1 0 0 0 l_recTEST.ignored_lines := 6;
- 662 IGNR 1 0 0 0 l_recTEST.excluded_lines := 4;
- 663 IGNR 1 0 0 0 l_recTEST.notexec_lines := 2;
- 665 IGNR 1 0 0 0 l_recTEST.tot_executed_usecs := 2000;
- 666 IGNR 1 0 0 0 run_finalize('Run Finalize for Happy Path 2'); -- AUTONOMOUS COMMIT
- 668 IGNR 0 0 0 0 begin
- 669 IGNR 1 2288 2288 2288 select * into l_tstat_rec
- 673 IGNR 1 4 4 4 l_sqlerrm := SQLERRM;
- 674 IGNR 0 0 0 0 exception when others then
- 675 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 676 IGNR 0 0 0 0 end;
- 678 IGNR 1 3 3 3 wt_assert.eq (
- 682 IGNR 1 5 5 5 wt_assert.eq (
- 687 IGNR 1 2 2 2 wt_assert.eq (
- 691 IGNR 1 4 4 4 wt_assert.eq (
- 696 IGNR 1 2 2 2 wt_assert.eq (
- 700 IGNR 1 2 2 2 wt_assert.eq (
- 705 IGNR 1 2 2 2 wt_assert.eq (
- 709 IGNR 1 3 3 3 wt_assert.eq (
- 713 IGNR 1 3 3 3 wt_assert.eq (
- 719 IGNR 1 1319 1319 1319 select * into l_tstat_rec
- 723 IGNR 1 2 2 2 l_sqlerrm := SQLERRM;
- 724 IGNR 0 0 0 0 exception when others then
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 725 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 726 IGNR 0 0 0 0 end;
- 728 IGNR 1 2 2 2 wt_assert.eq (
- 732 IGNR 1 3 3 3 wt_assert.eq (
- 737 IGNR 1 1 1 1 wt_assert.eq (
- 741 IGNR 1 3 3 3 wt_assert.eq (
- 746 IGNR 1 3 3 3 wt_assert.eq (
- 750 IGNR 1 1 1 1 wt_assert.eq (
- 755 IGNR 1 2 2 2 wt_assert.eq (
- 759 IGNR 1 1 1 1 wt_assert.eq (
- 763 IGNR 1 2 2 2 wt_assert.eq (
- 769 IGNR 1 207 207 207 select * into l_recTEST
- 772 IGNR 1 2 2 2 l_sqlerrm := SQLERRM;
- 773 IGNR 0 0 0 0 exception when others then
- 774 IGNR 0 0 0 0 l_sqlerrm := SQLERRM;
- 775 IGNR 0 0 0 0 end;
- 777 IGNR 1 1 1 1 wt_assert.eq (
- 781 IGNR 1 2 2 2 wt_assert.eq (
- 786 IGNR 1 3 3 3 wt_assert.eq (
- 790 IGNR 1 2 2 2 wt_assert.eq (
- 795 IGNR 1 3 3 3 wt_assert.eq (
- 799 IGNR 1 1 1 1 wt_assert.eq (
- 804 IGNR 1 1 1 1 wt_assert.eq (
- 808 IGNR 1 1 1 1 wt_assert.eq (
- 813 IGNR 1 2 2 2 wt_assert.eq (
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 817 IGNR 1 3 3 3 wt_assert.eq (
- 822 IGNR 1 2 2 2 wt_assert.eq (
- 826 IGNR 1 2 2 2 wt_assert.eq (
- 831 IGNR 1 2 2 2 wt_assert.eq (
- 835 IGNR 1 1 1 1 wt_assert.eq (
- 840 IGNR 1 2 2 2 wt_assert.eq (
- 844 IGNR 1 3 3 3 wt_assert.eq (
- 848 IGNR 1 3 3 3 wt_assert.eq (
- 853 IGNR 1 3 3 3 wt_assert.raises (
- 858 IGNR 1 147 147 147 commit;
- 859 IGNR 1 10 10 10 wt_assert.eqqueryvalue (
- 865 IGNR 1 3 3 3 wt_assert.raises (
- 870 IGNR 1 86 86 86 commit;
- 871 IGNR 1 5 5 5 wt_assert.eqqueryvalue (
- 877 IGNR 1 1 1 1 wt_assert.g_testcase := 'FINALIZE Sad Path 1';
- 878 IGNR 1 2 2 2 l_tc_aaTEST.delete;
- 879 IGNR 1 1 1 1 l_recTEST := l_recNULL;
- 880 IGNR 1 0 0 0 l_recTEST.asserts := 2;
- 881 IGNR 1 1 1 1 run_finalize('Run Finalize for Sad Path 1'); -- AUTONOMOUS COMMIT
- 882 IGNR 1 1 1 1 wt_assert.isnull (
- 885 IGNR 1 0 0 0 wt_assert.isnull (
- 889 IGNR 1 0 0 0 wt_assert.g_testcase := 'FINALIZE Happy Path Teardown';
- 890 IGNR 1 3 3 3 wt_assert.raises (
- 895 IGNR 1 128 128 128 commit;
- 896 IGNR 1 7 7 7 end t_finalize;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 901 UNKN 0 8 2 4 procedure delete_records
- 905 EXEC 3 672 81 489 delete from wt_testcase_stats
- 907 EXEC 3 263 40 167 delete from wt_test_run_stats
- 909 EXEC 3 6 1 3 end delete_records;
- 913 IGNR 0 3 3 3 procedure t_delete_records
- 915 IGNR 1 0 0 0 l_test_run_id number := -100;
- 919 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Happy Path Setup';
- 920 IGNR 1 5 5 5 l_sql_txt := 'insert into WT_TEST_RUNS' ||
- 923 IGNR 1 2 2 2 wt_assert.raises (
- 928 IGNR 1 4 4 4 l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' ||
- 930 IGNR 1 0 0 0 wt_assert.raises (
- 934 IGNR 1 5 5 5 l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' ||
- 936 IGNR 1 1 1 1 wt_assert.raises (
- 941 IGNR 1 0 0 0 wt_assert.g_testcase := 'Delete Records Happy Path and Teardown';
- 942 IGNR 1 9 9 9 wt_assert.raises (
- 947 IGNR 1 8 8 8 wt_assert.raises (
- 952 IGNR 1 1 1 1 wt_assert.g_testcase := 'Delete Records Test Sad Paths';
- 953 IGNR 1 1 1 1 wt_assert.raises (
- 957 IGNR 1 2 2 2 wt_assert.raises (
- 961 IGNR 1 0 0 0 end t_delete_records;
- 968 IGNR 0 1 1 1 procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %--
- 971 IGNR 1 1 1 1 t_initialize;
- 972 IGNR 1 1 1 1 t_add_result;
- 973 IGNR 1 0 0 0 t_add_profile;
- 974 IGNR 1 1 1 1 t_finalize;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 975 IGNR 1 0 0 0 t_delete_records;
- 976 IGNR 1 1 1 1 end WTPLSQL_RUN;
- 981 EXCL 0 0 0 0 end wt_test_run_stat;
-
-
-
-PL/SQL procedure successfully completed.
-
diff --git a/src/core/uninstall.sql b/src/core/uninstall.sql
deleted file mode 100644
index 95f0697..0000000
--- a/src/core/uninstall.sql
+++ /dev/null
@@ -1,46 +0,0 @@
-
---
--- Core Un-Install
---
--- Run as System
---
-
-spool uninstall
-set showmode off
-set serveroutput on size unlimited format truncated
-
-@common_setup.sql
-
-drop user &schema_owner. cascade;
-
--- Public Synonyms
-declare
- sql_txt varchar2(4000);
-begin
- for buff in (select synonym_name from dba_synonyms
- where owner = 'PUBLIC'
- and regexp_like(table_owner, '&schema_owner.', 'i') )
- loop
- sql_txt := 'drop public synonym ' || buff.synonym_name;
- dbms_output.put_line(sql_txt);
- execute immediate sql_txt;
- end loop;
-end;
-/
-
-declare
- parm_value v$parameter.value%TYPE;
-begin
- select value into parm_value
- from v$parameter
- where name in 'plsql_ccflags';
- if instr(parm_value, 'WTPLSQL_ENABLE:') <> 0
- then
- DBMS_OUTPUT.PUT_LINE('Remove "WTPLSQL_ENABLE" from PLSQL_CCFLAGS');
- DBMS_OUTPUT.PUT_LINE(' *) "' || parm_value || '"');
- end if;
-end;
-/
-
-set showmode on
-spool off
diff --git a/src/core/uninstallO.LST b/src/core/uninstallO.LST
deleted file mode 100644
index 9e45782..0000000
--- a/src/core/uninstallO.LST
+++ /dev/null
@@ -1,55 +0,0 @@
-old: showmode BOTH
-old:drop user &schema_owner. cascade
-new:drop user wtp cascade
-
-User WTP dropped.
-
-old:declare
- sql_txt varchar2(4000);
-begin
- for buff in (select synonym_name from dba_synonyms
- where owner = 'PUBLIC'
- and regexp_like(table_owner, '&schema_owner.', 'i') )
- loop
- sql_txt := 'drop public synonym ' || buff.synonym_name;
- dbms_output.put_line(sql_txt);
- execute immediate sql_txt;
- end loop;
-end;
-
-new:declare
- sql_txt varchar2(4000);
-begin
- for buff in (select synonym_name from dba_synonyms
- where owner = 'PUBLIC'
- and regexp_like(table_owner, 'wtp', 'i') )
- loop
- sql_txt := 'drop public synonym ' || buff.synonym_name;
- dbms_output.put_line(sql_txt);
- execute immediate sql_txt;
- end loop;
-end;
-drop public synonym WT_WTPLSQL
-drop public synonym WT_VERSION
-drop public synonym WT_TEXT_REPORT
-drop public synonym WT_TEST_RUN_STATS
-drop public synonym WT_TEST_RUNS_SEQ
-drop public synonym WT_TEST_RUNS
-drop public synonym WT_TESTCASE_STATS
-drop public synonym WT_SELF_TEST
-drop public synonym WT_RESULTS
-drop public synonym WT_DBOUT_PROFILES
-drop public synonym WT_ASSERT
-drop public synonym WTPLSQL
-drop public synonym UTASSERT
-
-
-PL/SQL procedure successfully completed.
-
-Remove "WTPLSQL_ENABLE" from PLSQL_CCFLAGS
- *) "WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE"
-
-
-PL/SQL procedure successfully completed.
-
-new: showmode BOTH
diff --git a/src/core/upgrades/V1.0.0_to_Current/README.txt b/src/core/upgrades/V1.0.0_to_Current/README.txt
deleted file mode 100644
index a319016..0000000
--- a/src/core/upgrades/V1.0.0_to_Current/README.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-
- White Box PL/SQL Testing
- src/core/upgrades/V1.0.0_to_Current/README.txt
-
-FILE DESCRIPTION
----------------------- -----------------------
-update_all_stats.sql Populate the new STATS tables
-upgrade.sql Main upgrade script
-upgradeO.LST Example of successful results from Demo Installation
-
-
-Install Procedure:
-------------------
-1) sqlplus SYS/password as SYSDBA @upgrade
-2) exit
-3) Compare upgrade.LST to upgradeO.LST
diff --git a/src/core/wt_dbout_profiles.tab b/src/core/wt_dbout_profiles.tab
deleted file mode 100644
index 494857d..0000000
--- a/src/core/wt_dbout_profiles.tab
+++ /dev/null
@@ -1,32 +0,0 @@
-
---
--- DBOUT Profiles Table Installation
---
-
-create table wt_dbout_profiles
- (test_run_id number(38) constraint wt_dbout_profiles_nn1 not null
- ,line number(6) constraint wt_dbout_profiles_nn2 not null
- ,status varchar2(4) constraint wt_dbout_profiles_nn3 not null
- ,total_occur number(9) constraint wt_dbout_profiles_nn4 not null
- ,total_usecs number constraint wt_dbout_profiles_nn5 not null
- ,min_usecs number constraint wt_dbout_profiles_nn6 not null
- ,max_usecs number constraint wt_dbout_profiles_nn7 not null
- ,text varchar2(4000) constraint wt_dbout_profiles_nn8 not null
- ,constraint wt_dbout_profiles_pk primary key (test_run_id, line)
- ,constraint wt_dbout_profiles_fk1 foreign key (test_run_id)
- references wt_test_runs (id)
- ,constraint wt_dbout_profiles_ck1 check (status in ('EXEC','NOTX','EXCL','IGNR','UNKN'))
- ) pctfree 0;
-
-comment on table wt_dbout_profiles is 'PL/SQL Profiler data for Database Object Under Test (DBOUT).';
-comment on column wt_dbout_profiles.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.';
-comment on column wt_dbout_profiles.line is 'Source code line number, Primary Key part 2.';
-comment on column wt_dbout_profiles.status is 'Executed/NotExecuted/Excluded/Ignored/Unknown Status from the Profiler';
-comment on column wt_dbout_profiles.total_occur is 'Number of times this line was executed.';
-comment on column wt_dbout_profiles.total_usecs is 'Total time in microseconds spent executing this line.';
-comment on column wt_dbout_profiles.min_usecs is 'Minimum execution time in microseconds for this line.';
-comment on column wt_dbout_profiles.max_usecs is 'Maximum execution time in microseconds for this line.';
-comment on column wt_dbout_profiles.text is 'Source code text for this line number.';
-
-grant select on wt_dbout_profiles to public;
-grant delete on wt_dbout_profiles to public;
diff --git a/src/core/wt_profiler.pks b/src/core/wt_profiler.pks
deleted file mode 100644
index 4c6f83e..0000000
--- a/src/core/wt_profiler.pks
+++ /dev/null
@@ -1,40 +0,0 @@
-create or replace package wt_profiler authid definer --current_user
-as
-
- procedure initialize
- (in_test_run_id in number,
- in_runner_name in varchar2,
- out_dbout_owner out varchar2,
- out_dbout_name out varchar2,
- out_dbout_type out varchar2,
- out_trigger_offset out number,
- out_profiler_runid out number,
- out_error_message out varchar2);
-
- procedure finalize;
-
- function trigger_offset
- (dbout_owner_in in varchar2
- ,dbout_name_in in varchar2
- ,dbout_type_in in varchar2)
- return number;
-
- function calc_pct_coverage
- (in_test_run_id in number)
- return number;
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_profiler;
diff --git a/src/core/wt_result.pkb b/src/core/wt_result.pkb
deleted file mode 100644
index 6b00d3f..0000000
--- a/src/core/wt_result.pkb
+++ /dev/null
@@ -1,490 +0,0 @@
-create or replace package body wt_result
-as
-
- TYPE results_nt_type is table of wt_results%ROWTYPE;
- g_results_nt results_nt_type;
- g_results_rec wt_results%ROWTYPE;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_add BOOLEAN := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-----------------------
--- Private Procedures
-----------------------
-
-
----------------------
--- Public Procedures
----------------------
-
-------------------------------------------------------------
-procedure initialize
- (in_test_run_id in wt_test_runs.id%TYPE)
-is
- l_results_recNULL wt_results%ROWTYPE;
-begin
- if in_test_run_id is NULL
- then
- raise_application_error(-20009, '"in_test_run_id" cannot be NULL');
- end if;
- g_results_rec := l_results_recNULL;
- g_results_rec.test_run_id := in_test_run_id;
- g_results_rec.result_seq := 0;
- g_results_rec.executed_dtm := systimestamp;
- g_results_nt := results_nt_type(null);
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_add := FALSE;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-end initialize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_initialize
- is
- l_results_recNULL wt_results%ROWTYPE;
- l_results_recSAVE wt_results%ROWTYPE;
- l_results_recTEST wt_results%ROWTYPE;
- l_results_ntSAVE results_nt_type;
- l_results_ntTEST results_nt_type;
- begin
- -------------------------------------- WTPLSQL Testing --
- l_results_ntSAVE := g_results_nt;
- l_results_recSAVE := g_results_rec;
- g_results_rec := l_results_recNULL;
- initialize(-99);
- l_results_recTEST := g_results_rec;
- g_results_rec := l_results_recSAVE;
- l_results_ntTEST := g_results_nt;
- g_results_nt := l_results_ntSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path';
- wt_assert.eq (
- msg_in => 'l_results_recTEST.test_run_id',
- check_this_in => l_results_recTEST.test_run_id,
- against_this_in => -99);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_results_recTEST.result_seq',
- check_this_in => l_results_recTEST.result_seq,
- against_this_in => 0);
- wt_assert.isnotnull (
- msg_in => 'l_results_recTEST.executed_dtm',
- check_this_in => l_results_recTEST.executed_dtm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.interval_msecs',
- check_this_in => l_results_recTEST.interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.assertion',
- check_this_in => l_results_recTEST.assertion);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.status',
- check_this_in => l_results_recTEST.status);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.details',
- check_this_in => l_results_recTEST.details);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.testcase',
- check_this_in => l_results_recTEST.testcase);
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.message',
- check_this_in => l_results_recTEST.message);
- wt_assert.eq (
- msg_in => 'l_results_ntTEST.COUNT',
- check_this_in => l_results_ntTEST.COUNT,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_ntTEST(1).test_run_id',
- check_this_in => l_results_ntTEST(1).test_run_id);
- wt_assert.raises (
- msg_in => 'Raises ORA-20009',
- check_call_in => 'begin wt_result.initialize(NULL); end;',
- against_exc_in => 'ORA-20009: "in_test_run_id" cannot be NULL');
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Because this procedure is called to cleanup after errors,
--- it must be able to run multiple times without causing damage.
-procedure finalize
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_results_recNULL wt_results%ROWTYPE;
-begin
- if g_results_rec.test_run_id IS NULL
- then
- return;
- end if;
- -- There is always an extra NULL element in the g_results_nt array.
- forall i in 1 .. g_results_nt.COUNT - 1
- insert into wt_results values g_results_nt(i);
- COMMIT;
- g_results_nt := results_nt_type(null);
- g_results_rec := l_results_recNULL;
- g_results_nt := results_nt_type(null);
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- -------------------------------------- WTPLSQL Testing --
- type num_recs_aa_type is table of number index by varchar2(50);
- num_recs_aa num_recs_aa_type;
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_results_recNULL wt_results%ROWTYPE;
- l_results_recSAVE wt_results%ROWTYPE;
- l_results_recTEST wt_results%ROWTYPE;
- l_results_ntSAVE results_nt_type;
- l_results_ntTEST results_nt_type;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := ' ';
- l_results_ntSAVE := g_results_nt; -- Capture Original Values
- l_results_recSAVE := g_results_rec; -- Capture Original Values
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- g_results_rec := l_results_recNULL;
- g_results_rec.test_run_id := -99;
- g_results_rec.result_seq := 1;
- g_results_rec.executed_dtm := systimestamp;
- g_results_rec.interval_msecs := 99;
- -------------------------------------- WTPLSQL Testing --
- g_results_rec.assertion := 'FINALTEST';
- g_results_rec.status := wt_assert.C_PASS;
- g_results_rec.details := 'This is a WT_RESULT.FINALIZE Test';
- g_results_nt := results_nt_type(null);
- g_results_nt(1) := g_results_rec;
- g_results_nt.extend; -- Finalize expects that last element to be NULL
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- g_results_rec.test_run_id := NULL;
- select count(*)
- into num_recs_aa('Finalize Before NULL Test Record Count')
- from wt_results
- where test_run_id = -99;
- finalize;
- -------------------------------------- WTPLSQL Testing --
- select count(*)
- into num_recs_aa('Finalize After NULL Test Record Count')
- from wt_results
- where test_run_id = -99;
- rollback; -- UNDO all database changes
- g_results_rec.test_run_id := -99;
- -------------------------------------- WTPLSQL Testing --
- -- Can't Test in this block because g_results_rec has test data
- l_test_runs_rec.id := -99;
- l_test_runs_rec.start_dtm := systimestamp;
- l_test_runs_rec.runner_name := 'Finalize Test';
- l_test_runs_rec.runner_owner := 'BOGUS';
- insert into wt_test_runs values l_test_runs_rec;
- commit; -- Must commit because finalize is AUTONOMOUS TRANSACTION
- -------------------------------------- WTPLSQL Testing --
- finalize; -- g_results_nt is still loaded with one element
- l_results_ntTEST := g_results_nt;
- l_results_recTEST := g_results_rec;
- select count(*)
- into num_recs_aa('Finalize Record Count Test')
- from wt_results
- where test_run_id = -99;
- delete from wt_results where test_run_id = -99;
- delete from wt_test_runs where id = -99;
- commit; -- UNDO all database changes
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path';
- -- Restore values so we can test
- g_results_rec := l_results_recSAVE;
- g_results_nt := l_results_ntSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Before NULL Test Record Count',
- check_this_in => num_recs_aa('Finalize Before NULL Test Record Count'),
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'After NULL Test Record Count',
- check_this_in => num_recs_aa('Finalize After NULL Test Record Count'),
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_results_recTEST.test_run_id',
- check_this_in => l_results_recTEST.test_run_id);
- wt_assert.eq (
- msg_in => 'l_results_ntTEST.COUNT',
- check_this_in => l_results_ntTEST.COUNT,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'Record Count Test',
- check_this_in => num_recs_aa('Finalize Record Count Test'),
- against_this_in => 1);
- end t_finalize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure save
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE)
-is
- l_current_tstamp timestamp;
-begin
- if g_results_rec.test_run_id IS NULL
- then
- wt_text_report.ad_hoc_result
- (in_assertion
- ,in_status
- ,in_details
- ,in_testcase
- ,in_message);
- return;
- end if;
- -- Set the time and interval
- l_current_tstamp := systimestamp;
- g_results_rec.interval_msecs := extract(day from (
- l_current_tstamp - g_results_rec.executed_dtm
- ) * 86400 * 1000);
- g_results_rec.executed_dtm := l_current_tstamp;
- -- Set the IN variables
- g_results_rec.assertion := in_assertion;
- g_results_rec.status := in_status;
- g_results_rec.details := substr(in_details,1,4000);
- g_results_rec.testcase := substr(in_testcase,1,50);
- g_results_rec.message := substr(in_message,1,200);
- -- Increment, Extend, and Load
- g_results_rec.result_seq := g_results_rec.result_seq + 1;
- g_results_nt(g_results_nt.COUNT) := g_results_rec;
- g_results_nt.extend;
-
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not g_skip_add then
-$END
- wt_test_run_stat.add_result(g_results_rec);
-$IF $$WTPLSQL_SELFTEST $THEN
- end if;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-end save;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_save_testing
- is
- -------------------------------------- WTPLSQL Testing --
- TYPE l_dbmsout_buff_type is table of varchar2(32767);
- l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1);
- l_test_run_id number;
- l_dbmsout_line varchar2(32767);
- l_dbmsout_stat number;
- l_nt_count number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Happy Path Setup';
- -- Save/Clear the DBMS_OUPTUT Buffer
- loop
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- exit when l_dbmsout_stat != 0;
- l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
- l_dbmsout_buff.extend;
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Testing Happy Path';
- l_test_run_id := g_results_rec.test_run_id;
- g_results_rec.test_run_id := NULL;
- g_skip_add := TRUE;
- wt_result.save (
- in_assertion => 'SELFTEST1',
- in_status => wt_assert.C_PASS,
- in_details => 't_save_testing Details',
- in_testcase => wt_assert.g_testcase,
- in_message => 't_save_testing Message');
- g_skip_add := FALSE;
- g_results_rec.test_run_id := l_test_run_id;
- -------------------------------------- WTPLSQL Testing --
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- wt_assert.eq (
- msg_in => 'DBMS_OUTPUT Status',
- check_this_in => l_dbmsout_stat,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- if wt_assert.last_pass
- then
- wt_assert.isnotnull (
- msg_in => 'DBMS_OUTPUT Line',
- check_this_in => l_dbmsout_line);
- wt_assert.this (
- msg_in => 'Save Testing NULL Test DBMS_OUTPUT 3 Message',
- check_this_in => (l_dbmsout_line like '%' || wt_assert.g_testcase ||
- '%t_save_testing %'));
- -------------------------------------- WTPLSQL Testing --
- if not wt_assert.last_pass
- then
- -- No match, put the line back into DBMS_OUTPUT buffer and end this.
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
- end if;
- end if;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Ad Hoc Save Happy Path Teardown';
- -- Restore the DBMS_OUPTUT Buffer
- for i in 1 .. l_dbmsout_buff.COUNT - 1
- loop
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Save Testing Happy Path';
- l_nt_count := g_results_nt.COUNT;
- g_skip_add := TRUE;
- wt_result.save (
- in_assertion => 'SELFTEST2',
- in_status => wt_assert.C_PASS,
- in_details => 't_save_testing Testing Details',
- in_testcase => wt_assert.g_testcase,
- in_message => 't_save_testing Testing Message');
- g_skip_add := FALSE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt.COUNT',
- check_this_in => g_results_nt.COUNT,
- against_this_in => l_nt_count + 1);
- if not wt_assert.last_pass
- then
- return; -- Something went wrong, end this now.
- end if;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').assetion',
- check_this_in => g_results_nt(l_nt_count).assertion,
- against_this_in => 'SELFTEST2');
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').status',
- check_this_in => g_results_nt(l_nt_count).status,
- against_this_in => wt_assert.C_PASS);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').details',
- check_this_in => g_results_nt(l_nt_count).details,
- against_this_in => 't_save_testing Testing Details');
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').testcase',
- check_this_in => g_results_nt(l_nt_count).testcase,
- against_this_in => wt_assert.g_testcase);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'g_results_nt(' || l_nt_count || ').message',
- check_this_in => g_results_nt(l_nt_count).message,
- against_this_in => 't_save_testing Testing Message');
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').interval_msecs',
- check_this_in => g_results_nt(l_nt_count).interval_msecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').executed_dtm',
- check_this_in => g_results_nt(l_nt_count).executed_dtm);
- wt_assert.isnotnull (
- msg_in => 'g_results_nt(' || l_nt_count || ').result_seq',
- check_this_in => g_results_nt(l_nt_count).result_seq);
- -- Can't Delete Test Element. g_results_nt.COUNT is not reduced
- -- because nested tables are not dense.
- --g_results_nt.delete(l_nt_count + 1);
- end t_save_testing;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
-is
-begin
- delete from wt_results
- where test_run_id = in_test_run_id;
-end delete_records;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_records
- is
- -------------------------------------- WTPLSQL Testing --
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_results_rec wt_results%ROWTYPE;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path';
- select count(*) into l_num_recs
- from wt_results
- where test_run_id = -99;
- wt_assert.isnotnull (
- msg_in => 'Before Insert Count',
- check_this_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- l_test_runs_rec.id := -99;
- l_test_runs_rec.start_dtm := sysdate;
- l_test_runs_rec.runner_name := 'Delete Records Test';
- l_test_runs_rec.runner_owner := 'BOGUS';
- insert into wt_test_runs values l_test_runs_rec;
- l_results_rec.test_run_id := -99;
- -------------------------------------- WTPLSQL Testing --
- l_results_rec.result_seq := 1;
- l_results_rec.executed_dtm := sysdate;
- l_results_rec.interval_msecs := 99;
- l_results_rec.assertion := 'DELRECTEST';
- l_results_rec.status := wt_assert.C_PASS;
- l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test';
- insert into wt_results values l_results_rec;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'After Insert Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs + 1);
- delete_records(-99);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'After Test Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs);
- rollback;
- wt_assert.eqqueryvalue (
- msg_in => 'After ROLLBACK Count',
- check_query_in => 'select count(*) from wt_results' ||
- ' where test_run_id = -99',
- against_value_in => l_num_recs);
- end t_delete_records;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_RESULT:PACKAGE BODY" %--
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- t_initialize;
- t_finalize;
- t_save_testing;
- t_delete_records;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_result;
diff --git a/src/core/wt_result.pks b/src/core/wt_result.pks
deleted file mode 100644
index 68c54d9..0000000
--- a/src/core/wt_result.pks
+++ /dev/null
@@ -1,30 +0,0 @@
-create or replace package wt_result authid definer
-as
-
- procedure initialize
- (in_test_run_id in wt_test_runs.id%TYPE);
-
- procedure finalize;
-
- procedure save
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE);
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_result;
diff --git a/src/core/wt_results.tab b/src/core/wt_results.tab
deleted file mode 100644
index 6421982..0000000
--- a/src/core/wt_results.tab
+++ /dev/null
@@ -1,34 +0,0 @@
-
---
--- Results Table Installation
---
-
-create table wt_results
- (test_run_id number(38) constraint wt_results_nn2 not null
- ,result_seq number(8) constraint wt_results_nn3 not null
- ,executed_dtm timestamp(6) constraint wt_results_nn4 not null
- ,interval_msecs number(10,3) constraint wt_results_nn5 not null
- ,assertion varchar2(15) constraint wt_results_nn6 not null
- ,status varchar2(4) constraint wt_results_nn7 not null
- ,details varchar2(4000) constraint wt_results_nn8 not null
- ,testcase varchar2(50)
- ,message varchar2(200)
- ,constraint wt_results_pk primary key (test_run_id, result_seq)
- ,constraint wt_results_fk1 foreign key (test_run_id)
- references wt_test_runs (id)
- ,constraint wt_results_ck1 check (status in ('PASS','FAIL'))
- ) pctfree 0;
-
-comment on table wt_results is 'Results data from Test Runs.';
-comment on column wt_results.test_run_id is 'Foreign Key for the Test Run, Primary Key part 1.';
-comment on column wt_results.result_seq is 'Sequence number for this Result, Primary Key part 2.';
-comment on column wt_results.executed_dtm is 'Date/Time (with Fractional Seconds) this Result was captured';
-comment on column wt_results.interval_msecs is 'Interval time in milliseonds since the previous Result or start ot the Test Run.';
-comment on column wt_results.assertion is 'Name of the Assertion Test performed';
-comment on column wt_results.status is 'Passed/Failed Status from the Assertion';
-comment on column wt_results.details is 'Assertion Details, i.e. Expected Value and Actual Value';
-comment on column wt_results.testcase is 'Optional Test Case name.';
-comment on column wt_results.message is 'Optional test identifier that helps connect an Assertion to the Test Runner.';
-
-grant select on wt_results to public;
-grant delete on wt_results to public;
diff --git a/src/core/wt_self_test.tab b/src/core/wt_self_test.tab
deleted file mode 100644
index bd78946..0000000
--- a/src/core/wt_self_test.tab
+++ /dev/null
@@ -1,2375 +0,0 @@
-
---
--- Test Runs Table Installation
---
-
-create table wt_self_test
- (id number
- ,temp_clob clob
- ,temp_nclob nclob
- ,temp_xml xmltype
- ,temp_blob blob
- ,constraint wt_self_test_pk primary key (id)
- );
-
-comment on table wt_self_test is 'Test Data for unit testing of WTPLSQL.';
-comment on column wt_self_test.id is 'Primary Key';
-comment on column wt_self_test.temp_clob is 'CLOB test data';
-comment on column wt_self_test.temp_nclob is 'NCLOB test data';
-comment on column wt_self_test.temp_xml is 'XML test data';
-comment on column wt_self_test.temp_blob is 'BLOB test data';
-
-create or replace trigger wt_self_test$test
- before insert on wt_self_test
- for each row
-declare
- l_junk number;
-begin
- l_junk := 1;
-end;
-/
-
-set define off
-
-declare
- l_rec wt_self_test%ROWTYPE;
- buff varchar2(32000);
- t_blob blob;
- l_dest_offset pls_integer := 1;
- l_src_offset pls_integer := 1;
- l_lang_context pls_integer := 0; -- Default
- l_warning pls_integer;
-begin
- --
- buff :=
-'
-
- FPDS-NG search results for
-
-
-
-
-
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2016-02-16 13:10:02
-
-
-
-
- 1625
- DOLF072J11595
- 0
- 0
-
- 4730
- GS35F4543G
- 0
-
- 2007-05-04 00:00:00
- 2007-04-15 00:00:00
- 2008-04-14 00:00:00
- 2008-04-14 00:00:00
-
- 12638.59
- 12638.59
- 12638.59
-
- 0.00
- 0.00
- 0.00
-
- 1625
- BLSNO
- X
-
- 0.00
-
- C
- J
- NONE
- X
- XPERT FOR ORACLE ADMINISTRATION, PL/SQL DEVELOPMENT, TUNING MODULE, QUEST SQL OPTIMIZER.
-
- N
- X
- N
- X
- N
- N
- 1
-
- N
- X
- X
- X
-
- X
-
- 7030
- D
- 541519
- E
-
-
- DLT SOLUTIONS INCORPORATED
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- 173
- 26
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 13861 SUNRISE VALLEY DR STE 400
- HERNDON
- VA
- 201716126
- USA
- 10
- 7864681990000PR
- 201716126
-
- 786468199
- DLT SOLUTIONS INCORPORATED
- 786468199
- DLT SOLUTIONS LLC
-
- 2002-03-14 00:00:00
- 2008-11-16 00:00:00
- S
-
-
- 50000
- DC
- USA
- 202120002
- 00
-
- SP1
- NONE
- NONE
- 1
- A
- N
- false
- N
- X
-
-
- REYNOLDS.VANESSA@BLS.GOV
- 2007-04-10 16:40:29
- IDV_CORRECT
- 2016-02-16 13:10:02
- F
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2016-02-16 13:10:16
-
-
-
-
- 9100
- EDCIO12O0009
- 0
- 0
-
- 4730
- GS35F4543G
- 107
-
- 2012-05-11 00:00:00
- 2012-05-11 00:00:00
- 2012-09-30 00:00:00
- 2013-06-30 00:00:00
-
- 14168.16
- 14168.16
- 14168.16
-
- 14168.16
- 14168.16
- 14168.16
-
- 9100
- PO
- 9100
- EI
- X
-
- 0.00
-
- C
- J
- NONE
- TOAD SOFTWARE SUPPORT RENEWAL. TOAD IS USED BY THE DEPARTMENT OF EDUCATION AS A PRIMARY SQL AND PL/SQL DEVELOPMENT TOOL. IT IS ALSO USED FOR PRODUCTION SUPPORT AND MANAGING ORACLE DATABASES.
- N
- X
- N
- X
- N
- X
-
-
-
- 91
- 0202
- N
- 1
-
- N
- X
- X
- X
-
- X
-
- 7030
- D
- 541519
- C
- E
- USA
- D
-
-
- DLT SOLUTIONS, LLC
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- true
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- true
- false
-
- true
- false
- false
- false
- VA
- USA
- CORPORATE NOT TAX EXEMPT
- 245
- 775944576
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 13861 SUNRISE VALLEY DR STE 400
- HERNDON
- VA
- 201716126
- USA
- 10
-
- 786468199
- DLT SOLUTIONS, LLC
- 786468199
- DLT SOLUTIONS LLC
-
- O
-
-
- DC
- USA
- 202020001
- 00
-
- A
- MAFO
- NONE
- NONE
- FAIR
- 1
- A
- N
- N
- X
- N
-
-
- KARL.L.FEHRMAN@ED.GOV
- 2012-05-08 13:41:06
- IDV_CORRECT
- 2016-02-16 13:10:16
- F
- MICHAEL.HOLLOWAY@ED.GOV
- 2012-05-11 10:13:31
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2016-09-15 10:37:14
-
-
-
-
- 1549
- DJF152600P0008877
- 1
- 0
-
- 2015-10-30 00:00:00
- 2015-10-30 00:00:00
- 2015-10-30 00:00:00
- 2015-10-30 00:00:00
-
- 0.00
- 0.00
- 0.00
-
- 15000.00
- 15000.00
- 15000.00
-
- 1549
- PDS02
- 1549
- PDS02
- X
-
- 0.00
-
- B
- J
- K
- NONE
- "IGF::CL::IGF"
-
-
-
-
-THIS WILL BE AN ONLINE CLASS FOR 10 APPLICATION DEVELOPERS. EACH DEVELOPER WILL ACCESS THE TRAINING FROM EITHER A HOME COMPUTER OR ONE ON UNET. COURSE TOPICS INCLUDE SQL STATEMENT PROCESSING, PL/SQL TUNING, VIEWING THE EXECUTION PLAN, THE IMPORTANC
- CL
- N
- X
- N
- N
- X
-
-
-
- 15
- 0200
- 000
- Y
- 1
-
- N
- N
- N
- N
-
- X
-
- U012
- D
- 611420
- C
- A
- USA
- C
-
-
- SKILLBUILDERS INC
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- true
-
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
-
- true
- false
- false
- false
- RI
- USA
- CORPORATE NOT TAX EXEMPT
- 3
- 800000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 213 ROBINSON ST
- WAKEFIELD
- RI
- 028793590
- USA
- 4017836172
- 4017830405
- 02
- 960084242
- 02879
-
- 960084242
- SKILLBUILDERS INC
- 960084242
- SKILLBUILDERS INC
-
- 2001-10-22 00:00:00
- 2016-01-21 00:00:00
- O
-
-
- DC
- USA
- 205350001
- 00
-
- A
- NP
- NONE
- NONE
- 3
- D
- N
- N
- N
- N
-
- B
-
- VLBANKS
- 2015-10-30 13:34:40
- VLBANKS
- 2016-09-15 10:37:14
- F
- VLBANKS
- 2016-09-15 10:37:14
- VLBANKS
- 2016-09-15 10:37:14
- Y
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2015-06-11 17:40:38
-
-
-
-
- 1344
- DOC40PAPT1511219
- 0
- 0
-
- 2015-06-09 00:00:00
- 2015-06-09 00:00:00
- 2016-06-08 00:00:00
- 2016-06-08 00:00:00
-
- 4000.00
- 4000.00
- 4000.00
-
- 4000.00
- 4000.00
- 4000.00
-
- 1344
- 000PA
- 1344
- 000PA
- X
-
- 0.00
-
- B
- J
- NONE
- LICENSE FOR SONARSOURCE PL/SQL
- N
- X
- N
- X
- X
-
-
-
- 13
- 1006
- 000
- N
- 1
-
- Y
- X
- X
- X
-
- X
-
- 7030
- D
- 423430
- C
- A
- E
- USA
- D
-
-
- SHI INTERNATIONAL CORP.
-
-
- false
- false
- false
- false
- false
- false
- false
- true
-
- true
- false
- true
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- true
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- true
- false
- false
- false
- NJ
- USA
- CORPORATE NOT TAX EXEMPT
- 2000
- 6500000000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 290 DAVIDSON AVE STE 101
- SOMERSET
- NJ
- 088734179
- USA
- 8476031132
- 12
- 611429481
- 08873
-
- 611429481
- SHI INTERNATIONAL CORP.
- 611429481
- SHI INTERNATIONAL CORP.
-
- 2001-12-05 00:00:00
- 2016-05-19 00:00:00
- O
-
-
- VA
- USA
- 223131450
- 08
-
- G
- SP1
- NONE
- NONE
- SP2
- 1
- D
- N
- N
- X
- N
-
- B
-
- PTOTBF
- 2015-06-11 17:09:54
- PTOTBF
- 2015-06-11 17:40:38
- F
- PTOTBF
- 2015-06-11 17:40:38
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2017-10-04 14:20:48
-
-
-
-
- 12H2
- AG32SBD150147
- 0
- 0
-
- 4732
- GS06F0821Z
- 0
-
- 2015-06-03 00:00:00
- 2015-06-03 00:00:00
- 2019-07-05 00:00:00
- 2019-07-05 00:00:00
-
- 198000.00
- 198000.00
- 833580.00
-
- 614790.00
- 614790.00
- 833580.00
-
- 12H2
- 32SB
- 12H2
- 31PE
- X
-
- 0.00
-
- C
- J
- NONE
- THE PURPOSE OF THIS DELIVERY ORDER IS TO PURCHASE ORACLE PL/SQL PROGRAMMER (DATABASE ANALYST/PROGRAMMER-SENIOR) SERVICES IN ACCORDANCE WITH ATTACHED STATEMENT OF WORK DATED 6/1/2015.
-
-THIS AWARD IS AN OPTION YEAR CONTRACT. IT INCLUDES A BASE YEAR PLUS, THREE (3) ONE YEAR OPTION PERIODS. BASE YEAR PERIOD OF PERFORMANCE IS 7/6/2015 THROUGH 7/5/2016.
-
-IGF::CT::IGF
- CT
- N
- X
- N
- N
- X
-
-
-
- 12
- 1400
- N
- 1
-
- Y
- X
- N
- X
-
- X
-
- D308
- D
- 541512
- C
- A
- E
- USA
- C
-
-
- APEXTECH LLC
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- true
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- true
- false
-
- true
- false
- false
- false
- OTHER
- 13
- 2000000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- true
- true
- false
- false
- false
-
- 2200 WILSON BLVD
- ARLINGTON
- VA
- 222013397
- USA
- 7032539722
- 7035222037
- 08
- 126242150
- 222013397
-
- 126242150
- APEXTECH LLC
- 126242150
- APEXTECH LLC
-
- 2003-01-15 00:00:00
- 2014-07-31 00:00:00
- S
-
-
- MD
- USA
- 207051003
- 04
-
- D
- MAFO
- 8A
- NONE
- OSA
- A
- N
- N
- Y
- N
-
- B
-
- JESSICA.MASSEY@ARS.USDA.GOV
- 2015-05-21 14:03:35
- IDV_CORRECT
- 2017-10-04 14:20:48
- F
- JESSICA.MASSEY@ARS.USDA.GOV
- 2015-06-03 13:17:36
- N
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2017-11-29 23:36:42
-
-
-
-
- 9700
- M6738610P1027
- 0
- 0
-
- 2010-05-18 00:00:00
- 2010-05-18 00:00:00
- 2010-06-17 00:00:00
- 2010-06-17 00:00:00
-
- 700.00
- 700.00
- 700.00
-
- 700.00
- 700.00
- 700.00
-
- 1700
- M67386
- 1700
- M67386
- X
-
- 0.00
-
- B
- J
- NONE
- PL/SQL SOFTWARE DEVELOPER
- N
- N
- X
- N
- X
- Z
- N
- 1
-
- Y
- N
- N
- N
-
- X
-
- 7030
- D
- C9E
- 423430
- C
- A
- 000
- A
- A
- USA
- D
-
-
- DILTEX INC
-
-
- false
- false
- false
- false
- false
- false
- false
- true
-
- true
- true
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
-
- true
- false
- false
- false
- OTHER
- 4
- 2000000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- true
- false
- false
- false
- false
- false
-
- 14530 PACIFIC AVE
- BALDWIN PARK
- CA
- 917065340
- USA
- 6269601314
- 6269560615
- 32
- 969907914
- 917065340
-
- 969907914
- DILTEX INC
- 969907914
- DILTEX INC
-
- 2005-10-02 00:00:00
- 2011-01-12 00:00:00
- S
-
-
- MO
- USA
- 641471208
- 05
-
- D
- NP
- SBA
- NONE
- 2
- A
- N
- false
- N
- X
- N
- 0.00
-
- B
-
- JUDY.RUPARD.M67386@USMC.MIL
- 2010-05-18 08:59:07
- DOD_CLOSEOUT
- 2017-11-29 23:36:42
- F
- ANDREA.LEACH.M67386@USMC.MIL
- 2010-05-18 10:04:12
- DOD_CLOSEOUT
- 2017-11-29 23:36:42
- Y
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2014-06-29 12:37:57
-
-
-
-
- 1205
- AG64WCP140083
- 0
- 0
-
- 2014-06-29 00:00:00
- 2014-06-27 00:00:00
- 2015-06-30 00:00:00
- 2015-06-30 00:00:00
-
- 216.00
- 216.00
- 216.00
-
- 216.00
- 216.00
- 216.00
-
- 1205
- 64WC
- 12A7
- 64WC
- X
-
- 0.00
-
- B
- J
- PL SQL DEVELOPER SFTW RENEWAL
- NONE
- IGF::OT::IGF
-
-PL/SQL DEVELOPER LICENSES ANNUAL SERVICE CONTRACT - 6 USERS E-DOWNLOAD, PART RV1555 #5266.6
-
-WAIVER: FY14-RENEWAL R14318, CO-JADAMS, PURCHASE CARD, SOFTCHOICE
- OT
- N
- X
- N
- N
- X
-
-
-
- 12
- 4609
- Y
- 1
-
- N
- N
- N
- N
-
- X
-
- D319
- D
- 541519
- C
- A
- E
- USA
- C
-
-
- SOFTCHOICE CORPORATION
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- true
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- true
- false
- false
- false
- NY
- USA
- CORPORATE NOT TAX EXEMPT
- 1200
- 1000000000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 314 W SUPERIOR ST STE 301
- CHICAGO
- IL
- 606543538
- USA
- 7034801969
- 7034801956
- 07
- 929022028
- 606543538
-
- 929022028
- SOFTCHOICE CORPORATION
- 248864415
- SOFTCHOICE CORPORATION
-
- 2003-02-06 00:00:00
- 2015-02-03 00:00:00
- O
-
-
- MO
- USA
- 641143363
- 05
-
- F
- SP1
- NONE
- NONE
- 2
- A
- N
- N
- N
- N
-
- B
-
- JENNIFER.ADAMS@USDA.GOV
- 2014-06-29 12:02:32
- JENNIFER.ADAMS@USDA.GOV
- 2014-06-29 12:37:57
- F
- JENNIFER.ADAMS@USDA.GOV
- 2014-06-29 12:37:57
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2017-10-04 14:20:48
-
-
-
-
- 12H2
- AG32SBD170266
- 0
- 0
-
- 4732
- GS06F0821Z
- PA0003ADDRESSCHG
-
- 2017-09-22 00:00:00
- 2017-09-22 00:00:00
- 2019-09-28 00:00:00
- 2019-09-28 00:00:00
-
- 211860.00
- 211860.00
- 430650.00
-
- 211860.00
- 211860.00
- 430650.00
-
- 12H2
- 1232SB
- 12H2
- 12344P
- X
-
- 0.00
-
- C
- J
- NONE
- IGF::OT::IGF
-ORACLE PL/SQL PROGRAMMERS
- OT
- N
- X
- D
- N
- X
-
-
-
- 12
- 1400
- N
- 1
-
- Y
- X
- N
- X
-
- B
- 40 U.S.C. 11302(E)
-
- D308
- H
- 541512
- C
- A
- E
- USA
- C
-
-
- APEXTECH LLC
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
- false
- true
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- true
- false
-
- true
- false
- false
- false
- OTHER
- 13
- 2000000
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- true
- false
- true
- true
- false
- false
- false
-
- 2200 WILSON BLVD STE 810
- ARLINGTON
- VA
- 222013361
- USA
- 7032539722
- 7035222037
- 08
- 126242150
- 222013397
-
- 126242150
- 3C7R1
- APEXTECH LLC
- 126242150
- APEXTECH LLC
-
- 2003-01-15 00:00:00
- 2014-07-31 00:00:00
- S
-
-
- MD
- USA
- 207051003
- 04
-
- D
- MAFO
- 8A
- NONE
- OSA
- A
- N
- N
- Y
- N
-
-
- PAUL.MERRITT@ARS.USDA.GOV
- 2017-09-19 10:19:11
- IDV_CORRECT
- 2017-10-04 14:20:48
- F
- PAUL.MERRITT@ARS.USDA.GOV
- 2017-09-22 14:31:02
- N
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2016-02-16 13:10:05
-
-
-
-
- 9700
- HQ042307F0009
- 0
- 0
-
- 4730
- GS35F4543G
- 0
-
- 2006-10-01 00:00:00
- 2006-10-01 00:00:00
- 2007-09-30 00:00:00
- 2007-09-30 00:00:00
-
- 3199.00
- 3199.00
- 3199.00
-
- 3199.00
- 3199.00
- 3199.00
-
- 97BZ
- HQ0423
- 97BZ
- HQ0422
- X
-
- 0.00
-
- C
- J
- NONE
- X
- SQL NAVIGATOR FOR ORACLE SOFTWARE LICENSE MAINTENANCE RENEWAL; SQL NAVIGATOR FOR ORACLE XPERT TUNING MODULE SOFTWARE LICENSE MAINTENANCE RENEWAL; PL FORMAT OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; DEBUGGER OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; AND KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT SOFTWARE MAINTENANCE LICENSE RENEWAL
- N
- N
- X
- N
- N
- N
- Z
- N
- 1
-
- N
- X
- X
- X
-
- X
-
- D301
- D
- A7
- 541519
- 000
- A
- E
- USA
- C
-
-
- DLT SOLUTIONS INCORPORATED
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- 173
- 26
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 13861 SUNRISE VALLEY DR STE 400
- HERNDON
- VA
- 201716126
- USA
- 10
- 7864681990000PR
- 201716126
-
- 786468199
- DLT SOLUTIONS INCORPORATED
- 786468199
- DLT SOLUTIONS LLC
-
- 2002-03-14 00:00:00
- 2008-11-16 00:00:00
- S
-
-
- 16000
- OH
- USA
- 441992055
- 11
-
- A
- MAFO
- NONE
- NONE
- FAIR
- 1
- A
- N
- false
- N
- X
- 0.00
-
- B
-
- LINDA.BARVINCHAK.HQ0423@DFAS.MIL
- 2007-01-14 17:35:05
- IDV_CORRECT
- 2016-02-16 13:10:05
- F
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- buff :=
-'
-
-
- 2016-02-16 13:10:02
-
-
-
-
- 1524
- DJDEAEP070051D
- 0
- 0
-
- 4730
- GS35F4543G
- 0
-
- 2007-04-25 00:00:00
- 2007-04-25 00:00:00
- 2007-09-30 00:00:00
- 2008-09-29 00:00:00
-
- 544.20
- 544.20
- 544.20
-
- 544.20
- 544.20
- 544.20
-
- 1524
- DEAEP
- X
-
- 0.00
-
- C
- J
- NONE
- X
- RENEWAL OF SOFTWARE MAINTENANCE AND TECHNICAL SUPPORT FOR KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT. ESSENTIAL TO EIS SOFTWARE APPLICATION
- N
- X
- N
- N
- N
- N
- 1
-
- N
- X
- X
- X
-
- X
-
- D310
- D
- 541519
- E
-
-
- DLT SOLUTIONS INCORPORATED
-
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
-
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
-
- false
- false
- false
- false
- 173
- 26
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
-
- false
- false
- false
- false
- false
- false
- false
-
- 13861 SUNRISE VALLEY DR STE 400
- HERNDON
- VA
- 201716126
- USA
- 10
- 7864681990000PR
- 201716126
-
- 786468199
- DLT SOLUTIONS INCORPORATED
- 786468199
- DLT SOLUTIONS LLC
-
- 2002-03-14 00:00:00
- 2008-11-16 00:00:00
- S
-
-
- 24000
- TX
- USA
- 799088098
- 16
-
- SP1
- NONE
- NONE
- 1
- A
- N
- false
- N
- X
-
-
- ELENA.A.BESAW@USDOJ.GOV
- 2007-05-03 15:21:39
- IDV_CORRECT
- 2016-02-16 13:10:02
- F
-
-
-';
- l_rec.temp_clob := l_rec.temp_clob || buff;
- --
- l_rec.temp_nclob := l_rec.temp_clob;
- l_rec.temp_xml := xmltype(l_rec.temp_clob);
- dbms_lob.createtemporary (
- lob_loc => t_blob,
- cache => TRUE,
- dur => DBMS_LOB.CALL);
- dbms_lob.converttoblob(
- dest_lob => t_blob,
- src_clob => l_rec.temp_clob,
- amount => DBMS_LOB.LOBMAXSIZE,
- dest_offset => l_dest_offset,
- src_offset => l_src_offset,
- blob_csid => nls_charset_id('UTF8'),
- lang_context => l_lang_context,
- warning => l_warning);
- if l_warning != DBMS_LOB.NO_WARNING
- then
- raise_application_error(-20000, 'DBMS_LOB.CONVERTTOLOB returned WARNING: ' ||
- l_warning);
- end if;
- l_rec.temp_blob := t_blob;
- --
- l_rec.id := 1;
- insert into wt_self_test values l_rec;
- --
- l_rec.temp_clob := NULL;
- l_rec.temp_nclob := NULL;
- l_rec.temp_xml := NULL;
- l_rec.temp_blob := NULL;
- l_rec.id := 2;
- insert into wt_self_test values l_rec;
-end;
-/
-
-commit;
diff --git a/src/core/wt_test_run_stat.pkb b/src/core/wt_test_run_stat.pkb
deleted file mode 100644
index 9f3cbe8..0000000
--- a/src/core/wt_test_run_stat.pkb
+++ /dev/null
@@ -1,981 +0,0 @@
-create or replace package body wt_test_run_stat
-as
-
- TYPE tc_aa_type is
- table of wt_testcase_stats%ROWTYPE
- index by varchar2(50);
- g_tc_aa tc_aa_type;
- g_rec wt_test_run_stats%ROWTYPE;
-
-
-----------------------
--- Private Procedures
-----------------------
-
-
----------------------
--- Public Procedures
----------------------
-
-
-------------------------------------------------------------
-procedure initialize
-is
- l_recNULL wt_test_run_stats%ROWTYPE;
-begin
- g_rec := l_recNULL;
- g_tc_aa.delete;
-end initialize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_initialize
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path 1 Setup';
- l_tc_aaTEST('TESTCASE1').test_run_id := -2;
- l_recTEST.test_run_id := -1;
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
- check_this_in => l_tc_aaTEST('TESTCASE1').test_run_id,
- against_this_in => -2 );
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -1 );
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- initialize;
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Happy Path 1';
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST.COUNT',
- check_this_in => l_tc_aaTEST.COUNT,
- against_this_in => 0 );
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id );
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure add_result
- (in_results_rec in wt_results%ROWTYPE)
-is
- tc varchar2(50);
-begin
- -- If this raises an exception, it must be done before any other values
- -- are set because they will not be rolled-back after the "raise".
- case in_results_rec.status
- when 'PASS' then
- g_rec.passes := nvl(g_rec.passes,0) + 1;
- when 'FAIL' then
- g_rec.failures := nvl(g_rec.failures,0) + 1;
- when 'ERR' then
- g_rec.errors := nvl(g_rec.errors,0) + 1;
- else
- raise_application_error(-20010, 'Unknown Result status "' ||
- in_results_rec.status || '"');
- end case;
- g_rec.test_run_id := in_results_rec.test_run_id;
- g_rec.asserts := nvl(g_rec.asserts,0) + 1;
- g_rec.min_interval_msecs := least(nvl(g_rec.min_interval_msecs,999999999)
- ,in_results_rec.interval_msecs);
- g_rec.max_interval_msecs := greatest(nvl(g_rec.max_interval_msecs,0)
- ,in_results_rec.interval_msecs);
- g_rec.tot_interval_msecs := nvl(g_rec.tot_interval_msecs,0) +
- in_results_rec.interval_msecs;
- if in_results_rec.testcase is not null
- then
- tc := in_results_rec.testcase;
- g_tc_aa(tc).testcase := tc;
- g_tc_aa(tc).test_run_id := in_results_rec.test_run_id;
- g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts,0) + 1;
- case in_results_rec.status
- when 'PASS' then
- g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes,0) + 1;
- when 'FAIL' then
- g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0) + 1;
- when 'ERR' then
- g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors,0) + 1;
- -- No need to check "ELSE" because it would have been caught above
- end case;
- g_tc_aa(tc).min_interval_msecs := least(nvl(g_tc_aa(tc).min_interval_msecs,999999999)
- ,in_results_rec.interval_msecs);
- g_tc_aa(tc).max_interval_msecs := greatest(nvl(g_tc_aa(tc).max_interval_msecs,0)
- ,in_results_rec.interval_msecs);
- g_tc_aa(tc).tot_interval_msecs := nvl(g_tc_aa(tc).tot_interval_msecs,0) +
- in_results_rec.interval_msecs;
- end if;
-end add_result;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_add_result
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_resultTEST wt_results%ROWTYPE;
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- Overview:
- -- 1) Save results in temporary variables
- -- 2) Clear ADD_RESULT variables
- -- 3) Call ADD_RESULT several times with test data.
- -- 4) Capture test results
- -- 5) Restore saved results
- -- 6) Confirm the test results using WT_ASSERT.
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- l_resultTEST.test_run_id := -10;
- l_resultTEST.interval_msecs := 10;
- l_resultTEST.status := 'PASS';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- -------------------------------------- WTPLSQL Testing --
- l_resultTEST.interval_msecs := 20;
- l_resultTEST.status := 'FAIL';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- l_resultTEST.interval_msecs := 30;
- l_resultTEST.status := 'ERR';
- l_resultTEST.testcase := 'TESTCASE1';
- add_result(l_resultTEST);
- -------------------------------------- WTPLSQL Testing --
- l_resultTEST.interval_msecs := 40;
- l_resultTEST.status := 'ABC';
- l_resultTEST.testcase := 'TESTCASE1';
- begin
- add_result(l_resultTEST);
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- wt_assert.g_testcase := 'Add Result Testing';
- wt_assert.eq (
- msg_in => 'Add Result Sad Path 1',
- check_this_in => 'ORA-20010: Unknown Result status "ABC"',
- against_this_in => l_sqlerrm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -10);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_recTEST.min_interval_msecs',
- check_this_in => l_recTEST.min_interval_msecs,
- against_this_in => 10);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.max_interval_msecs',
- check_this_in => l_recTEST.max_interval_msecs,
- against_this_in => 30);
- wt_assert.eq (
- msg_in => 'l_recTEST.tot_interval_msecs',
- check_this_in => l_recTEST.tot_interval_msecs,
- against_this_in => 60);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').test_run_id',
- check_this_in => l_tc_aaTEST('TESTCASE1').test_run_id,
- against_this_in => -10);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').asserts',
- check_this_in => l_tc_aaTEST('TESTCASE1').asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').passes',
- check_this_in => l_tc_aaTEST('TESTCASE1').passes,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').failures',
- check_this_in => l_tc_aaTEST('TESTCASE1').failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').errors',
- check_this_in => l_tc_aaTEST('TESTCASE1').errors,
- against_this_in => 1);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').min_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').min_interval_msecs,
- against_this_in => 10);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').max_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').max_interval_msecs,
- against_this_in => 30);
- wt_assert.eq (
- msg_in => 'l_tc_aaTEST(''TESTCASE1'').tot_interval_msecs',
- check_this_in => l_tc_aaTEST('TESTCASE1').tot_interval_msecs,
- against_this_in => 60);
- end t_add_result;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure add_profile
- (in_dbout_profiles_rec in wt_dbout_profiles%ROWTYPE)
-is
-begin
- -- If this raises an exception, it must be done before any other values
- -- are set because they will not be rolled-back after the "raise".
- case in_dbout_profiles_rec.status
- when 'EXEC' then
- g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
- -- Only count the executed time.
- g_rec.min_executed_usecs := least(nvl(g_rec.min_executed_usecs,999999999)
- ,in_dbout_profiles_rec.min_usecs);
- g_rec.max_executed_usecs := greatest(nvl(g_rec.max_executed_usecs,0)
- ,in_dbout_profiles_rec.max_usecs);
- g_rec.tot_executed_usecs := nvl(g_rec.tot_executed_usecs,0) +
- ( in_dbout_profiles_rec.total_usecs /
- in_dbout_profiles_rec.total_occur );
- when 'IGNR' then
- g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
- when 'EXCL' then
- g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
- when 'NOTX' then
- g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
- when 'UNKN' then
- g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
- else
- raise_application_error(-20011, 'Unknown Profile status "' ||
- in_dbout_profiles_rec.status || '"');
- end case;
- g_rec.test_run_id := in_dbout_profiles_rec.test_run_id;
- g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
-end add_profile;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_add_profile
- is
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_profileTEST wt_dbout_profiles%ROWTYPE;
- l_sqlerrm varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- Overview:
- -- 1) Save results in temporary variables
- -- 2) Clear ADD_PROFILE variables
- -- 3) Call ADD_PROFILE several times with test data.
- -- 4) Capture test results
- -- 5) Restore saved results
- -- 6) Confirm the test results using WT_ASSERT.
- -------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- g_rec := l_recTEST;
- l_profileTEST.test_run_id := -20;
- l_profileTEST.min_usecs := 10;
- l_profileTEST.max_usecs := 20;
- l_profileTEST.total_usecs := 30;
- l_profileTEST.total_occur := 1;
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXEC';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'IGNR';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'NOTX';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'EXCL';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'EXCL';
- add_profile(l_profileTEST);
- l_profileTEST.status := 'UNKN';
- add_profile(l_profileTEST);
- -------------------------------------- WTPLSQL Testing --
- l_profileTEST.status := 'ABC';
- begin
- add_profile(l_profileTEST);
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Add Profile Testing';
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => -20);
- wt_assert.eq (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines,
- against_this_in => 15);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.min_executed_usecs',
- check_this_in => l_recTEST.min_executed_usecs,
- against_this_in => 10);
- wt_assert.eq (
- msg_in => 'l_recTEST.max_executed_usecs',
- check_this_in => l_recTEST.max_executed_usecs,
- against_this_in => 20);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.tot_executed_usecs',
- check_this_in => l_recTEST.tot_executed_usecs,
- against_this_in => 150);
- wt_assert.eq (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines,
- against_this_in => 5);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines,
- against_this_in => 4);
- wt_assert.eq (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Add Result Sad Path 1',
- check_this_in => 'ORA-20011: Unknown Profile status "ABC"',
- against_this_in => l_sqlerrm);
- end t_add_profile;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure finalize
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_executable_lines number;
- tc varchar2(50);
-begin
- if g_rec.test_run_id is null
- then
- initialize;
- return;
- end if;
- g_rec.testcases := g_tc_aa.COUNT;
- g_rec.asserts := nvl(g_rec.asserts ,0);
- g_rec.passes := nvl(g_rec.passes ,0);
- g_rec.failures := nvl(g_rec.failures,0);
- g_rec.errors := nvl(g_rec.errors ,0);
- if g_rec.asserts != 0
- then
- g_rec.test_yield := round(g_rec.passes/g_rec.asserts, 3);
- g_rec.avg_interval_msecs := round(g_rec.tot_interval_msecs/g_rec.asserts, 3);
- end if;
- if g_rec.profiled_lines is not null
- then
- g_rec.executed_lines := nvl(g_rec.executed_lines ,0);
- g_rec.ignored_lines := nvl(g_rec.ignored_lines,0);
- g_rec.excluded_lines := nvl(g_rec.excluded_lines ,0);
- g_rec.notexec_lines := nvl(g_rec.notexec_lines ,0);
- g_rec.unknown_lines := nvl(g_rec.unknown_lines ,0);
- l_executable_lines := g_rec.executed_lines + g_rec.notexec_lines;
- if l_executable_lines != 0
- then
- g_rec.code_coverage := round(g_rec.executed_lines/l_executable_lines, 3);
- g_rec.avg_executed_usecs := round(g_rec.tot_executed_usecs/l_executable_lines, 3);
- end if;
- end if;
- insert into wt_test_run_stats values g_rec;
- if g_rec.testcases > 0
- then
- tc := g_tc_aa.FIRST;
- loop
- g_tc_aa(tc).asserts := nvl(g_tc_aa(tc).asserts ,0);
- g_tc_aa(tc).passes := nvl(g_tc_aa(tc).passes ,0);
- g_tc_aa(tc).failures := nvl(g_tc_aa(tc).failures,0);
- g_tc_aa(tc).errors := nvl(g_tc_aa(tc).errors ,0);
- if g_rec.asserts != 0
- then
- g_tc_aa(tc).test_yield := round(g_tc_aa(tc).passes /
- g_tc_aa(tc).asserts, 3);
- g_tc_aa(tc).avg_interval_msecs := round(g_tc_aa(tc).tot_interval_msecs /
- g_tc_aa(tc).asserts, 3);
- end if;
- insert into wt_testcase_stats values g_tc_aa(tc);
- exit when tc = g_tc_aa.LAST;
- tc := g_tc_aa.NEXT(tc);
- end loop;
- end if;
- COMMIT;
- initialize;
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- l_tc_aaSAVE tc_aa_type;
- l_recSAVE wt_test_run_stats%ROWTYPE;
- l_tc_aaTEST tc_aa_type;
- l_recTEST wt_test_run_stats%ROWTYPE;
- l_recNULL wt_test_run_stats%ROWTYPE;
- l_tstat_rec wt_testcase_stats%ROWTYPE;
- l_test_run_id number := -102;
- l_tc varchar2(50) := 'TC2';
- l_sql_txt varchar2(4000);
- l_sqlerrm varchar2(4000);
- -------------------------------------- WTPLSQL Testing --
- procedure run_finalize (in_msg_txt in varchar2) is begin
- l_tc_aaSAVE := g_tc_aa;
- l_recSAVE := g_rec;
- g_tc_aa := l_tc_aaTEST;
- g_rec := l_recTEST;
- begin
- finalize;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST := g_tc_aa;
- l_recTEST := g_rec;
- g_tc_aa := l_tc_aaSAVE;
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => in_msg_txt,
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- end run_finalize;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path Setup';
- l_sql_txt := 'insert into WT_TEST_RUNS' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER3'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUNS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path 1';
- l_tc_aaTEST.delete;
- l_recTEST := l_recNULL;
- l_recTEST.test_run_id := l_test_run_id;
- run_finalize('Run Finalize for Happy Path 1'); -- AUTONOMOUS COMMIT
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_recTEST
- from WT_TEST_RUN_STATS
- where test_run_id = l_test_run_id;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TEST_RUN_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_yield',
- check_this_in => l_recTEST.test_yield);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.testcases',
- check_this_in => l_recTEST.testcases,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.min_interval_msecs',
- check_this_in => l_recTEST.min_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.avg_interval_msecs',
- check_this_in => l_recTEST.avg_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.max_interval_msecs',
- check_this_in => l_recTEST.max_interval_msecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.tot_interval_msecs',
- check_this_in => l_recTEST.tot_interval_msecs);
- wt_assert.isnull (
- msg_in => 'l_recTEST.code_coverage',
- check_this_in => l_recTEST.code_coverage);
- wt_assert.isnull (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines);
- wt_assert.isnull (
- msg_in => 'l_recTEST.avg_executed_usecs',
- check_this_in => l_recTEST.avg_executed_usecs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TESTCASE_STATS records',
- check_query_in => 'select count(*) from WT_TESTCASE_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUN_STATS Record',
- check_call_in => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TEST_RUN_STATS records',
- check_query_in => 'select count(*) from WT_TEST_RUN_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path 2';
- l_tc_aaTEST.delete;
- l_tc_aaTEST(l_tc||'a').test_run_id := l_test_run_id;
- l_tc_aaTEST(l_tc||'a').testcase := l_tc||'a';
- l_tc_aaTEST(l_tc||'a').asserts := 3;
- l_tc_aaTEST(l_tc||'a').passes := 2;
- l_tc_aaTEST(l_tc||'a').failures := 1;
- --l_tc_aaTEST(l_tc||'a').errors := null;
- l_tc_aaTEST(l_tc||'a').tot_interval_msecs := 300;
- -------------------------------------- WTPLSQL Testing --
- l_tc_aaTEST(l_tc||'b').test_run_id := l_test_run_id;
- l_tc_aaTEST(l_tc||'b').testcase := l_tc||'b';
- l_tc_aaTEST(l_tc||'b').asserts := 3;
- l_tc_aaTEST(l_tc||'b').passes := 2;
- l_tc_aaTEST(l_tc||'b').failures := 1;
- --l_tc_aaTEST(l_tc||'b').errors := null;
- l_tc_aaTEST(l_tc||'b').tot_interval_msecs := 300;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST := l_recNULL;
- l_recTEST.test_run_id := l_test_run_id;
- l_recTEST.asserts := 6;
- l_recTEST.passes := 4;
- l_recTEST.failures := 2;
- --l_recTEST.errors := null;
- l_recTEST.tot_interval_msecs := 600;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST.profiled_lines := 20;
- l_recTEST.executed_lines := 8;
- l_recTEST.ignored_lines := 6;
- l_recTEST.excluded_lines := 4;
- l_recTEST.notexec_lines := 2;
- --l_recTEST.unknown_lines := null;
- l_recTEST.tot_executed_usecs := 2000;
- run_finalize('Run Finalize for Happy Path 2'); -- AUTONOMOUS COMMIT
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_tstat_rec
- from WT_TESTCASE_STATS
- where test_run_id = l_test_run_id
- and testcase = l_tc||'a';
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TESTCASE_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_run_id',
- check_this_in => l_tstat_rec.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.testcase',
- check_this_in => l_tstat_rec.testcase,
- against_this_in => l_tc||'a');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.asserts',
- check_this_in => l_tstat_rec.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.passes',
- check_this_in => l_tstat_rec.passes,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.failures',
- check_this_in => l_tstat_rec.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.errors',
- check_this_in => l_tstat_rec.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_yield',
- check_this_in => l_tstat_rec.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.avg_interval_msecs',
- check_this_in => l_tstat_rec.avg_interval_msecs,
- against_this_in => 100);
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_tstat_rec
- from WT_TESTCASE_STATS
- where test_run_id = l_test_run_id
- and testcase = l_tc||'b';
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TESTCASE_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_run_id',
- check_this_in => l_tstat_rec.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.testcase',
- check_this_in => l_tstat_rec.testcase,
- against_this_in => l_tc||'b');
- wt_assert.eq (
- msg_in => 'l_tstat_rec.asserts',
- check_this_in => l_tstat_rec.asserts,
- against_this_in => 3);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.passes',
- check_this_in => l_tstat_rec.passes,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.failures',
- check_this_in => l_tstat_rec.failures,
- against_this_in => 1);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_tstat_rec.errors',
- check_this_in => l_tstat_rec.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.test_yield',
- check_this_in => l_tstat_rec.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_tstat_rec.avg_interval_msecs',
- check_this_in => l_tstat_rec.avg_interval_msecs,
- against_this_in => 100);
- -------------------------------------- WTPLSQL Testing --
- begin
- select * into l_recTEST
- from WT_TEST_RUN_STATS
- where test_run_id = l_test_run_id;
- l_sqlerrm := SQLERRM;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'Retieve WT_TEST_RUN_STATS record',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-0000: normal, successful completion');
- wt_assert.eq (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id,
- against_this_in => l_test_run_id);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.test_yield',
- check_this_in => l_recTEST.test_yield,
- against_this_in => 0.667);
- wt_assert.eq (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts,
- against_this_in => 6);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.passes',
- check_this_in => l_recTEST.passes,
- against_this_in => 4);
- wt_assert.eq (
- msg_in => 'l_recTEST.failures',
- check_this_in => l_recTEST.failures,
- against_this_in => 2);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.errors',
- check_this_in => l_recTEST.errors,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.testcases',
- check_this_in => l_recTEST.testcases,
- against_this_in => 2);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.avg_interval_msecs',
- check_this_in => l_recTEST.avg_interval_msecs,
- against_this_in => 100);
- wt_assert.eq (
- msg_in => 'l_recTEST.code_coverage',
- check_this_in => l_recTEST.code_coverage,
- against_this_in => 0.8);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.profiled_lines',
- check_this_in => l_recTEST.profiled_lines,
- against_this_in => 20);
- wt_assert.eq (
- msg_in => 'l_recTEST.executed_lines',
- check_this_in => l_recTEST.executed_lines,
- against_this_in => 8);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.ignored_lines',
- check_this_in => l_recTEST.ignored_lines,
- against_this_in => 6);
- wt_assert.eq (
- msg_in => 'l_recTEST.excluded_lines',
- check_this_in => l_recTEST.excluded_lines,
- against_this_in => 4);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.notexec_lines',
- check_this_in => l_recTEST.notexec_lines,
- against_this_in => 2);
- wt_assert.eq (
- msg_in => 'l_recTEST.unknown_lines',
- check_this_in => l_recTEST.unknown_lines,
- against_this_in => 0);
- wt_assert.eq (
- msg_in => 'l_recTEST.avg_executed_usecs',
- check_this_in => l_recTEST.avg_executed_usecs,
- against_this_in => 200);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TESTCASE_STATS Record',
- check_call_in => 'delete from WT_TESTCASE_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TESTCASE_STATS records',
- check_query_in => 'select count(*) from WT_TESTCASE_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUN_STATS Record',
- check_call_in => 'delete from WT_TEST_RUN_STATS where test_run_id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- wt_assert.eqqueryvalue (
- msg_in => 'There should be no WT_TEST_RUN_STATS records',
- check_query_in => 'select count(*) from WT_TEST_RUN_STATS' ||
- ' where test_run_id = ' || l_test_run_id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Sad Path 1';
- l_tc_aaTEST.delete;
- l_recTEST := l_recNULL;
- l_recTEST.asserts := 2;
- run_finalize('Run Finalize for Sad Path 1'); -- AUTONOMOUS COMMIT
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id);
- wt_assert.isnull (
- msg_in => 'l_recTEST.asserts',
- check_this_in => l_recTEST.asserts);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'FINALIZE Happy Path Teardown';
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUNS Record',
- check_call_in => 'delete from WT_TEST_RUNS where id = ' ||
- l_test_run_id,
- against_exc_in => '');
- commit;
- end t_finalize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
-is
-begin
- delete from wt_testcase_stats
- where test_run_id = in_test_run_id;
- delete from wt_test_run_stats
- where test_run_id = in_test_run_id;
-end delete_records;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_records
- is
- l_test_run_id number := -100;
- l_sql_txt varchar2(4000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path Setup';
- l_sql_txt := 'insert into WT_TEST_RUNS' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || l_test_run_id || ', sysdate, USER, ''TESTRUNNER2'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUNS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into WT_TEST_RUN_STATS (test_run_id) values (' ||
- l_test_run_id || ')';
- wt_assert.raises (
- msg_in => 'Insert WT_TEST_RUN_STATS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- l_sql_txt := 'insert into WT_TESTCASE_STATS (test_run_id, testcase)' ||
- ' values (' || l_test_run_id || ', ''TESTCASE2'')';
- wt_assert.raises (
- msg_in => 'Insert WT_TESTCASE_STATS Record',
- check_call_in => l_sql_txt,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Happy Path and Teardown';
- wt_assert.raises (
- msg_in => 'Delete Records with NULL ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(' ||
- l_test_run_id || '); end;',
- against_exc_in => '');
- wt_assert.raises (
- msg_in => 'Delete WT_TEST_RUNS Record',
- check_call_in => 'delete from WT_TEST_RUNS where id = ' || l_test_run_id,
- against_exc_in => '');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Delete Records Test Sad Paths';
- wt_assert.raises (
- msg_in => 'Delete Records with NULL ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(null); end;',
- against_exc_in => '');
- wt_assert.raises (
- msg_in => 'Delete Records with Invalid ID',
- check_call_in => 'begin wt_test_run_stat.delete_records(-0.01); end;',
- against_exc_in => '');
- end t_delete_records;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_TEST_RUN_STAT:PACKAGE BODY" %--
- is
- begin
- t_initialize;
- t_add_result;
- t_add_profile;
- t_finalize;
- t_delete_records;
- end WTPLSQL_RUN;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wt_test_run_stat;
diff --git a/src/core/wt_test_run_stat.pks b/src/core/wt_test_run_stat.pks
deleted file mode 100644
index 3538cde..0000000
--- a/src/core/wt_test_run_stat.pks
+++ /dev/null
@@ -1,28 +0,0 @@
-create or replace package wt_test_run_stat authid definer
-as
-
- procedure initialize;
-
- procedure add_result
- (in_results_rec in wt_results%ROWTYPE);
-
- procedure add_profile
- (in_dbout_profiles_rec in wt_dbout_profiles%ROWTYPE);
-
- procedure finalize;
-
- procedure delete_records
- (in_test_run_id in number);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wt_test_run_stat;
diff --git a/src/core/wt_test_run_stats.tab b/src/core/wt_test_run_stats.tab
deleted file mode 100644
index 988bc6b..0000000
--- a/src/core/wt_test_run_stats.tab
+++ /dev/null
@@ -1,59 +0,0 @@
-
---
--- Test Runs Statistics Table Installation
---
-
-create table wt_test_run_stats
- (test_run_id number(38) constraint wt_test_run_stats_nn1 not null
- ,test_yield number
- ,asserts number
- ,passes number
- ,failures number
- ,errors number
- ,testcases number
- ,min_interval_msecs number
- ,avg_interval_msecs number
- ,max_interval_msecs number
- ,tot_interval_msecs number
- ,code_coverage number
- ,profiled_lines number
- ,executed_lines number
- ,ignored_lines number
- ,excluded_lines number
- ,notexec_lines number
- ,unknown_lines number
- ,min_executed_usecs number
- ,avg_executed_usecs number
- ,max_executed_usecs number
- ,tot_executed_usecs number
- ,constraint wt_test_run_stats_pk primary key (test_run_id)
- ,constraint wt_test_run_stats_fk1 foreign key (test_run_id)
- references wt_test_runs (id)
- ) pctfree 0;
-
-comment on table wt_test_run_stats is 'Test Run data statistics for each execution of the WTPLSQL_RUN procedure.';
-comment on column wt_test_run_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs foreign key.';
-comment on column wt_test_run_stats.test_yield is 'Ratio of successful assertions to total assertions.';
-comment on column wt_test_run_stats.asserts is 'Total number of assetions.';
-comment on column wt_test_run_stats.passes is 'Number of passed assertions.';
-comment on column wt_test_run_stats.failures is 'Number of failed assertions.';
-comment on column wt_test_run_stats.errors is 'Number of errored assertions.';
-comment on column wt_test_run_stats.testcases is 'Total number of test cases.';
-comment on column wt_test_run_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds';
-comment on column wt_test_run_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds';
-comment on column wt_test_run_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds';
-comment on column wt_test_run_stats.tot_interval_msecs is 'Total (Sum) of interval times between assertions in milliseconds';
-comment on column wt_test_run_stats.code_coverage is 'Ratio of execute source lines to valid executable source lines.';
-comment on column wt_test_run_stats.profiled_lines is 'Total number of source lines as counted by DBMS_PROFILER';
-comment on column wt_test_run_stats.executed_lines is 'Number of source lines executed';
-comment on column wt_test_run_stats.ignored_lines is 'Number of source lines ignored as uncountable';
-comment on column wt_test_run_stats.excluded_lines is 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics';
-comment on column wt_test_run_stats.notexec_lines is 'Number of source lines not execute';
-comment on column wt_test_run_stats.unknown_lines is 'Number of source lines that have unexplained DBMS_PROFILER metrics';
-comment on column wt_test_run_stats.min_executed_usecs is 'Minumum execution time for a line of source in microseconds';
-comment on column wt_test_run_stats.avg_executed_usecs is 'Average execution time for a line of source in microseconds';
-comment on column wt_test_run_stats.max_executed_usecs is 'Maximum execution time for a line of source in microseconds';
-comment on column wt_test_run_stats.tot_executed_usecs is 'Total (Sum) of execution times for a line of source in microseconds';
-
-grant select on wt_test_run_stats to public;
-grant delete on wt_test_run_stats to public;
diff --git a/src/core/wt_test_runs.tab b/src/core/wt_test_runs.tab
deleted file mode 100644
index e2c7bfa..0000000
--- a/src/core/wt_test_runs.tab
+++ /dev/null
@@ -1,47 +0,0 @@
-
---
--- Test Runs Table Installation
---
-
-create sequence wt_test_runs_seq;
-
-grant select on wt_test_runs_seq to public;
-
-
-create table wt_test_runs
- (id number(38) constraint wt_test_runs_nn1 not null
- ,start_dtm timestamp constraint wt_test_runs_nn2 not null
- ,runner_name varchar2(128) constraint wt_test_runs_nn3 not null
- ,runner_owner varchar2(128) constraint wt_test_runs_nn4 not null
- ,dbout_owner varchar2(128)
- ,dbout_name varchar2(128)
- ,dbout_type varchar2(20)
- ,trigger_offset number
- ,profiler_runid number
- ,end_dtm timestamp
- ,error_message varchar2(4000)
- ,constraint wt_test_runs_pk primary key (id)
- ,constraint wt_test_runs_nk1 unique (start_dtm, runner_name, runner_owner)
- ,constraint wt_test_runs_fk1 foreign key (profiler_runid)
- references plsql_profiler_runs (runid) disable
- ) pctfree 0;
-
-create index wt_test_runs_idx1
- on wt_test_runs (start_dtm);
-
-comment on table wt_test_runs is 'Test Run data for each execution of the WTPLSQL_RUN procedure.';
-comment on column wt_test_runs.id is 'Primary (Surrogate) Key for each Test Run';
-comment on column wt_test_runs.start_dtm is 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 1';
-comment on column wt_test_runs.runner_name is 'Name of the package with the WTPLSQL_RUN procedure. Natural Key 1 part 2';
-comment on column wt_test_runs.runner_owner is 'Owner of the package with the WTPLSQL_RUN procedure. Natural Key 2 part 3';
-comment on column wt_test_runs.end_dtm is 'Date/time (and fractional seconds) this Test Run ended.';
-comment on column wt_test_runs.dbout_owner is 'Optional Owner of the Database Object Under Test (DBOUT).';
-comment on column wt_test_runs.dbout_name is 'Optional Name of the Database Object Under Test (DBOUT).';
-comment on column wt_test_runs.dbout_type is 'Optional Type of the Database Object Under Test (DBOUT).';
-comment on column wt_test_runs.trigger_offset is 'Optional calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.';
-comment on column wt_test_runs.profiler_runid is 'Optional DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence';
-comment on column wt_test_runs.error_message is 'Optional Last error messages from this Test Run.';
-
-grant select on wt_test_runs to public;
-grant insert on wt_test_runs to public;
-grant delete on wt_test_runs to public;
diff --git a/src/core/wt_testcase_stats.tab b/src/core/wt_testcase_stats.tab
deleted file mode 100644
index 8794541..0000000
--- a/src/core/wt_testcase_stats.tab
+++ /dev/null
@@ -1,37 +0,0 @@
-
---
--- Test Runs Statistics Table Installation
---
-
-create table wt_testcase_stats
- (test_run_id number(38) constraint wt_testcase_stats_nn1 not null
- ,testcase varchar2(50) constraint wt_testcase_stats_nn2 not null
- ,test_yield number
- ,asserts number
- ,passes number
- ,failures number
- ,errors number
- ,min_interval_msecs number
- ,avg_interval_msecs number
- ,max_interval_msecs number
- ,tot_interval_msecs number
- ,constraint wt_testcase_stats_pk primary key (test_run_id, testcase)
- ,constraint wt_testcase_stats_fk1 foreign key (test_run_id)
- references wt_test_runs (id)
- ) pctfree 0;
-
-comment on table wt_testcase_stats is 'Test Run data statistics for each testcase in the execution of the WTPLSQL_RUN procedure.';
-comment on column wt_testcase_stats.test_run_id is 'Primary (Surrogate) Key for each Test Run. Also the Test Runs Foreign Key.';
-comment on column wt_testcase_stats.testcase is 'Primary Key (part 2). The testcase name';
-comment on column wt_testcase_stats.test_yield is 'Ratio of successful assertions to total assertions.';
-comment on column wt_testcase_stats.asserts is 'Total number of assetions for the testcase.';
-comment on column wt_testcase_stats.passes is 'Number of passed assertions for the testcase.';
-comment on column wt_testcase_stats.failures is 'Number of failed assertions for the testcase.';
-comment on column wt_testcase_stats.errors is 'Number of errored assertions for the testcase.';
-comment on column wt_testcase_stats.min_interval_msecs is 'Minimum interval time between assertions in milliseconds for the testcase';
-comment on column wt_testcase_stats.avg_interval_msecs is 'Average interval time between assertions in milliseconds for the testcase';
-comment on column wt_testcase_stats.max_interval_msecs is 'Maximum interval time between assertions in milliseconds for the testcase';
-comment on column wt_testcase_stats.tot_interval_msecs is 'Total (sum) of interval times between assertions in milliseconds for the testcase';
-
-grant select on wt_testcase_stats to public;
-grant delete on wt_testcase_stats to public;
diff --git a/src/core/wt_text_report.pkb b/src/core/wt_text_report.pkb
deleted file mode 100644
index 24fc5b8..0000000
--- a/src/core/wt_text_report.pkb
+++ /dev/null
@@ -1,351 +0,0 @@
-create or replace package body wt_text_report
-as
-
- g_test_runs_rec wt_test_runs%ROWTYPE;
- g_test_run_stats_rec wt_test_run_stats%ROWTYPE;
-
-
-----------------------
--- Private Procedures
-----------------------
-
-------------------------------------------------------------
-procedure p
- (in_text in varchar2)
-is
-begin
- dbms_output.put_line(in_text);
-end p;
-
-------------------------------------------------------------
-procedure result_summary
-is
-begin
- p(' Total Test Cases: ' || to_char(nvl(g_test_run_stats_rec.testcases ,0),'9999999') ||
- ' Total Assertions: ' || to_char(nvl(g_test_run_stats_rec.asserts ,0),'9999999') );
- p(' Minimum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.min_interval_msecs,0),'9999999') ||
- ' Failed Assertions: ' || to_char(nvl(g_test_run_stats_rec.failures ,0),'9999999') );
- p(' Average Interval msec: ' || to_char(nvl(g_test_run_stats_rec.avg_interval_msecs,0),'9999999') ||
- ' Error Assertions: ' || to_char(nvl(g_test_run_stats_rec.errors ,0),'9999999') );
- p(' Maximum Interval msec: ' || to_char(nvl(g_test_run_stats_rec.max_interval_msecs,0),'9999999') ||
- ' Test Yield: ' || to_char( g_test_run_stats_rec.test_yield * 100 ,'9990.99') ||
- '%' );
- p(' Total Run Time (sec): ' || to_char(extract(day from (g_test_runs_rec.end_dtm -
- g_test_runs_rec.start_dtm)*86400*100)/100 ,'99990.9') );
-end result_summary;
-
-------------------------------------------------------------
-procedure profile_summary
-is
-begin
- p(' Ignored Lines: ' || to_char(nvl(g_test_run_stats_rec.ignored_lines ,0),'9999999') ||
- ' Total Profiled Lines: ' || to_char(nvl(g_test_run_stats_rec.profiled_lines ,0),'9999999') );
- p(' Excluded Lines: ' || to_char(nvl(g_test_run_stats_rec.excluded_lines ,0),'9999999') ||
- ' Total Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.executed_lines ,0),'9999999') );
- p(' Minimum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.min_executed_usecs,0),'9999999') ||
- ' Not Executed Lines: ' || to_char(nvl(g_test_run_stats_rec.notexec_lines ,0),'9999999') );
- p(' Average LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.avg_executed_usecs,0),'9999999') ||
- ' Unknown Lines: ' || to_char(nvl(g_test_run_stats_rec.unknown_lines ,0),'9999999') );
- p(' Maximum LineExec usec: ' || to_char(nvl(g_test_run_stats_rec.max_executed_usecs,0),'9999999') ||
- ' Code Coverage: ' || to_char( g_test_run_stats_rec.code_coverage * 100 ,'9990.99') ||
- '%' );
- p(' Trigger Source Offset: ' || to_char( g_test_runs_rec.trigger_offset ,'9999999') );
-end profile_summary;
-
-------------------------------------------------------------
-procedure summary_out
-is
-begin
- p('');
- p(' wtPLSQL ' || wtplsql.show_version ||
- ' - Run ID ' || g_test_runs_rec.id ||
- ': ' || to_char(g_test_runs_rec.start_dtm, g_date_format) ||
- CHR(10) );
- p(' Test Results for ' || g_test_runs_rec.runner_owner ||
- '.' || g_test_runs_rec.runner_name );
- result_summary;
- if g_test_runs_rec.dbout_name is not null
- AND g_test_runs_rec.profiler_runid is null
- then
- p('');
- p(' Note: ' || g_test_runs_rec.dbout_type || ' ' ||
- g_test_runs_rec.dbout_owner || '.' ||
- g_test_runs_rec.dbout_name || ' was not profiled.');
- end if;
- if g_test_runs_rec.error_message is not null
- then
- p('');
- p(' *** Test Runner Error ***');
- p(g_test_runs_rec.error_message);
- end if;
- ----------------------------------------
- if g_test_runs_rec.profiler_runid is null
- then
- return;
- end if;
- p('');
- p(' Code Coverage for ' || g_test_runs_rec.dbout_type ||
- ' ' || g_test_runs_rec.dbout_owner ||
- '.' || g_test_runs_rec.dbout_name );
- profile_summary;
-end summary_out;
-
-------------------------------------------------------------
-procedure results_out
- (in_show_pass in boolean)
-is
- l_last_testcase wt_results.testcase%TYPE;
- l_show_pass_txt varchar2(1);
- header_shown boolean;
- procedure l_show_header is begin
- p('');
- p(' - ' || g_test_runs_rec.runner_owner ||
- '.' || g_test_runs_rec.runner_name ||
- ' Test Result Details (Test Run ID ' ||
- g_test_runs_rec.id ||
- ')' );
- p('-----------------------------------------------------------');
- end l_show_header;
-begin
- if in_show_pass
- then
- l_show_pass_txt := 'Y';
- else
- l_show_pass_txt := 'N';
- end if;
- header_shown := FALSE;
- for buff in (
- select status
- ,interval_msecs
- ,testcase
- ,assertion
- ,details
- ,message
- from wt_results
- where test_run_id = g_test_runs_rec.id
- and ( l_show_pass_txt = 'Y'
- or status != 'PASS')
- order by result_seq )
- loop
- if not header_shown
- then
- l_show_header;
- header_shown := TRUE;
- end if;
- if buff.testcase = l_last_testcase
- OR ( buff.testcase is null
- AND l_last_testcase is null )
- then
- p(format_test_result
- (in_assertion => buff.assertion
- ,in_status => buff.status
- ,in_details => buff.details
- ,in_testcase => NULL
- ,in_message => buff.message
- ,in_interval_msecs => buff.interval_msecs) );
- else
- p(format_test_result
- (in_assertion => buff.assertion
- ,in_status => buff.status
- ,in_details => buff.details
- ,in_testcase => buff.testcase
- ,in_message => buff.message
- ,in_interval_msecs => buff.interval_msecs) );
- l_last_testcase := buff.testcase;
- end if;
- end loop;
-end results_out;
-
-------------------------------------------------------------
-procedure profile_out
- (in_show_aux in boolean)
-is
- l_header_txt CONSTANT varchar2(2000) :=
- 'Source TotTime MinTime MaxTime ' || chr(10) ||
- ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) ||
- '------ ---- ------ --------- ------- --------- ------------';
- l_show_aux_txt varchar2(1);
- header_shown boolean;
- procedure l_show_header is begin
- p('');
- p(' - ' || g_test_runs_rec.dbout_owner ||
- '.' || g_test_runs_rec.dbout_name ||
- ' ' || g_test_runs_rec.dbout_type ||
- ' Code Coverage Details (Test Run ID ' ||
- g_test_runs_rec.id ||
- ')' );
- end l_show_header;
-begin
- if g_test_runs_rec.profiler_runid is null
- then
- return;
- end if;
- if in_show_aux
- then
- l_show_aux_txt := 'Y';
- else
- l_show_aux_txt := 'N';
- end if;
- header_shown := FALSE;
- for buff in (
- select line
- ,status
- ,total_occur
- ,total_usecs
- ,min_usecs
- ,max_usecs
- ,text
- ,rownum
- from wt_dbout_profiles
- where test_run_id = g_test_runs_rec.id
- and ( l_show_aux_txt = 'Y'
- or status not in ('EXEC','IGNR','UNKN','EXCL'))
- order by line )
- loop
- if not header_shown
- then
- l_show_header;
- p(l_header_txt);
- header_shown := TRUE;
- end if;
- if mod(buff.rownum,25) = 0
- then
- p(l_header_txt);
- end if;
- p(to_char(buff.line,'99999') ||
- case buff.status when 'NOTX' then '#NOTX#'
- else ' ' || rpad(buff.status,4) || ' '
- end ||
- to_char(buff.total_occur,'99999') || ' ' ||
- to_char(buff.total_usecs,'99999999') || ' ' ||
- to_char(buff.min_usecs,'999999') || ' ' ||
- to_char(buff.max_usecs,'99999999') || ' ' ||
- replace(buff.text,CHR(10),'') );
- end loop;
-end profile_out;
-
-
----------------------
--- Public Procedures
----------------------
-
-------------------------------------------------------------
-function format_test_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE
- ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
- return varchar2
-is
- l_out_str varchar2(32000) := '';
-begin
- if in_testcase is not null
- then
- l_out_str := ' ---- Test Case: ' || in_testcase || CHR(10);
- end if;
- if in_status = wt_assert.C_PASS
- then
- l_out_str := l_out_str || ' ' || rpad(in_status,4) || ' ';
- else
- l_out_str := l_out_str || '#' || rpad(in_status,4) || '#';
- end if;
- if in_interval_msecs is not null
- then
- l_out_str := l_out_str || lpad(in_interval_msecs,4) || 'ms ';
- end if;
- if in_message is not null
- then
- l_out_str := l_out_str || in_message || '. ';
- end if;
- l_out_str := l_out_str || in_assertion || ' - ';
- if g_single_line_output
- then
- l_out_str := l_out_str || replace(replace(in_details,CHR(13),'\r'),CHR(10),'\n');
- else
- l_out_str := l_out_str || in_details;
- end if;
- return l_out_str;
-end format_test_result;
-
-------------------------------------------------------------
-procedure ad_hoc_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE)
-is
-begin
- p(format_test_result
- (in_assertion => in_assertion
- ,in_status => in_status
- ,in_details => in_details
- ,in_testcase => in_testcase
- ,in_message => in_message));
-end ad_hoc_result;
-
-------------------------------------------------------------
-procedure dbms_out
- (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER
- ,in_runner_name in wt_test_runs.runner_name%TYPE default null
- ,in_detail_level in number default 0
- ,in_summary_last in boolean default FALSE)
-is
-
- cursor c_main(in_test_run_id in number) is
- select * from wt_test_run_stats
- where test_run_id = in_test_run_id;
- g_test_run_statsNULL wt_test_run_stats%ROWTYPE;
-
-begin
-
- for buff in (
- select * from wt_test_runs
- where ( runner_name, start_dtm) in
- (select t2.runner_name, max(t2.start_dtm)
- from wt_test_runs t2
- where ( ( in_runner_name is not null
- and in_runner_name = t2.runner_name)
- OR in_runner_name is null )
- and t2.runner_owner = in_runner_owner
- group by t2.runner_name )
- order by start_dtm, runner_name )
- loop
-
- -- Load Test Run Record
- g_test_runs_rec := buff;
-
- -- Load the Stats Record
- g_test_run_stats_rec := g_test_run_statsNULL;
- open c_main(buff.id);
- fetch c_main into g_test_run_stats_rec;
- close c_main;
-
- -- Setup Display Order
- if in_summary_last
- then
- if in_detail_level >= 10
- then
- profile_out(in_detail_level >= 30);
- results_out(in_detail_level >= 20);
- end if;
- summary_out;
- else
- summary_out;
- if in_detail_level >= 10
- then
- results_out(in_detail_level >= 20);
- profile_out(in_detail_level >= 30);
- end if;
- end if;
-
- p('');
-
- end loop;
-
-end dbms_out;
-
-
-end wt_text_report;
diff --git a/src/core/wt_text_report.pks b/src/core/wt_text_report.pks
deleted file mode 100644
index 289240f..0000000
--- a/src/core/wt_text_report.pks
+++ /dev/null
@@ -1,58 +0,0 @@
-create or replace package wt_text_report authid definer
-as
-
- -- To report the latest result details for test runner:
- -- begin
- -- wt_text_report.dbms_out('TEST_RUNNER', FALSE, FALSE, TRUE, TRUE);
- -- end;
- -- /
-
- -- Turn this off to allow output across multiple lines of text
- g_single_line_output boolean := TRUE;
-
- -- DATE data type format for Report Header
- g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
-
- function format_test_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE
- ,in_interval_msecs in wt_results.interval_msecs%TYPE DEFAULT NULL)
- return varchar2;
-
- procedure ad_hoc_result
- (in_assertion in wt_results.assertion%TYPE
- ,in_status in wt_results.status%TYPE
- ,in_details in wt_results.details%TYPE
- ,in_testcase in wt_results.testcase%TYPE
- ,in_message in wt_results.message%TYPE);
-
--- "in_detail_level" settings for DBMS_OUT procedure:
--- * Less than 10 (including null) - No Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * 10 to 19 - Minimal Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * Failed assertion result details.
--- * Profiled source lines that were "not executed".
--- * 20 to 29 - Partial Full Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * All assertion result details.
--- * Profiled source lines that were "not executed".
--- * 30 or more - Full Detail
--- * Assertion results summary.
--- * Profiled lines summary.
--- * All assertion result details.
--- * All profiled source lines.
-
- procedure dbms_out
- (in_runner_owner in wt_test_runs.runner_owner%TYPE default USER
- ,in_runner_name in wt_test_runs.runner_name%TYPE default null
- ,in_detail_level in number default 0
- ,in_summary_last in boolean default FALSE);
-
-end wt_text_report;
diff --git a/src/core/wt_version.tab b/src/core/wt_version.tab
deleted file mode 100644
index 9dd0493..0000000
--- a/src/core/wt_version.tab
+++ /dev/null
@@ -1,21 +0,0 @@
-
---
--- Version Table Installation
---
-
-create table wt_version
- (install_dtm date
- ,action varchar2(15)
- ,text varchar2(15)
- ) pctfree 0;
-
-comment on table wt_version is 'Records the installed and upgraded versions.';
-comment on column wt_version.install_dtm is 'Date/Time the version that was installed/upgraded';
-comment on column wt_version.text is 'Name of the version that was installed/upgraded';
-
-insert into wt_version (install_dtm, action, text)
- values (sysdate, 'INSTALL', '1.1.0');
-
-commit;
-
-grant select on wt_version to public;
diff --git a/src/core/wtplsql.pkb b/src/core/wtplsql.pkb
deleted file mode 100644
index 554bcce..0000000
--- a/src/core/wtplsql.pkb
+++ /dev/null
@@ -1,612 +0,0 @@
-create or replace package body wtplsql
-as
-
- C_KEEP_NUM_RECS number := 20;
-
- g_test_runs_rec wt_test_runs%ROWTYPE;
-
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400);
- test_all_aa test_all_aa_type;
- wtplsql_skip_test boolean := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-----------------------
--- Private Procedures
-----------------------
-
-
-------------------------------------------------------------
--- This procedure is separated for internal WTPLSQL testing
-procedure check_runner
-is
- l_package_check number;
-begin
- -- These RAISEs can be captured because the Test Runs Record is set.
- -- Check for NULL Runner Name
- if g_test_runs_rec.runner_name is null
- then
- raise_application_error (-20001, 'RUNNER_NAME is null');
- end if;
- -- Check for Valid Runner Name
- select count(*) into l_package_check
- from all_arguments
- where owner = USER
- and object_name = 'WTPLSQL_RUN'
- and package_name = g_test_runs_rec.runner_name
- and argument_name is null
- and position = 1
- and sequence = 0;
- if l_package_check != 1
- then
- raise_application_error (-20002, 'RUNNER_NAME "' ||
- g_test_runs_rec.runner_name ||
- '.WTPLSQL_RUN" is not valid');
- end if;
-end check_runner;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_check_runner
- is
- l_save_test_runs_rec wt_test_runs%ROWTYPE := g_test_runs_rec;
- l_msg_in varchar2(4000);
- l_err_in varchar2(4000);
- -------------------------------------- WTPLSQL Testing --
- procedure l_test_sqlerrm is begin
- -- Restore the G_TEST_RUNS_REC
- g_test_runs_rec := l_save_test_runs_rec;
- wt_assert.eq
- (msg_in => l_msg_in
- ,check_this_in => SQLERRM
- ,against_this_in => l_err_in);
- end l_test_sqlerrm;
- begin
- -------------------------------------- WTPLSQL Testing --
- -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
- -- procedure in this package.
- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1';
- begin
- g_test_runs_rec.runner_name := '';
- l_msg_in := 'Null RUNNER_NAME';
- l_err_in := 'ORA-20001: RUNNER_NAME is null';
- check_runner;
- l_test_sqlerrm;
- exception when others then
- l_test_sqlerrm;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2';
- begin
- g_test_runs_rec.runner_name := 'BOGUS';
- l_msg_in := 'Invalid RUNNER_NAME';
- l_err_in := 'ORA-20002: RUNNER_NAME "BOGUS.WTPLSQL_RUN" is not valid';
- check_runner;
- l_test_sqlerrm;
- exception when others then
- l_test_sqlerrm;
- end;
- end t_check_runner;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure insert_test_run
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_wt_test_runs_recNULL wt_test_runs%ROWTYPE;
-begin
- if g_test_runs_rec.id is null
- then
- return;
- end if;
- g_test_runs_rec.end_dtm := systimestamp;
- insert into wt_test_runs values g_test_runs_rec;
- g_test_runs_rec := l_wt_test_runs_recNULL;
- COMMIT;
-exception
- when OTHERS
- then
- DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace);
-end insert_test_run;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_insert_test_run
- is
- -------------------------------------- WTPLSQL Testing --
- TYPE l_dbmsout_buff_type is table of varchar2(32767);
- l_dbmsout_buff l_dbmsout_buff_type := l_dbmsout_buff_type(1);
- l_test_runs_rec wt_test_runs%ROWTYPE;
- l_dbmsout_line varchar2(32767);
- l_dbmsout_stat number;
- l_num_recs number;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1';
- l_test_runs_rec := g_test_runs_rec;
- insert_test_run;
- g_test_runs_rec := l_test_runs_rec;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || l_test_runs_rec.id,
- against_value_in => 1);
- -------------------------------------- WTPLSQL Testing --
- delete from wt_test_runs
- where id = l_test_runs_rec.id;
- COMMIT;
- wt_assert.eqqueryvalue (
- msg_in => 'Records After Delete',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || l_test_runs_rec.id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'INSERT_TEST_RUN Sad Path 1';
- -- Save/Clear the DBMS_OUPTUT Buffer
- loop
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- exit when l_dbmsout_stat != 0;
- l_dbmsout_buff(l_dbmsout_buff.COUNT) := l_dbmsout_line;
- l_dbmsout_buff.extend;
- end loop;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- -------------------------------------- WTPLSQL Testing --
- select count(*) into l_num_recs from wt_test_runs;
- l_test_runs_rec := g_test_runs_rec;
- g_test_runs_rec.start_dtm := null;
- insert_test_run;
- g_test_runs_rec := l_test_runs_rec;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records should stay the same',
- check_query_in => 'select count(*) from wt_test_runs',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- DBMS_OUTPUT.GET_LINE (
- line => l_dbmsout_line,
- status => l_dbmsout_stat);
- wt_assert.eq (
- msg_in => 'DBMS_OUTPUT Status',
- check_this_in => l_dbmsout_stat,
- against_this_in => 0);
- -------------------------------------- WTPLSQL Testing --
- if wt_assert.last_pass
- then
- wt_assert.isnotnull (
- msg_in => 'DBMS_OUTPUT Line',
- check_this_in => l_dbmsout_line);
- wt_assert.this (
- msg_in => 'Confirm DBMS_OUTPUT Line text',
- check_this_in => (l_dbmsout_line like 'ORA-01400: cannot insert NULL into ("WTP"."WT_TEST_RUNS"."START_DTM")%'));
- -------------------------------------- WTPLSQL Testing --
- if not wt_assert.last_pass
- then
- -- No match, put the line back into DBMS_OUTPUT buffer and end this.
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_line);
- end if;
- end if;
- -------------------------------------- WTPLSQL Testing --
- -- Restore the DBMS_OUPTUT Buffer
- for i in 1 .. l_dbmsout_buff.COUNT - 1
- loop
- DBMS_OUTPUT.PUT_LINE(l_dbmsout_buff(i));
- end loop;
- wt_assert.isnotnull (
- msg_in => 'l_dbmsout_buff.COUNT - 1',
- check_this_in => l_dbmsout_buff.COUNT - 1);
- end t_insert_test_run;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
----------------------
--- Public Procedures
----------------------
-
-
-------------------------------------------------------------
-function show_version
- return varchar2
-is
- ret_str wt_version.text%TYPE;
-begin
- select max(t1.text) into ret_str
- from wt_version t1
- where t1.install_dtm = (select max(t2.install_dtm)
- from wt_version t2);
- return ret_str;
-exception when NO_DATA_FOUND
-then
- return '';
-end show_version;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_show_version
- is
- existing_version wt_version.text%TYPE;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Show Version Happy Path';
- existing_version := show_version;
- wt_assert.isnotnull (
- msg_in => 'Test Existing Version',
- check_this_in => existing_version);
- -------------------------------------- WTPLSQL Testing --
- insert into wt_version (install_dtm, action, text)
- values (to_date('31-DEC-4000','DD-MON-YYYY'), 'TESTING', 'TESTING');
- wt_assert.eq (
- msg_in => 'Test New Version',
- check_this_in => show_version,
- against_this_in => 'TESTING');
- -------------------------------------- WTPLSQL Testing --
- rollback;
- wt_assert.eq (
- msg_in => 'Return to Existing Version',
- check_this_in => show_version,
- against_this_in => existing_version);
- end t_show_version;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure test_run
- (in_package_name in varchar2)
-is
- l_test_runs_rec_NULL wt_test_runs%ROWTYPE;
- l_error_stack varchar2(32000);
- procedure concat_err_message is begin
- if g_test_runs_rec.error_message is not null
- then
- g_test_runs_rec.error_message := substr(l_error_stack || CHR(10)||
- g_test_runs_rec.error_message
- ,1,4000);
- else
- g_test_runs_rec.error_message := l_error_stack;
- end if;
- end concat_err_message;
-begin
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- -- This will avoid running the TEST_RUN procedure for some self-tests
- if wtplsql_skip_test
- then
- test_all_aa(in_package_name) := 'X';
- return;
- end if;
- --DBMS_OUTPUT.PUT_LINE('DEBUG WTPLSQL selftest Enabled for Test Runner "' || in_package_name || '"');
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- -- Reset the Test Runs Record before checking anything
- g_test_runs_rec := l_test_runs_rec_NULL;
- g_test_runs_rec.id := wt_test_runs_seq.nextval;
- g_test_runs_rec.start_dtm := systimestamp;
- g_test_runs_rec.runner_owner := USER;
- g_test_runs_rec.runner_name := in_package_name;
- g_test_runs_rec.error_message := '';
- check_runner;
- -- Initialize
- delete_runs(in_runner_owner => g_test_runs_rec.runner_owner -- Autonomous Transaction COMMIT
- ,in_runner_name => g_test_runs_rec.runner_name);
- wt_assert.reset_globals;
- wt_test_run_stat.initialize;
- wt_result.initialize(g_test_runs_rec.id);
- wt_profiler.initialize(in_test_run_id => g_test_runs_rec.id,
- in_runner_name => g_test_runs_rec.runner_name,
- out_dbout_owner => g_test_runs_rec.dbout_owner,
- out_dbout_name => g_test_runs_rec.dbout_name,
- out_dbout_type => g_test_runs_rec.dbout_type,
- out_trigger_offset => g_test_runs_rec.trigger_offset,
- out_profiler_runid => g_test_runs_rec.profiler_runid,
- out_error_message => l_error_stack);
- concat_err_message;
- -- Call the Test Runner
- begin
- execute immediate 'BEGIN ' || in_package_name || '.WTPLSQL_RUN; END;';
- exception
- when OTHERS
- then
- l_error_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- concat_err_message;
- end;
-
- -- Finalize
- insert_test_run; -- Autonomous Transaction COMMIT
- wt_profiler.finalize; -- Autonomous Transaction COMMIT
- wt_result.finalize; -- Autonomous Transaction COMMIT
- wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT
-
-exception
- when OTHERS
- then
- l_error_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- if g_test_runs_rec.id is null
- then
- DBMS_OUTPUT.PUT_LINE(l_error_stack);
- DBMS_OUTPUT.PUT_LINE('---------------------------');
- DBMS_OUTPUT.PUT_LINE(g_test_runs_rec.error_message);
- else
- concat_err_message;
- insert_test_run; -- Autonomous Transaction COMMIT
- end if;
- wt_profiler.finalize; -- Autonomous Transaction COMMIT
- wt_result.finalize; -- Autonomous Transaction COMMIT
- wt_test_run_stat.finalize; -- Autonomous Transaction COMMIT
-
-end test_run;
-
---==============================================================--
--- No Unit Test for TEST_RUN.
--- Too complicated because testing occurs while the TEST_RUN
--- procedure is executing. This also prevents 100% profiling.
---==============================================================--
-
-
-------------------------------------------------------------
-procedure test_all
-is
- TYPE runners_nt_type is table of varchar2(128);
- l_runners_nt runners_nt_type;
-begin
- select package_name
- bulk collect into l_runners_nt
- from user_arguments t1
- where object_name = 'WTPLSQL_RUN'
- and position = 1
- and sequence = 0
- and data_type is null
- and not exists (
- select 'x' from user_arguments t2
- where t2.object_name = t1.object_name
- and t2.position > t1.position
- and t2.sequence > t1.sequence
- and ( t2.overload is null
- OR t2.overload = t1.overload)
- );
- for i in 1 .. l_runners_nt.COUNT
- loop
- test_run(l_runners_nt(i));
- end loop;
-end test_all;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_test_all
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'TEST_ALL Happy Path';
- test_all_aa.DELETE;
- wtplsql_skip_test := TRUE;
- -- TEST_ALL will populate the test_all_aa array
- wtplsql.test_all;
- wtplsql_skip_test := FALSE;
- -- This package should be in the test_all_aa array
- -------------------------------------- WTPLSQL Testing --
- wt_assert.this (
- msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')',
- check_this_in => test_all_aa.EXISTS('WTPLSQL'));
- end t_test_all;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure delete_runs
- (in_test_run_id in number)
-is
- PRAGMA AUTONOMOUS_TRANSACTION;
-begin
- -- Profiler delete must be first because it contains a
- -- PRAGMA AUTONOMOUS_TRANSACTION
- wt_test_run_stat.delete_records(in_test_run_id);
- wt_profiler.delete_records(in_test_run_id);
- wt_result.delete_records(in_test_run_id);
- delete from wt_test_runs where id = in_test_run_id;
- COMMIT;
-end delete_runs;
-
-procedure delete_runs
- (in_runner_owner in varchar2
- ,in_runner_name in varchar2)
-is
- num_recs number;
-begin
- num_recs := 1;
- for buf2 in (select id from wt_test_runs
- where runner_owner = in_runner_owner
- and runner_name = in_runner_name
- order by start_dtm desc, id desc)
- loop
- -- Keep the last 20 rest runs for this USER
- if num_recs > C_KEEP_NUM_RECS
- then
- -- Autonomous Transaction COMMIT
- delete_runs(buf2.id);
- end if;
- num_recs := num_recs + 1;
- end loop;
-end delete_runs;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_delete_run_id
- is
- l_num_recs number;
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- -- DELETE_RECORDS has already run when we arrive here.
- -- Cleanup from previous test
- delete from wt_test_runs
- where id between 0-C_KEEP_NUM_RECS and 0-1;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1';
- select count(*)
- into l_num_recs
- from wt_test_runs
- where runner_owner = USER
- and runner_name = g_test_runs_rec.runner_name;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull (
- msg_in => 'Number of Records Before Insert',
- check_this_in => l_num_recs);
- wt_assert.this (
- msg_in => 'Number of Records Before Insert <= ' || C_KEEP_NUM_RECS,
- check_this_in => l_num_recs <= C_KEEP_NUM_RECS);
- -------------------------------------- WTPLSQL Testing --
- insert into wt_test_runs values g_test_runs_rec;
- COMMIT;
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records After Insert',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || g_test_runs_rec.id,
- against_value_in => 1);
- delete_runs(g_test_runs_rec.id); -- Autonomous Transaction
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Number of Records After Delete',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where id = ' || g_test_runs_rec.id,
- against_value_in => 0);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Happy Path 2';
- wt_assert.eqqueryvalue (
- msg_in => 'Confirm number of records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- for i in 1 .. C_KEEP_NUM_RECS
- loop
- insert into wt_test_runs
- (id, start_dtm, runner_owner, runner_name)
- values
- (0-i, sysdate-7000-i, USER, g_test_runs_rec.runner_name);
- end loop;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Check Added ' || C_KEEP_NUM_RECS || ' records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs + C_KEEP_NUM_RECS);
- delete_runs(USER, g_test_runs_rec.runner_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Check number of records reduced',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => C_KEEP_NUM_RECS);
- delete from wt_test_runs
- where id between 0-C_KEEP_NUM_RECS and 0-1;
- commit;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue (
- msg_in => 'Confirm original number of records',
- check_query_in => 'select count(*) from wt_test_runs' ||
- ' where runner_owner = ''' || USER ||
- ''' and runner_name = ''' || g_test_runs_rec.runner_name ||
- '''',
- against_value_in => l_num_recs);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1';
- begin
- delete_runs(-9995); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'Delete Runs(-9995)',
- check_this_in => l_err_stack);
- end t_delete_run_id;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
---==============================================================--
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_test_runs_rec_and_table
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'TEST_RUNS_REC_AND_TABLE Happy Path';
- -- This Test Case runs in the EXECUTE IMMEDAITE in the TEST_RUN
- -- procedure in this package.
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.id'
- ,check_this_in => g_test_runs_rec.id);
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.start_dtm'
- ,check_this_in => g_test_runs_rec.start_dtm);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnotnull
- (msg_in => 'g_test_runs_rec.runner_owner'
- ,check_this_in => g_test_runs_rec.runner_owner);
- wt_assert.eq
- (msg_in => 'g_test_runs_rec.runner_name'
- ,check_this_in => g_test_runs_rec.runner_name
- ,against_this_in => 'WTPLSQL');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_owner'
- ,check_this_in => g_test_runs_rec.dbout_owner);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_name'
- ,check_this_in => g_test_runs_rec.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.dbout_type'
- ,check_this_in => g_test_runs_rec.dbout_type);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.profiler_runid'
- ,check_this_in => g_test_runs_rec.profiler_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.end_dtm'
- ,check_this_in => g_test_runs_rec.end_dtm);
- wt_assert.isnull
- (msg_in => 'g_test_runs_rec.error_message'
- ,check_this_in => g_test_runs_rec.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eqqueryvalue
- (msg_in => 'TEST_RUNS Record for this TEST_RUN'
- ,check_query_in => 'select count(*) from WT_TEST_RUNS' ||
- ' where id = ''' || g_test_runs_rec.id || ''''
- ,against_value_in => 0);
- end t_test_runs_rec_and_table;
- ----------------------------------------
- procedure WTPLSQL_RUN
- is
- begin
- -------------------------------------- WTPLSQL Testing --
- t_show_version;
- t_check_runner;
- t_insert_test_run;
- t_test_all;
- t_delete_run_id;
- t_test_runs_rec_and_table;
- end;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
---==============================================================--
-
-
-end wtplsql;
diff --git a/src/core/wtplsql.pks b/src/core/wtplsql.pks
deleted file mode 100644
index 83e31cc..0000000
--- a/src/core/wtplsql.pks
+++ /dev/null
@@ -1,36 +0,0 @@
-create or replace package wtplsql authid current_user
-as
- -- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
-
- function show_version
- return varchar2;
-
- procedure test_run
- (in_package_name in varchar2);
-
- procedure test_all;
-
- procedure delete_runs
- (in_test_run_id in number);
-
- procedure delete_runs
- (in_runner_owner in varchar2
- ,in_runner_name in varchar2);
-
- -- WtPLSQL Self Test Procedures
- --
- -- alter system set PLSQL_CCFLAGS =
- -- 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
- -- scope=BOTH;
- --
- -- begin
- -- dbms_utility.compile_schema('WTP',TRUE,FALSE);
- -- end;
- -- /
- --
- $IF $$WTPLSQL_SELFTEST
- $THEN
- procedure WTPLSQL_RUN;
- $END
-
-end wtplsql;
diff --git a/src/demo/README.txt b/src/demo/README.txt
deleted file mode 100644
index e0742c5..0000000
--- a/src/demo/README.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-
- White Box PL/SQL Testing
- src/demo/README.txt
-
-FILE DESCRIPTION
------------------------- ----------------------------
-common_setup.sql Common Installation Settings
-install.sql Installation Script
-installO.sql Sample Installation Log
-Package-Test.sql Package Test Example
-Table-Test.sql Table Test Example
-Test-Runner.sql Test Runner Example
-Trigger-Test.sql Trigger Test Example
-Type-Test.sql Type Test Example
-uninstall.sql Uninstall Script
-ut_betwnstr.sql utPLSQL 2.3 ut_betwnstr Example
-ut_calc_secs_between.sql utPLSQL 2.3 ut_calc_secs_between Example
-ut_str.sql utPLSQL 2.3 ut_str Example
-ut_truncit.sql utPLSQL 2.3 ut_truncit Example
-
-
-Install Procedure:
-------------------
-1) sqlplus SYS/password as SYSDBA @install
-2) exit
-3) Compare install.LST to installO.LST
-
-
-UnInstall Procedure:
---------------------
-1) sqlplus SYS/password as SYSDBA @uninstall
-2) exit
-3) Compare uninstall.LST to uninstallO.LST
diff --git a/src/demo/common_setup.sql b/src/demo/common_setup.sql
deleted file mode 100644
index d567441..0000000
--- a/src/demo/common_setup.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-
---
--- Core Installation
---
-
--- Enable SQL*Plus Variables
-set define "&"
-set concat "."
-
-accept schema_owner CHAR default 'wtp_demo' -
-prompt 'Enter Schema Name (WTP_DEMO): '
diff --git a/src/demo/install.sql b/src/demo/install.sql
deleted file mode 100644
index bd97e5d..0000000
--- a/src/demo/install.sql
+++ /dev/null
@@ -1,118 +0,0 @@
-
---
--- Demo Installation
---
-
-----------------------------------------
--- Setup
-----------------------------------------
-
--- Capture output
-spool install
-set serveroutput on size unlimited format truncated
-
--- Shared Setup Script
-@common_setup.sql
-
-WHENEVER SQLERROR exit SQL.SQLCODE
-
-begin
- if USER not in ('SYS','SYSTEM')
- then
- raise_application_error (-20000,
- 'Not logged in as SYS or SYSTEM');
- end if;
-end;
-/
-
-WHENEVER SQLERROR continue
-
-----------------------------------------
--- Create the schema owner.
-----------------------------------------
-
-create user &schema_owner. identified by &schema_owner.
- default tablespace users
- quota 1M on users
- temporary tablespace temp;
-
-grant create session to &schema_owner.;
-grant create type to &schema_owner.;
-grant create sequence to &schema_owner.;
-grant create table to &schema_owner.;
-grant create trigger to &schema_owner.;
-grant create view to &schema_owner.;
-grant create procedure to &schema_owner.;
-
-begin
- $IF $$WTPLSQL_ENABLE
- $THEN
- dbms_output.put_line('WTPLSQL_ENABLE is TRUE');
- $END
- dbms_output.put_line('Check WTPLSQL_ENABLE is Done.');
-end;
-/
-
-WHENEVER SQLERROR exit SQL.SQLCODE
-
-----------------------------------------
--- Connect as SCHEMA_OWNER
-----------------------------------------
-
-connect &schema_owner./&schema_owner.
-set serveroutput on size unlimited format truncated
-
-begin
- if USER != upper('&schema_owner')
- then
- raise_application_error (-20000,
- 'Not logged in as &schema_owner');
- end if;
-end;
-/
-
-WHENEVER SQLERROR continue
-
-set serveroutput on size unlimited format word_wrapped
-
-select wtplsql.show_version from dual;
-
-begin
- wt_assert.eq(msg_in => 'Ad-Hoc Test'
- ,check_this_in => 1
- ,against_this_in => '1');
-end;
-/
-
-----------------------------------------
--- Test Installation
-----------------------------------------
-
-prompt Install Package Test
-@Package-Test.sql
-
-prompt Install Table Test
-@Table-Test.sql
-
-prompt Install Test Runner
-@Test-Runner.sql
-
-prompt Install Trigger Test
-@Trigger-Test.sql
-
-prompt Install Type Test
-@Type-Test.sql
-
-prompt utPLSQL 2.3 ut_betwnstr Example
-@ut_betwnstr.sql
-
-prompt utPLSQL 2.3 ut_calc_secs_between Example
-@ut_calc_secs_between.sql
-
-prompt utPLSQL 2.3 ut_str Example
-@ut_str.sql
-
-prompt utPLSQL 2.3 ut_truncit Example
-@ut_truncit.sql
-
-spool off
diff --git a/src/demo/installO.LST b/src/demo/installO.LST
deleted file mode 100644
index 459659e..0000000
--- a/src/demo/installO.LST
+++ /dev/null
@@ -1,687 +0,0 @@
-
-PL/SQL procedure successfully completed.
-
-old:create user &schema_owner. identified by &schema_owner.
- default tablespace users
- quota 1M on users
- temporary tablespace temp
-new:create user wtp_demo identified by wtp_demo
- default tablespace users
- quota 1M on users
- temporary tablespace temp
-
-User WTP_DEMO created.
-
-old:grant create session to &schema_owner.
-new:grant create session to wtp_demo
-
-Grant succeeded.
-
-old:grant create type to &schema_owner.
-new:grant create type to wtp_demo
-
-Grant succeeded.
-
-old:grant create sequence to &schema_owner.
-new:grant create sequence to wtp_demo
-
-Grant succeeded.
-
-old:grant create table to &schema_owner.
-new:grant create table to wtp_demo
-
-Grant succeeded.
-
-old:grant create trigger to &schema_owner.
-new:grant create trigger to wtp_demo
-
-Grant succeeded.
-
-old:grant create view to &schema_owner.
-new:grant create view to wtp_demo
-
-Grant succeeded.
-
-old:grant create procedure to &schema_owner.
-new:grant create procedure to wtp_demo
-
-Grant succeeded.
-
-WTPLSQL_ENABLE is TRUE
-Check WTPLSQL_ENABLE is Done.
-
-
-PL/SQL procedure successfully completed.
-
-Connected.
-old:begin
- if USER != upper('&schema_owner')
- then
- raise_application_error (-20000,
- 'Not logged in as &schema_owner');
- end if;
-end;
-
-new:begin
- if USER != upper('wtp_demo')
- then
- raise_application_error (-20000,
- 'Not logged in as wtp_demo');
- end if;
-end;
-
-PL/SQL procedure successfully completed.
-
-
-SHOW_VERSION
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-1.1.0
-
-PASS Ad-Hoc Test. EQ - Expected "1" and got "1"
-
-
-PL/SQL procedure successfully completed.
-
-Install Package Test
-
-Package TEST_DBMS_OUTPUT compiled
-
-
-Package Body TEST_DBMS_OUTPUT compiled
-
-
-Package Body TEST_DBMS_OUTPUT compiled
-
-
- wtPLSQL 1.1.0 - Run ID 29: 29-Jun-2018 01:04:14 PM
-
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 10 Failed Assertions: 0
- Average Interval msec: 10 Error Assertions: 0
- Maximum Interval msec: 10 Test Yield: 100.00%
- Total Run Time (sec): 0.1
-
- - WTP_DEMO.TEST_DBMS_OUTPUT Test Result Details (Test Run ID 29)
------------------------------------------------------------
- PASS 10ms Test 1. EQ - Expected "Test 1" and got "Test 1"
-
-
-
-PL/SQL procedure successfully completed.
-
-
-Package Body TEST_DBMS_OUTPUT compiled
-
-Test 1
-
-
-PL/SQL procedure successfully completed.
-
-
- wtPLSQL 1.1.0 - Run ID 30: 29-Jun-2018 01:04:15 PM
-
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.0
-
- *** Test Runner Error ***
-ORA-20000: Fault insertion exception
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 10
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 18
-ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 311
-
-
-
-
-PL/SQL procedure successfully completed.
-
-
-Package Body TEST_DBMS_OUTPUT compiled
-
-This should be preserved.
-
-
-PL/SQL procedure successfully completed.
-
-
- wtPLSQL 1.1.0 - Run ID 31: 29-Jun-2018 01:04:15 PM
-
- Test Results for WTP_DEMO.TEST_DBMS_OUTPUT
- Total Test Cases: 0 Total Assertions: 0
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 0 Test Yield: %
- Total Run Time (sec): 0.0
-
- *** Test Runner Error ***
-ORA-20000: ORA-20000: Fault insertion exception
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 21
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 47
-ORA-06512: at "WTP_DEMO.TEST_DBMS_OUTPUT", line 53
-ORA-06512: at line 1
-ORA-06512: at "WTP.WTPLSQL", line 311
-
-
-
-
-PL/SQL procedure successfully completed.
-
-Install Table Test
-
-Error starting at line : 2 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Table-Test.sql
-In command -
-drop table table_test_tab
-Error report -
-ORA-00942: table or view does not exist
-00942. 00000 - "table or view does not exist"
-*Cause:
-*Action:
-
-Table TABLE_TEST_TAB created.
-
-
-Package TABLE_TEST_PKG compiled
-
-
-Package Body TABLE_TEST_PKG compiled
-
-
- wtPLSQL 1.1.0 - Run ID 32: 29-Jun-2018 01:04:15 PM
-
- Test Results for WTP_DEMO.TABLE_TEST_PKG
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 2 Failed Assertions: 0
- Average Interval msec: 5 Error Assertions: 0
- Maximum Interval msec: 8 Test Yield: 100.00%
- Total Run Time (sec): 0.0
-
- - WTP_DEMO.TABLE_TEST_PKG Test Result Details (Test Run ID 32)
------------------------------------------------------------
- ---- Test Case: Happy Path 1
- PASS 8ms Successful Insert. RAISES/THROWS - No exception was expected. Exception raised was "". Exception raised by: "insert into table_test_tab (id, name) values (1, 'TEST1')".
- PASS 2ms Confirm l_rec.name. EQ - Expected "TEST1" and got "TEST1"
-
-
-
-PL/SQL procedure successfully completed.
-
-Install Test Runner
-
-Package SIMPLE_TEST_RUNNER compiled
-
-
-Package Body SIMPLE_TEST_RUNNER compiled
-
-
-PL/SQL procedure successfully completed.
-
-
- wtPLSQL 1.1.0 - Run ID 33: 29-Jun-2018 01:04:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 4 Failed Assertions: 0
- Average Interval msec: 4 Error Assertions: 0
- Maximum Interval msec: 4 Test Yield: 100.00%
- Total Run Time (sec): 0.0
-
-
-
-PL/SQL procedure successfully completed.
-
-
- wtPLSQL 1.1.0 - Run ID 33: 29-Jun-2018 01:04:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 4 Failed Assertions: 0
- Average Interval msec: 4 Error Assertions: 0
- Maximum Interval msec: 4 Test Yield: 100.00%
- Total Run Time (sec): 0.0
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 33)
------------------------------------------------------------
- PASS 4ms Ad-Hoc Test. EQ - Expected "1" and got "1"
-
-
-
-PL/SQL procedure successfully completed.
-
-
-Package Body SIMPLE_TEST_RUNNER compiled
-
-
- wtPLSQL 1.1.0 - Run ID 34: 29-Jun-2018 01:04:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 2 Total Assertions: 4
- Minimum Interval msec: 0 Failed Assertions: 1
- Average Interval msec: 0 Error Assertions: 0
- Maximum Interval msec: 1 Test Yield: 75.00%
- Total Run Time (sec): 0.0
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 34)
------------------------------------------------------------
- ---- Test Case: My Test Case A
- PASS 1ms Ad-Hoc Test1. EQ - Expected "1" and got "1"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "2" and got "2"
- ---- Test Case: My Test Case B
-#FAIL# 0ms Ad-Hoc Test1. EQ - Expected " 4" and got "4"
- PASS 0ms Ad-Hoc Test2. EQ - Expected "5" and got "5"
-
-
-
-PL/SQL procedure successfully completed.
-
-
-Package Body SIMPLE_TEST_RUNNER compiled
-
-
- wtPLSQL 1.1.0 - Run ID 35: 29-Jun-2018 01:04:16 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 230 Failed Assertions: 0
- Average Interval msec: 230 Error Assertions: 0
- Maximum Interval msec: 230 Test Yield: 100.00%
- Total Run Time (sec): 0.2
-
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
- Ignored Lines: 0 Total Profiled Lines: 3
- Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 21 Unknown Lines: 1
- Maximum LineExec usec: 41 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
-
-
-PL/SQL procedure successfully completed.
-
-
-Package Body SIMPLE_TEST_RUNNER compiled
-
-
- wtPLSQL 1.1.0 - Run ID 36: 29-Jun-2018 01:04:17 PM
-
- Test Results for WTP_DEMO.SIMPLE_TEST_RUNNER
- Total Test Cases: 1 Total Assertions: 1
- Minimum Interval msec: 285 Failed Assertions: 0
- Average Interval msec: 285 Error Assertions: 0
- Maximum Interval msec: 285 Test Yield: 100.00%
- Total Run Time (sec): 0.3
-
- Code Coverage for PACKAGE BODY WTP_DEMO.SIMPLE_TEST_RUNNER
- Ignored Lines: 4 Total Profiled Lines: 8
- Excluded Lines: 0 Total Executed Lines: 3
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 1 Unknown Lines: 1
- Maximum LineExec usec: 2 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER Test Result Details (Test Run ID 36)
------------------------------------------------------------
- ---- Test Case: My Test Case
- PASS 285ms Ad-Hoc Test. EQ - Expected "5" and got "5"
-
- - WTP_DEMO.SIMPLE_TEST_RUNNER PACKAGE BODY Code Coverage Details (Test Run ID 36)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 4 UNKN 0 1 1 1 function add2 (in_val1 number, in_val2 number) return number is
- 7 EXEC 1 2 2 2 l_result := in_val1 + in_val2;
- 8 EXEC 1 0 0 0 return l_result;
- 9 EXEC 1 2 2 2 end add2;
- 10 IGNR 0 3 3 3 procedure wtplsql_run is begin --%WTPLSQL_begin_ignore_lines%--
- 11 IGNR 2 45 2 43 wt_assert.g_testcase := 'My Test Case';
- 12 IGNR 1 105 1 104 wt_assert.eq(msg_in => 'Ad-Hoc Test'
- 15 IGNR 1 1 1 1 end wtplsql_run; --%WTPLSQL_end_ignore_lines%--
-
-
-
-PL/SQL procedure successfully completed.
-
-Install Trigger Test
-
-Error starting at line : 2 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Trigger-Test.sql
-In command -
-drop table trigger_test_tab
-Error report -
-ORA-00942: table or view does not exist
-00942. 00000 - "table or view does not exist"
-*Cause:
-*Action:
-
-Error starting at line : 4 File @ C:\Users\Duane\Documents\GitHub\wtPLSQL\src\demo\Trigger-Test.sql
-In command -
-drop sequence trigger_test_seq
-Error report -
-ORA-02289: sequence does not exist
-02289. 00000 - "sequence does not exist"
-*Cause: The specified sequence does not exist, or the user does
- not have the required privilege to perform this operation.
-*Action: Make sure the sequence name is correct, and that you have
- the right to perform the desired operation on this sequence.
-
-Sequence TRIGGER_TEST_SEQ created.
-
-
-Table TRIGGER_TEST_TAB created.
-
-
-Trigger TRIGGER_TEST_BIR compiled
-
-
-Package TRIGGER_TEST_PKG compiled
-
-
-Package Body TRIGGER_TEST_PKG compiled
-
-
- wtPLSQL 1.1.0 - Run ID 37: 29-Jun-2018 01:04:18 PM
-
- Test Results for WTP_DEMO.TRIGGER_TEST_PKG
- Total Test Cases: 1 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 196 Error Assertions: 0
- Maximum Interval msec: 585 Test Yield: 100.00%
- Total Run Time (sec): 0.6
-
- Code Coverage for TRIGGER WTP_DEMO.TRIGGER_TEST_BIR
- Ignored Lines: 0 Total Profiled Lines: 5
- Excluded Lines: 0 Total Executed Lines: 4
- Minimum LineExec usec: 2 Not Executed Lines: 0
- Average LineExec usec: 1355 Unknown Lines: 1
- Maximum LineExec usec: 5387 Code Coverage: 100.00%
- Trigger Source Offset: 3
-
- - WTP_DEMO.TRIGGER_TEST_PKG Test Result Details (Test Run ID 37)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 585ms l_rec.id. ISNOTNULL - Expected NOT NULL and got "1"
- PASS 4ms l_rec.name. EQ - Expected "Test1" and got "Test1"
- PASS 0ms l_rec.created_dtm. ISNOTNULL - Expected NOT NULL and got "29-JUN-18"
-
- - WTP_DEMO.TRIGGER_TEST_BIR TRIGGER Code Coverage Details (Test Run ID 37)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 4 UNKN 0 5 5 5 begin
- 5 EXEC 1 5 5 5 if :new.id is null
- 7 EXEC 1 5387 5387 5387 :new.id := trigger_test_seq.nextval;
- 9 EXEC 1 25 2 23 :new.created_dtm := sysdate;
- 10 EXEC 1 3 3 3 end;
-
-
-
-PL/SQL procedure successfully completed.
-
-Install Type Test
-
-Type SIMPLE_TEST_OBJ_TYPE compiled
-
-
-Type Body SIMPLE_TEST_OBJ_TYPE compiled
-
-
-Package TEST_SIMPLE_OBJECT compiled
-
-
-Package Body TEST_SIMPLE_OBJECT compiled
-
-
- wtPLSQL 1.1.0 - Run ID 38: 29-Jun-2018 01:04:19 PM
-
- Test Results for WTP_DEMO.TEST_SIMPLE_OBJECT
- Total Test Cases: 1 Total Assertions: 2
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 202 Error Assertions: 0
- Maximum Interval msec: 404 Test Yield: 100.00%
- Total Run Time (sec): 0.4
-
- Code Coverage for TYPE BODY WTP_DEMO.SIMPLE_TEST_OBJ_TYPE
- Ignored Lines: 0 Total Profiled Lines: 10
- Excluded Lines: 1 Total Executed Lines: 4
- Minimum LineExec usec: 1 Not Executed Lines: 4
- Average LineExec usec: 1 Unknown Lines: 1
- Maximum LineExec usec: 4 Code Coverage: 50.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.TEST_SIMPLE_OBJECT Test Result Details (Test Run ID 38)
------------------------------------------------------------
- ---- Test Case: Constructor Happy Path 1
- PASS 404ms Object MINIMUM_VALUE. ISNULL - Expected NULL and got ""
- PASS 0ms Object OBSERVATIONS. EQ - Expected "0" and got "0"
-
- - WTP_DEMO.SIMPLE_TEST_OBJ_TYPE TYPE BODY Code Coverage Details (Test Run ID 38)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 2 UNKN 0 3 3 3 CONSTRUCTOR FUNCTION simple_test_obj_type
- 7 EXEC 1 1 1 1 minimum_value := null;
- 8 EXEC 1 1 1 1 observations := 0;
- 9 EXEC 1 3 3 3 return;
- 10 EXEC 1 4 4 4 end simple_test_obj_type;
- 11#NOTX# 0 0 0 0 member procedure add_observation
- 16#NOTX# 0 0 0 0 If minimum_value is null then minimum_value := in_observation;
- 17#NOTX# 0 0 0 0 else minimum_value := least(minimum_value, in_observation);
- 19#NOTX# 0 0 0 0 observations := observations + 1;
- 20 EXCL 0 0 0 0 end add_observation;
-
-
-
-PL/SQL procedure successfully completed.
-
-utPLSQL 2.3 ut_betwnstr Example
-
-Function BETWNSTR compiled
-
-
-Package UT_BETWNSTR compiled
-
-
-Package Body UT_BETWNSTR compiled
-
-
- wtPLSQL 1.1.0 - Run ID 39: 29-Jun-2018 01:04:20 PM
-
- Test Results for WTP_DEMO.UT_BETWNSTR
- Total Test Cases: 0 Total Assertions: 5
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 54 Error Assertions: 0
- Maximum Interval msec: 272 Test Yield: 100.00%
- Total Run Time (sec): 0.3
-
- Code Coverage for FUNCTION WTP_DEMO.BETWNSTR
- Ignored Lines: 0 Total Profiled Lines: 3
- Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 1 Not Executed Lines: 0
- Average LineExec usec: 3 Unknown Lines: 1
- Maximum LineExec usec: 20 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_BETWNSTR Test Result Details (Test Run ID 39)
------------------------------------------------------------
- PASS 272ms Typical valid usage. EQ - Expected "cde" and got "cde"
- PASS 0ms NULL start. ISNULL - Expected NULL and got ""
- PASS 0ms NULL end. ISNULL - Expected NULL and got ""
- PASS 0ms End smaller than start. ISNULL - Expected NULL and got ""
- PASS 0ms End larger than string length. EQ - Expected "cdefg" and got "cdefg"
-
- - WTP_DEMO.BETWNSTR FUNCTION Code Coverage Details (Test Run ID 39)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 9 1 3 FUNCTION betwnStr (
- 9 EXEC 5 31 1 20 RETURN (
- 16 EXEC 5 1 1 1 END;
-
-
-
-PL/SQL procedure successfully completed.
-
-utPLSQL 2.3 ut_calc_secs_between Example
-
-Procedure CALC_SECS_BETWEEN compiled
-
-
-Package UT_CALC_SECS_BETWEEN compiled
-
-
-Package Body UT_CALC_SECS_BETWEEN compiled
-
-
- wtPLSQL 1.1.0 - Run ID 40: 29-Jun-2018 01:04:20 PM
-
- Test Results for WTP_DEMO.UT_CALC_SECS_BETWEEN
- Total Test Cases: 0 Total Assertions: 2
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 137 Error Assertions: 0
- Maximum Interval msec: 274 Test Yield: 100.00%
- Total Run Time (sec): 0.3
-
- Code Coverage for PROCEDURE WTP_DEMO.CALC_SECS_BETWEEN
- Ignored Lines: 0 Total Profiled Lines: 3
- Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 0 Not Executed Lines: 0
- Average LineExec usec: 3 Unknown Lines: 1
- Maximum LineExec usec: 9 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_CALC_SECS_BETWEEN Test Result Details (Test Run ID 40)
------------------------------------------------------------
- PASS 274ms Same dates. EQ - Expected "0" and got "0"
- PASS 0ms Exactly one day. EQ - Expected "86400" and got "86400"
-
- - WTP_DEMO.CALC_SECS_BETWEEN PROCEDURE Code Coverage Details (Test Run ID 40)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 3 1 2 PROCEDURE calc_secs_between (
- 10 EXEC 2 12 3 9 secs := (date2 - date1) * 24 * 60 * 60;
- 11 EXEC 2 1 0 1 END;
-
-
-
-PL/SQL procedure successfully completed.
-
-utPLSQL 2.3 ut_str Example
-
-Package STR compiled
-
-
-Package Body STR compiled
-
-
- wtPLSQL 1.1.0 - Run ID 41: 29-Jun-2018 01:04:21 PM
-
- Test Results for WTP_DEMO.STR
- Total Test Cases: 0 Total Assertions: 3
- Minimum Interval msec: 0 Failed Assertions: 0
- Average Interval msec: 102 Error Assertions: 0
- Maximum Interval msec: 305 Test Yield: 100.00%
- Total Run Time (sec): 0.3
-
- Code Coverage for PACKAGE BODY WTP_DEMO.STR
- Ignored Lines: 14 Total Profiled Lines: 25
- Excluded Lines: 1 Total Executed Lines: 4
- Minimum LineExec usec: 0 Not Executed Lines: 5
- Average LineExec usec: 1 Unknown Lines: 1
- Maximum LineExec usec: 9 Code Coverage: 44.40%
- Trigger Source Offset: 0
-
- - WTP_DEMO.STR Test Result Details (Test Run ID 41)
------------------------------------------------------------
- PASS 305ms Typical Valid Usage. EQ - Expected "is is" and got "is is"
- PASS 1ms Test Negative Start. EQ - Expected "ing" and got "ing"
- PASS 0ms Start bigger than end. ISNULL - Expected NULL and got ""
-
- - WTP_DEMO.STR PACKAGE BODY Code Coverage Details (Test Run ID 41)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 3 UNKN 0 4 1 2 FUNCTION betwn (
- 10 EXEC 3 2 0 1 l_start PLS_INTEGER := start_in;
- 12 EXEC 3 1 0 1 IF l_start = 0
- 14#NOTX# 0 0 0 0 l_start := 1;
- 17 EXEC 3 12 1 9 RETURN (SUBSTR (
- 25 EXEC 3 0 0 0 END;
- 27 EXCL 0 0 0 0 FUNCTION betwn2 (
- 36#NOTX# 0 0 0 0 IF end_in < 0
- 38#NOTX# 0 0 0 0 RETURN betwn (string_in, start_in, end_in);
- 40#NOTX# 0 0 0 0 RETURN (SUBSTR (
- 51#NOTX# 0 0 0 0 END;
- 55 IGNR 0 1 1 1 PROCEDURE ut_setup
- 58 IGNR 1 2 2 2 NULL;
- 61 IGNR 0 0 0 0 PROCEDURE ut_teardown
- 64 IGNR 1 0 0 0 NULL;
- 68 IGNR 0 5 5 5 PROCEDURE ut_betwn
- 71 IGNR 1 37 1 36 utassert.eq (
- 76 IGNR 1 2 1 1 utassert.eq (
- 81 IGNR 1 3 1 2 utassert.isnull (
- 85 IGNR 1 0 0 0 END;
- 88 IGNR 0 2 2 2 PROCEDURE wtplsql_run IS
- 90 IGNR 1 1 1 1 ut_setup;
- 91 IGNR 1 1 1 1 ut_betwn;
- 92 IGNR 1 0 0 0 ut_teardown;
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 93 IGNR 1 1 1 1 END wtplsql_run;
-
-
-
-PL/SQL procedure successfully completed.
-
-utPLSQL 2.3 ut_truncit Example
-
-Procedure TRUNCIT compiled
-
-
-Function TABCOUNT compiled
-
-
-Package UT_TRUNCIT compiled
-
-
-Package Body UT_TRUNCIT compiled
-
-
- wtPLSQL 1.1.0 - Run ID 42: 29-Jun-2018 01:04:22 PM
-
- Test Results for WTP_DEMO.UT_TRUNCIT
- Total Test Cases: 0 Total Assertions: 1
- Minimum Interval msec: 363 Failed Assertions: 0
- Average Interval msec: 363 Error Assertions: 0
- Maximum Interval msec: 363 Test Yield: 100.00%
- Total Run Time (sec): 0.4
-
- Code Coverage for PROCEDURE WTP_DEMO.TRUNCIT
- Ignored Lines: 0 Total Profiled Lines: 3
- Excluded Lines: 0 Total Executed Lines: 2
- Minimum LineExec usec: 3 Not Executed Lines: 0
- Average LineExec usec: 7432 Unknown Lines: 1
- Maximum LineExec usec: 14854 Code Coverage: 100.00%
- Trigger Source Offset: 0
-
- - WTP_DEMO.UT_TRUNCIT Test Result Details (Test Run ID 42)
------------------------------------------------------------
- PASS 363ms Test of TRUNCIT. EQ - Expected "0" and got "0"
-
- - WTP_DEMO.TRUNCIT PROCEDURE Code Coverage Details (Test Run ID 42)
-Source TotTime MinTime MaxTime
- Line Stat Occurs (usec) (usec) (usec) Text
------- ---- ------ --------- ------- --------- ------------
- 1 UNKN 0 5 5 5 PROCEDURE truncit (
- 7 EXEC 1 14861 7 14854 EXECUTE IMMEDIATE 'truncate table ' || NVL (sch, USER) || '.' || tab;
- 8 EXEC 1 3 3 3 END;
-
-
-
-PL/SQL procedure successfully completed.
-
diff --git a/src/demo/uninstall.sql b/src/demo/uninstall.sql
deleted file mode 100644
index 990938d..0000000
--- a/src/demo/uninstall.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-
-spool uninstall
-set serveroutput on size unlimited format wrapped
-
-@common_setup.sql
-
-drop user &schema_owner. cascade;
-
-spool off
diff --git a/src/demo/uninstallO.LST b/src/demo/uninstallO.LST
deleted file mode 100644
index 52c0641..0000000
--- a/src/demo/uninstallO.LST
+++ /dev/null
@@ -1,5 +0,0 @@
-old:drop user &schema_owner. cascade
-new:drop user wtp_demo cascade
-
-User WTP_DEMO dropped.
-
diff --git a/wtpgrb/ODBCAPTURE/DLOAD_CONF.cdl b/wtpgrb/ODBCAPTURE/DLOAD_CONF.cdl
new file mode 100644
index 0000000..3430689
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/DLOAD_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.DLOAD_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'DLOAD_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'DLOAD_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."DLOAD_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/DLOAD_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/DLOAD_CONF.ctl data=ODBCAPTURE/DLOAD_CONF.csv log=ODBCAPTURE/DLOAD_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/DLOAD_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/ODBCAPTURE/DLOAD_CONF.csv b/wtpgrb/ODBCAPTURE/DLOAD_CONF.csv
new file mode 100644
index 0000000..a9b2da8
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/DLOAD_CONF.csv
@@ -0,0 +1,8 @@
+"USERNAME","TABLE_NAME","INSTALL_TYPE","BEFORE_SELECT_SQL","WHERE_CLAUSE","ORDER_BY_COLUMNS","AFTER_ORDER_BY_SQL","NOTES"
+"ODBCAPTURE","DLOAD_CONF","wtpgrb",,"install_type in ('wtpsrc','wtptst','wtpgrb','wtpsav')","USERNAME, TABLE_NAME, INSTALL_TYPE",,
+"ODBCAPTURE","OBJECT_CONF","wtpgrb",,"install_type in ('wtpsrc','wtptst','wtpgrb','wtpsav')","USERNAME, INSTALL_OTYPE, INSTALL_TYPE",,
+"ODBCAPTURE","ROLE_CONF","wtpgrb",,"install_type in ('wtpsrc','wtptst','wtpgrb','wtpsav')","ROLENAME, INSTALL_TYPE",,
+"ODBCAPTURE","SCHEMA_CONF","wtpgrb",,"install_type in ('wtpsrc','wtptst','wtpgrb','wtpsav')","USERNAME",,
+"ODBCAPTURE","TYPE_CONF","wtpgrb",,"install_type in ('wtpsrc','wtptst','wtpgrb','wtpsav')","INSTALL_TYPE",,
+"WTP","HOOKS","wtpsrc",,,"HOOK_NAME, SEQ",,
+"WTP","WT_SELF_TEST","wtptst",,,"ID",,
diff --git a/wtpgrb/ODBCAPTURE/DLOAD_CONF.ctl b/wtpgrb/ODBCAPTURE/DLOAD_CONF.ctl
new file mode 100644
index 0000000..89a6ffb
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/DLOAD_CONF.ctl
@@ -0,0 +1,14 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."DLOAD_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,TABLE_NAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,BEFORE_SELECT_SQL CHAR(4000)
+ ,WHERE_CLAUSE CHAR(4000)
+ ,ORDER_BY_COLUMNS CHAR(4000)
+ ,AFTER_ORDER_BY_SQL CHAR(4000)
+ ,NOTES CHAR(1024)
+ )
diff --git a/wtpgrb/ODBCAPTURE/OBJECT_CONF.cdl b/wtpgrb/ODBCAPTURE/OBJECT_CONF.cdl
new file mode 100644
index 0000000..c5824e4
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/OBJECT_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.OBJECT_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'OBJECT_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'OBJECT_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."OBJECT_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/OBJECT_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/OBJECT_CONF.ctl data=ODBCAPTURE/OBJECT_CONF.csv log=ODBCAPTURE/OBJECT_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/OBJECT_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/ODBCAPTURE/OBJECT_CONF.csv b/wtpgrb/ODBCAPTURE/OBJECT_CONF.csv
new file mode 100644
index 0000000..07d7fea
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/OBJECT_CONF.csv
@@ -0,0 +1,9 @@
+"USERNAME","INSTALL_OTYPE","INSTALL_TYPE","ONAME_FILTER","NOTES"
+"WTP","PACKAGE_BODY","wtpsav","(WT_DBOUT|WT_JOB|WT_PERSIST_REPORT|WT_PROFILE|WT_RESULT|WT_TEST_RUN|WT_TEST_RUNNER|WT_TESTCASE)","Persist Packages"
+"WTP","PACKAGE_SPEC","wtpsav","(WT_DBOUT|WT_JOB|WT_PERSIST_REPORT|WT_PROFILE|WT_RESULT|WT_TEST_RUN|WT_TEST_RUNNER|WT_TESTCASE)","Persist Packages"
+"WTP","PROCEDURE","wtpsav","JUNIT_XML_PERSIST_ALL","JUnit Reporting from Persist"
+"WTP","SEQUENCE","wtpsav","(PLSQL_PROFILER_RUNNUMBER|WT_DBOUTS_SEQ|WT_TEST_RUNNERS_SEQ|WT_TEST_RUNS_SEQ|WT_TESTCASES_SEQ)","Persist Sequences"
+"WTP","TABLE","wtpsav","(PLSQL_PROFILER_DATA|PLSQL_PROFILER_RUNS|PLSQL_PROFILER_UNITS|WT_DBOUT_RUNS|WT_DBOUTS|WT_PROFILES|WT_RESULTS|WT_TEST_RUNNERS|WT_TEST_RUNS|WT_TESTCASE_RUNS|WT_TESTCASES)","Persist Tables"
+"WTP","TABLE","wtptst","WT_SELF_TEST","Test Table"
+"WTP","TABLE_TRIGGER","wtptst","WT_SELF_TEST$TEST","Test Trigger"
+"WTP","VIEW","wtpsav","(WT_DBOUT_RUNS_VW|WT_PROFILES_VW|WT_RESULTS_VW|WT_SCHEDULER_JOBS_VW|WT_TEST_RUNS_VW|WT_TESTCASE_RUNS_VW)","Persist Views"
diff --git a/wtpgrb/ODBCAPTURE/OBJECT_CONF.ctl b/wtpgrb/ODBCAPTURE/OBJECT_CONF.ctl
new file mode 100644
index 0000000..de6f208
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/OBJECT_CONF.ctl
@@ -0,0 +1,11 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."OBJECT_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,INSTALL_OTYPE CHAR(20)
+ ,INSTALL_TYPE CHAR(10)
+ ,ONAME_FILTER CHAR(4000)
+ ,NOTES CHAR(1024)
+ )
diff --git a/wtpgrb/ODBCAPTURE/ROLE_CONF.cdl b/wtpgrb/ODBCAPTURE/ROLE_CONF.cdl
new file mode 100644
index 0000000..7690631
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/ROLE_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.ROLE_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'ROLE_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'ROLE_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."ROLE_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/ROLE_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/ROLE_CONF.ctl data=ODBCAPTURE/ROLE_CONF.csv log=ODBCAPTURE/ROLE_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/ROLE_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/ODBCAPTURE/ROLE_CONF.csv b/wtpgrb/ODBCAPTURE/ROLE_CONF.csv
new file mode 100644
index 0000000..14dfd1b
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/ROLE_CONF.csv
@@ -0,0 +1 @@
+"ROLENAME","INSTALL_TYPE","NOTES"
diff --git a/wtpgrb/ODBCAPTURE/ROLE_CONF.ctl b/wtpgrb/ODBCAPTURE/ROLE_CONF.ctl
new file mode 100644
index 0000000..a8308bb
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/ROLE_CONF.ctl
@@ -0,0 +1,9 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."ROLE_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (ROLENAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,NOTES CHAR(1024)
+ )
diff --git a/wtpgrb/ODBCAPTURE/SCHEMA_CONF.cdl b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.cdl
new file mode 100644
index 0000000..3cd7b23
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.SCHEMA_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'SCHEMA_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'SCHEMA_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."SCHEMA_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/SCHEMA_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/SCHEMA_CONF.ctl data=ODBCAPTURE/SCHEMA_CONF.csv log=ODBCAPTURE/SCHEMA_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/SCHEMA_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/ODBCAPTURE/SCHEMA_CONF.csv b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.csv
new file mode 100644
index 0000000..9cb9078
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.csv
@@ -0,0 +1,2 @@
+"USERNAME","INSTALL_TYPE","TS_SIZE","NOTES","TABLESPACE_NAME"
+"WTP","wtpsrc","512M","PL/SQL Unit Testing with wtPLSQL","USERS"
diff --git a/wtpgrb/ODBCAPTURE/SCHEMA_CONF.ctl b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.ctl
new file mode 100644
index 0000000..c6953ee
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/SCHEMA_CONF.ctl
@@ -0,0 +1,11 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."SCHEMA_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (USERNAME CHAR(128)
+ ,INSTALL_TYPE CHAR(10)
+ ,TS_SIZE CHAR(10)
+ ,NOTES CHAR(1024)
+ ,TABLESPACE_NAME CHAR(30)
+ )
diff --git a/wtpgrb/ODBCAPTURE/TYPE_CONF.cdl b/wtpgrb/ODBCAPTURE/TYPE_CONF.cdl
new file mode 100644
index 0000000..bdae382
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/TYPE_CONF.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for ODBCAPTURE.TYPE_CONF data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'ODBCAPTURE'
+ and table_name = 'TYPE_CONF'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'ODBCAPTURE'
+ and table_name = 'TYPE_CONF'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "ODBCAPTURE"."TYPE_CONF"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=ODBCAPTURE/TYPE_CONF.ctl
+host sqlldr '&1.' control=ODBCAPTURE/TYPE_CONF.ctl data=ODBCAPTURE/TYPE_CONF.csv log=ODBCAPTURE/TYPE_CONF.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "ODBCAPTURE/TYPE_CONF.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/ODBCAPTURE/TYPE_CONF.csv b/wtpgrb/ODBCAPTURE/TYPE_CONF.csv
new file mode 100644
index 0000000..0e11e50
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/TYPE_CONF.csv
@@ -0,0 +1,5 @@
+"INSTALL_TYPE","NOTES","INSTALL_TYPE_PARENT"
+"wtpgrb","ODBCapture Data for wtPLSQL","grbsrc"
+"wtpsav","wtPLSQL Persisted Test Results","wtpsrc"
+"wtpsrc","wtPLSQL Unit Testing Source Code (Core)","pub"
+"wtptst","wtPLSQL Internal Unit Testing","wtpsrc"
diff --git a/wtpgrb/ODBCAPTURE/TYPE_CONF.ctl b/wtpgrb/ODBCAPTURE/TYPE_CONF.ctl
new file mode 100644
index 0000000..564839b
--- /dev/null
+++ b/wtpgrb/ODBCAPTURE/TYPE_CONF.ctl
@@ -0,0 +1,9 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE"."TYPE_CONF"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (INSTALL_TYPE CHAR(10)
+ ,NOTES CHAR(1024)
+ ,INSTALL_TYPE_PARENT CHAR(10)
+ )
diff --git a/wtpgrb/alter_foreign_keys.sql b/wtpgrb/alter_foreign_keys.sql
new file mode 100644
index 0000000..e3ba0cc
--- /dev/null
+++ b/wtpgrb/alter_foreign_keys.sql
@@ -0,0 +1,88 @@
+
+--
+-- Alter "wtpgrb" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Foreign Keys for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/alter_queues.sql b/wtpgrb/alter_queues.sql
new file mode 100644
index 0000000..3e2f20b
--- /dev/null
+++ b/wtpgrb/alter_queues.sql
@@ -0,0 +1,36 @@
+
+--
+-- Alter "wtpgrb" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Queues for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/alter_scheduler_jobs.sql b/wtpgrb/alter_scheduler_jobs.sql
new file mode 100644
index 0000000..63fb36c
--- /dev/null
+++ b/wtpgrb/alter_scheduler_jobs.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpgrb" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Scheduler Jobs for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/alter_triggers.sql b/wtpgrb/alter_triggers.sql
new file mode 100644
index 0000000..162bf0e
--- /dev/null
+++ b/wtpgrb/alter_triggers.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpgrb" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Triggers for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/compile_all.sql b/wtpgrb/compile_all.sql
new file mode 100644
index 0000000..2cb5c68
--- /dev/null
+++ b/wtpgrb/compile_all.sql
@@ -0,0 +1,36 @@
+
+--
+-- Compile All "wtpgrb" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+ dbms_output.put_line('Compile All for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/db_build_junit_report.sql b/wtpgrb/db_build_junit_report.sql
new file mode 100644
index 0000000..d3b3fb5
--- /dev/null
+++ b/wtpgrb/db_build_junit_report.sql
@@ -0,0 +1,112 @@
+
+--
+-- Create JUnit XML Report of Database Build Status for "wtpgrb" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+ do_it('ODBCAPTURE');
+ ot('');
+end;
+/
diff --git a/wtpgrb/db_install.sql b/wtpgrb/db_install.sql
new file mode 100644
index 0000000..8fab835
--- /dev/null
+++ b/wtpgrb/db_install.sql
@@ -0,0 +1,57 @@
+
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+/
+
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+/
+
+set feedback on
diff --git a/wtpgrb/fix_invalid_public_synonyms.sql b/wtpgrb/fix_invalid_public_synonyms.sql
new file mode 100644
index 0000000..ef70282
--- /dev/null
+++ b/wtpgrb/fix_invalid_public_synonyms.sql
@@ -0,0 +1,49 @@
+
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+/
+
diff --git a/wtpgrb/install.sql b/wtpgrb/install.sql
new file mode 100644
index 0000000..b6323c5
--- /dev/null
+++ b/wtpgrb/install.sql
@@ -0,0 +1,76 @@
+
+--
+-- Master Installation Script
+-- All scripts created by "https://ODBCapture.org", Version V2.1
+--
+-- Must be run as SYS
+--
+-- Command Line Parameters:
+-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the pluggable database.
+-- The Data Load installation requires this connection information.
+--
+
+-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:
+-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv
+
+define TOP_PDB_SYSTEM="&1."
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt Identify this Module in V$SESSION
+set appinfo "wtpgrb Installation"
+
+----------------------------------------
+prompt Setup Abort on Error
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+----------------------------------------
+prompt
+prompt **************************
+prompt * Run SYS Installation *
+prompt **************************
+prompt
+@install_sys.sql "" "" ""
+
+----------------------------------------
+prompt Setup Continue on Error
+WHENEVER SQLERROR CONTINUE
+WHENEVER OSERROR CONTINUE
+
+----------------------------------------
+prompt
+prompt *****************************
+prompt * Run SYSTEM Installation *
+prompt *****************************
+prompt
+connect &TOP_PDB_SYSTEM.
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+@install_system.sql "" "" ""
+
+----------------------------------------
+prompt
+prompt *************************
+prompt * Install Application *
+prompt *************************
+prompt
+@install_wtpgrb.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+prompt
+prompt *****************
+prompt * Run Reports *
+prompt *****************
+prompt
+@report_status.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+set appinfo "Null"
+set appinfo off
+prompt
+prompt "wtpgrb" Installation is Done.
+
diff --git a/wtpgrb/install_sys.sql b/wtpgrb/install_sys.sql
new file mode 100644
index 0000000..c53ba1c
--- /dev/null
+++ b/wtpgrb/install_sys.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYS Installation Script
+--
+-- Must be run as SYS
+--
+
+spool install_sys.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpgrb/install_system.sql b/wtpgrb/install_system.sql
new file mode 100644
index 0000000..dd64dd5
--- /dev/null
+++ b/wtpgrb/install_system.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYSTEM Installation Script
+--
+-- Must be run as SYSTEM
+--
+
+spool install_system.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpgrb/install_wtpgrb.sql b/wtpgrb/install_wtpgrb.sql
new file mode 100644
index 0000000..d966577
--- /dev/null
+++ b/wtpgrb/install_wtpgrb.sql
@@ -0,0 +1,43 @@
+
+--
+-- wtpgrb Installation Script
+--
+-- Must be run as a SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+spool install_wtpgrb.log
+
+define INSTALL_SYSTEM_CONNECT="&1."
+
+-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages
+set sqlprefix "~"
+
+-- Using "^P", CHR(16), DLE as an escape character
+set escape OFF
+set escape ""
+
+----------------------------------------
+-- Prepare for Install
+@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- DATA_LOAD Install
+
+@db_install.sql "ODBCAPTURE/DLOAD_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/OBJECT_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/ROLE_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/SCHEMA_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "ODBCAPTURE/TYPE_CONF.cdl" "ODBCAPTURE" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- Finalize Installation
+@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+spool off
+
diff --git a/wtpgrb/installation_finalize.sql b/wtpgrb/installation_finalize.sql
new file mode 100644
index 0000000..7660714
--- /dev/null
+++ b/wtpgrb/installation_finalize.sql
@@ -0,0 +1,48 @@
+
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."
diff --git a/wtpgrb/installation_prepare.sql b/wtpgrb/installation_prepare.sql
new file mode 100644
index 0000000..265eb55
--- /dev/null
+++ b/wtpgrb/installation_prepare.sql
@@ -0,0 +1,9 @@
+
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;
diff --git a/wtpgrb/list_invalids.csv b/wtpgrb/list_invalids.csv
new file mode 100644
index 0000000..e2d4f25
--- /dev/null
+++ b/wtpgrb/list_invalids.csv
@@ -0,0 +1 @@
+"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"
diff --git a/wtpgrb/list_invalids.sql b/wtpgrb/list_invalids.sql
new file mode 100644
index 0000000..7f7b49b
--- /dev/null
+++ b/wtpgrb/list_invalids.sql
@@ -0,0 +1,47 @@
+
+--
+-- List Invalid Objects for "wtpgrb" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpgrb/log_files_junit_report.sql b/wtpgrb/log_files_junit_report.sql
new file mode 100644
index 0000000..8208b33
--- /dev/null
+++ b/wtpgrb/log_files_junit_report.sql
@@ -0,0 +1,282 @@
+
+--
+-- Create JUnit XML Report of Database Log Files for "wtpgrb" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_wtpgrb
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = 'wtpgrb'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+/
diff --git a/wtpgrb/odbcapture_installation_logs.cdl b/wtpgrb/odbcapture_installation_logs.cdl
new file mode 100644
index 0000000..efb09a6
--- /dev/null
+++ b/wtpgrb/odbcapture_installation_logs.cdl
@@ -0,0 +1,71 @@
+
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+/
+
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpgrb/odbcapture_installation_logs.csv b/wtpgrb/odbcapture_installation_logs.csv
new file mode 100644
index 0000000..6eb33b5
--- /dev/null
+++ b/wtpgrb/odbcapture_installation_logs.csv
@@ -0,0 +1,8 @@
+"wtpgrb","install_sys.log"
+"wtpgrb","install_system.log"
+"wtpgrb","install_wtpgrb.log"
+"wtpgrb","ODBCAPTURE/DLOAD_CONF.log"
+"wtpgrb","ODBCAPTURE/OBJECT_CONF.log"
+"wtpgrb","ODBCAPTURE/ROLE_CONF.log"
+"wtpgrb","ODBCAPTURE/SCHEMA_CONF.log"
+"wtpgrb","ODBCAPTURE/TYPE_CONF.log"
diff --git a/wtpgrb/odbcapture_installation_logs.ctl b/wtpgrb/odbcapture_installation_logs.ctl
new file mode 100644
index 0000000..3a1cf46
--- /dev/null
+++ b/wtpgrb/odbcapture_installation_logs.ctl
@@ -0,0 +1,8 @@
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )
diff --git a/wtpgrb/report_status.sql b/wtpgrb/report_status.sql
new file mode 100644
index 0000000..8bae62c
--- /dev/null
+++ b/wtpgrb/report_status.sql
@@ -0,0 +1,114 @@
+
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = 'wtpgrb'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+/
+
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
diff --git a/wtpgrb/update_id_sequences.sql b/wtpgrb/update_id_sequences.sql
new file mode 100644
index 0000000..9c1e85f
--- /dev/null
+++ b/wtpgrb/update_id_sequences.sql
@@ -0,0 +1,59 @@
+
+--
+-- Update "wtpgrb" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Update ID Sequences for wtpgrb Install Type');
+ do_it('ODBCAPTURE');
+end;
+/
diff --git a/wtpsav/WTP/JUNIT_XML_PERSIST_ALL.proc b/wtpsav/WTP/JUNIT_XML_PERSIST_ALL.proc
new file mode 100644
index 0000000..965810a
--- /dev/null
+++ b/wtpsav/WTP/JUNIT_XML_PERSIST_ALL.proc
@@ -0,0 +1,123 @@
+
+--
+-- Create WTP.JUNIT_XML_PERSIST_ALL Procedure
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.JUNIT_XML_PERSIST_ALL
+
+ CREATE OR REPLACE EDITIONABLE PROCEDURE "WTP"."JUNIT_XML_PERSIST_ALL"
+is
+ procedure p (in_line in varchar2) is
+ begin
+ DBMS_OUTPUT.PUT_LINE(in_line);
+ end p;
+begin
+ p('');
+ p('');
+ p('');
+ p('');
+ p('');
+ for suites in (
+ select run.start_dtm
+ ,run.end_dtm
+ ,run.id
+ ,tr.owner || '.' || tr.name SUITE_NAME
+ ,nvl(db.owner, tr.owner) PACKAGE_NAME
+ ,case when db.name || db.type is null
+ then 'TEST_RUNNER'
+ else db.name || ':' || db.type
+ end CLASS_NAME
+ ,run.tc_cnt
+ ,run.tc_fail
+ ,extract(day from (run.end_dtm -
+ run.start_dtm) * 86400000)
+ TOT_INTERVAL_MSEC
+ ,run.error_message
+ from wt_test_runs run
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id
+ left join wt_dbouts db
+ on db.id = run.dbout_id
+ where run.is_last_run = wt_test_run.get_last_run_flag
+ order by run.start_dtm, run.id )
+ loop
+ p(' ' );
+ for cases in (
+ select run.id
+ ,tc.testcase
+ ,tcr.testcase_id
+ ,tcr.asrt_cnt ASSERTS
+ ,tcr.asrt_fail FAILURES
+ ,nvl(tcr.asrt_tot_msec
+ ,suites.tot_interval_msec) TOT_INTERVAL_MSEC
+ from wt_test_runs run
+ left join wt_testcase_runs tcr
+ on tcr.test_run_id = run.id
+ left join wt_testcases tc
+ on tc.id = tcr.testcase_id
+ where run.id = suites.id
+ order by testcase )
+ loop
+ if nvl(cases.failures,1) = 0
+ and suites.error_message is null
+ then
+ p(' ');
+ else
+ p(' ');
+ p(' ');
+ -- Print each of the non-passing results
+ for asrts in (
+ select wtr.result_seq
+ ,wtr.status
+ ,wtr.interval_msec
+ ,wtr.message
+ ,wtr.assertion
+ ,wtr.details
+ from wt_results wtr
+ where wtr.test_run_id = suites.id
+ and ( ( cases.testcase_id is null
+ and wtr.testcase_id is null)
+ or wtr.testcase_id = cases.testcase_id)
+ and wtr.status != 'PASS'
+ order by wtr.result_seq )
+ loop
+ p(lpad(asrts.result_seq,4) || ': ' ||
+ rpad(asrts.status,4) || ' ' ||
+ lpad(asrts.interval_msec,4) || 'ms ' ||
+ asrts.message || '. ' ||
+ asrts.assertion || ' - ' ||
+ replace(replace(asrts.details
+ ,CHR(13),'\r')
+ ,CHR(10),'\n') || '.' );
+ end loop;
+ p(' ');
+ p(' ');
+ end if;
+ end loop;
+ end loop;
+ p(' ');
+ p('');
+end junit_xml_persist_all;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_DATA.tab b/wtpsav/WTP/PLSQL_PROFILER_DATA.tab
new file mode 100644
index 0000000..b48da63
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_DATA.tab
@@ -0,0 +1,55 @@
+
+--
+-- Create WTP.PLSQL_PROFILER_DATA Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_DATA
+
+ CREATE TABLE "WTP"."PLSQL_PROFILER_DATA"
+ ( "RUNID" NUMBER,
+ "UNIT_NUMBER" NUMBER,
+ "LINE#" NUMBER NOT NULL ENABLE,
+ "TOTAL_OCCUR" NUMBER,
+ "TOTAL_TIME" NUMBER,
+ "MIN_TIME" NUMBER,
+ "MAX_TIME" NUMBER,
+ "SPARE1" NUMBER,
+ "SPARE2" NUMBER,
+ "SPARE3" NUMBER,
+ "SPARE4" NUMBER
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."PLSQL_PROFILER_DATA" ADD PRIMARY KEY ("RUNID", "UNIT_NUMBER", "LINE#")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_DATA
+
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."RUNID" IS 'Primary key, unique (generated) run identifier';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."UNIT_NUMBER" IS 'Primary key, internally generated library unit number';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."LINE#" IS 'Primary key, not null, line number in unit';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."TOTAL_OCCUR" IS 'Number of times line was executed';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."TOTAL_TIME" IS 'Total time spent executing line in nanoseconds';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."MIN_TIME" IS 'Minimum execution time for this line in nanoseconds';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."MAX_TIME" IS 'Maximum execution time for this line in nanoseconds';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."SPARE1" IS 'Unused';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."SPARE2" IS 'Unused';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."SPARE3" IS 'Unused';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_DATA"."SPARE4" IS 'Unused';
+ COMMENT ON TABLE "WTP"."PLSQL_PROFILER_DATA" IS 'Table of program units for DBMS_PROFILER';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_DATA.tabfk b/wtpsav/WTP/PLSQL_PROFILER_DATA.tabfk
new file mode 100644
index 0000000..ae7b52d
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_DATA.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for WTP.PLSQL_PROFILER_DATA TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_DATA_FK1
+
+ ALTER TABLE "WTP"."PLSQL_PROFILER_DATA" ADD CONSTRAINT "PLSQL_PROFILER_DATA_FK1" FOREIGN KEY ("RUNID", "UNIT_NUMBER")
+ REFERENCES "WTP"."PLSQL_PROFILER_UNITS" ("RUNID", "UNIT_NUMBER") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_RUNNUMBER.seq b/wtpsav/WTP/PLSQL_PROFILER_RUNNUMBER.seq
new file mode 100644
index 0000000..ac5e6a8
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_RUNNUMBER.seq
@@ -0,0 +1,20 @@
+
+--
+-- Create WTP.PLSQL_PROFILER_RUNNUMBER Sequence
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_RUNNUMBER
+
+ CREATE SEQUENCE "WTP"."PLSQL_PROFILER_RUNNUMBER" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_RUNS.tab b/wtpsav/WTP/PLSQL_PROFILER_RUNS.tab
new file mode 100644
index 0000000..f6aba61
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_RUNS.tab
@@ -0,0 +1,51 @@
+
+--
+-- Create WTP.PLSQL_PROFILER_RUNS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_RUNS
+
+ CREATE TABLE "WTP"."PLSQL_PROFILER_RUNS"
+ ( "RUNID" NUMBER,
+ "RELATED_RUN" NUMBER,
+ "RUN_OWNER" VARCHAR2(32 BYTE),
+ "RUN_DATE" DATE,
+ "RUN_COMMENT" VARCHAR2(2047 BYTE),
+ "RUN_TOTAL_TIME" NUMBER,
+ "RUN_SYSTEM_INFO" VARCHAR2(2047 BYTE),
+ "RUN_COMMENT1" VARCHAR2(2047 BYTE),
+ "SPARE1" VARCHAR2(256 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."PLSQL_PROFILER_RUNS" ADD PRIMARY KEY ("RUNID")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_RUNS
+
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUNID" IS '(PRIMARY KEY) Unique run identifier from plsql_profiler_runnumber';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RELATED_RUN" IS 'Runid of related run (for client/server correlation)';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_OWNER" IS 'User who started run';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_DATE" IS 'Start time of run';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_COMMENT" IS 'User provided comment for this run';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_TOTAL_TIME" IS 'Elapsed time for this run in nanoseconds';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_SYSTEM_INFO" IS 'Currently unused';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."RUN_COMMENT1" IS 'Additional comment';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_RUNS"."SPARE1" IS 'Unused';
+ COMMENT ON TABLE "WTP"."PLSQL_PROFILER_RUNS" IS 'Table of profiler runs for DBMS_PROFILER';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_RUNS.tabind b/wtpsav/WTP/PLSQL_PROFILER_RUNS.tabind
new file mode 100644
index 0000000..27c416c
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_RUNS.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for WTP.PLSQL_PROFILER_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_RUNS_IDX1
+
+ CREATE INDEX "WTP"."PLSQL_PROFILER_RUNS_IDX1" ON "WTP"."PLSQL_PROFILER_RUNS" ("RUN_DATE")
+ ;
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_UNITS.tab b/wtpsav/WTP/PLSQL_PROFILER_UNITS.tab
new file mode 100644
index 0000000..98a1c38
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_UNITS.tab
@@ -0,0 +1,51 @@
+
+--
+-- Create WTP.PLSQL_PROFILER_UNITS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_UNITS
+
+ CREATE TABLE "WTP"."PLSQL_PROFILER_UNITS"
+ ( "RUNID" NUMBER,
+ "UNIT_NUMBER" NUMBER,
+ "UNIT_TYPE" VARCHAR2(32 BYTE),
+ "UNIT_OWNER" VARCHAR2(32 BYTE),
+ "UNIT_NAME" VARCHAR2(32 BYTE),
+ "UNIT_TIMESTAMP" DATE,
+ "TOTAL_TIME" NUMBER DEFAULT 0 NOT NULL ENABLE,
+ "SPARE1" NUMBER,
+ "SPARE2" NUMBER
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."PLSQL_PROFILER_UNITS" ADD PRIMARY KEY ("RUNID", "UNIT_NUMBER")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_UNITS
+
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."RUNID" IS '(Primary key) References plsql_profiler_runs';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."UNIT_NUMBER" IS '(Primary key) Internally generated library unit #';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."UNIT_TYPE" IS 'Library unit type';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."UNIT_OWNER" IS 'Library unit owner name';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."UNIT_NAME" IS 'Library unit name timestamp on library unit';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."UNIT_TIMESTAMP" IS 'In the future will be used to detect changes to unit between runs';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."TOTAL_TIME" IS 'Total time spent in this unit in nanoseconds. The profiler does not set this field, but it is provided for the convenience of analysis tools';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."SPARE1" IS 'Unused';
+ COMMENT ON COLUMN "WTP"."PLSQL_PROFILER_UNITS"."SPARE2" IS 'Unused';
+ COMMENT ON TABLE "WTP"."PLSQL_PROFILER_UNITS" IS 'Table of program units for DBMS_PROFILER';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/PLSQL_PROFILER_UNITS.tabfk b/wtpsav/WTP/PLSQL_PROFILER_UNITS.tabfk
new file mode 100644
index 0000000..5a4e7b7
--- /dev/null
+++ b/wtpsav/WTP/PLSQL_PROFILER_UNITS.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for WTP.PLSQL_PROFILER_UNITS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.PLSQL_PROFILER_UNITS_FK1
+
+ ALTER TABLE "WTP"."PLSQL_PROFILER_UNITS" ADD CONSTRAINT "PLSQL_PROFILER_UNITS_FK1" FOREIGN KEY ("RUNID")
+ REFERENCES "WTP"."PLSQL_PROFILER_RUNS" ("RUNID") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUT.pbody b/wtpsav/WTP/WT_DBOUT.pbody
new file mode 100644
index 0000000..6192dc1
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUT.pbody
@@ -0,0 +1,262 @@
+
+--
+-- Create WTP.WT_DBOUT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_DBOUT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_DBOUT"
+as
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_DBOUT_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_DBOUT_NAME_FOR_TESTING_1234ABCD';
+ C_TYPE CONSTANT varchar2(50) := 'DBOUT_TYPE_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id from wt_dbouts
+ where owner = in_owner
+ and name = in_name
+ and type = in_type;
+ return l_id;
+exception
+ when NO_DATA_FOUND
+ then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_OWNER, C_NAME, C_TYPE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_dbouts (id, owner, name, type)
+ values (wt_dbouts_seq.nextval, C_OWNER, C_NAME, C_TYPE)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_OWNER, C_NAME, C_TYPE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number
+is
+ PRAGMA AUTONOMOUS_TRANSACTION;
+ rec wt_dbouts%ROWTYPE;
+begin
+ if in_owner is NULL
+ OR in_name is NULL
+ OR in_type is NULL
+ then
+ return null;
+ end if;
+ rec.id := get_id (in_owner, in_name, in_type);
+ if rec.id is null
+ then
+ rec.id := wt_dbouts_seq.nextval;
+ rec.owner := in_owner;
+ rec.name := in_name;
+ rec.type := in_type;
+ insert into wt_dbouts values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_OWNER, C_NAME, C_TYPE);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_OWNER, C_NAME, C_TYPE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL, NULL, NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure delete_records
+is
+begin
+ delete from wt_dbouts
+ where id in (
+ select id from wt_dbouts
+ MINUS
+ select distinct dbout_id ID from wt_test_runs);
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_dbouts
+ where owner = C_OWNER
+ and name = C_NAME
+ and type = C_TYPE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_dbouts (id, owner, name, type)
+ values (wt_dbouts_seq.nextval, C_OWNER, C_NAME, C_TYPE);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_dbouts' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME ||
+ ''' and type = ''' || C_TYPE || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_DBOUT:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_dbout;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUT.pspec b/wtpsav/WTP/WT_DBOUT.pspec
new file mode 100644
index 0000000..3b4d8a5
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUT.pspec
@@ -0,0 +1,55 @@
+
+--
+-- Create WTP.WT_DBOUT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_DBOUT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_DBOUT"
+ authid definer
+as
+
+ -- Return a DBOUT Surrogate Key.
+ -- Return NULL if the DBOUT does not exist.
+ function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number;
+
+ -- Return a DBOUT Surrogate Key.
+ -- Add the DBOUT if it does not exist.
+ function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2
+ ,in_type in varchar2)
+ return number;
+
+ -- Delete all records with no child records
+ procedure delete_records;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_dbout;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUTS.tab b/wtpsav/WTP/WT_DBOUTS.tab
new file mode 100644
index 0000000..855e65d
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUTS.tab
@@ -0,0 +1,45 @@
+
+--
+-- Create WTP.WT_DBOUTS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_DBOUTS
+
+ CREATE TABLE "WTP"."WT_DBOUTS"
+ ( "ID" NUMBER(38,0) CONSTRAINT "WT_DBOUTS_NN1" NOT NULL ENABLE,
+ "OWNER" VARCHAR2(128 BYTE) CONSTRAINT "WT_DBOUTS_NN2" NOT NULL ENABLE,
+ "NAME" VARCHAR2(128 BYTE) CONSTRAINT "WT_DBOUTS_NN3" NOT NULL ENABLE,
+ "TYPE" VARCHAR2(20 BYTE) CONSTRAINT "WT_DBOUTS_NN4" NOT NULL ENABLE
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_DBOUTS" ADD CONSTRAINT "WT_DBOUTS_PK" PRIMARY KEY ("ID")
+ USING INDEX ENABLE;
+ALTER TABLE "WTP"."WT_DBOUTS" ADD CONSTRAINT "WT_DBOUTS_NK1" UNIQUE ("OWNER", "NAME", "TYPE")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_DBOUTS
+
+ COMMENT ON COLUMN "WTP"."WT_DBOUTS"."ID" IS 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)';
+ COMMENT ON COLUMN "WTP"."WT_DBOUTS"."OWNER" IS 'Owner of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUTS"."NAME" IS 'Name of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUTS"."TYPE" IS 'Type of the Database Object Under Test (DBOUT).';
+ COMMENT ON TABLE "WTP"."WT_DBOUTS" IS 'List of Database Objects Under Test (DBOUT).';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_DBOUTS" to "PUBLIC";
+grant SELECT on "WTP"."WT_DBOUTS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUTS.tabind b/wtpsav/WTP/WT_DBOUTS.tabind
new file mode 100644
index 0000000..7e6fa80
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUTS.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for WTP.WT_DBOUTS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.WT_DBOUTS_IX1
+
+ CREATE INDEX "WTP"."WT_DBOUTS_IX1" ON "WTP"."WT_DBOUTS" ("TYPE", "OWNER")
+ ;
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUTS_SEQ.seq b/wtpsav/WTP/WT_DBOUTS_SEQ.seq
new file mode 100644
index 0000000..d67fea3
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUTS_SEQ.seq
@@ -0,0 +1,20 @@
+
+--
+-- Create WTP.WT_DBOUTS_SEQ Sequence
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_DBOUTS_SEQ
+
+ CREATE SEQUENCE "WTP"."WT_DBOUTS_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUT_RUNS.tab b/wtpsav/WTP/WT_DBOUT_RUNS.tab
new file mode 100644
index 0000000..a08b48d
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUT_RUNS.tab
@@ -0,0 +1,66 @@
+
+--
+-- Create WTP.WT_DBOUT_RUNS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_DBOUT_RUNS
+
+ CREATE TABLE "WTP"."WT_DBOUT_RUNS"
+ ( "TEST_RUN_ID" NUMBER(38,0) CONSTRAINT "WT_DBOUT_RUNS_NN1" NOT NULL ENABLE,
+ "PROFILER_RUNID" NUMBER(38,0) CONSTRAINT "WT_DBOUT_RUNS_NN2" NOT NULL ENABLE,
+ "TRIGGER_OFFSET" NUMBER(6,0),
+ "COVERAGE_PCT" NUMBER(4,1),
+ "PROFILED_LINES" NUMBER(6,0),
+ "EXECUTED_LINES" NUMBER(6,0),
+ "IGNORED_LINES" NUMBER(6,0),
+ "EXCLUDED_LINES" NUMBER(6,0),
+ "NOTEXEC_LINES" NUMBER(6,0),
+ "UNKNOWN_LINES" NUMBER(6,0),
+ "EXEC_MIN_USEC" NUMBER(11,0),
+ "EXEC_AVG_USEC" NUMBER(11,0),
+ "EXEC_MAX_USEC" NUMBER(11,0),
+ "EXEC_TOT_USEC" NUMBER(11,0)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_DBOUT_RUNS" ADD CONSTRAINT "WT_DBOUT_RUNS_PK" PRIMARY KEY ("TEST_RUN_ID")
+ USING INDEX ENABLE;
+ALTER TABLE "WTP"."WT_DBOUT_RUNS" ADD CONSTRAINT "WT_DBOUT_RUNS_NK1" UNIQUE ("PROFILER_RUNID")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_DBOUT_RUNS
+
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."TEST_RUN_ID" IS 'Primary (Surrogate) Key of each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."PROFILER_RUNID" IS '(Required) DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."TRIGGER_OFFSET" IS 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."COVERAGE_PCT" IS 'Percentage of executed lines to non-ignored, non-excluded lines';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."PROFILED_LINES" IS 'Total number of source lines as counted by DBMS_PROFILER';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXECUTED_LINES" IS 'Number of source lines executed';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."IGNORED_LINES" IS 'Number of source lines ignored as uncountable';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXCLUDED_LINES" IS 'Number of declaration source lines (non-executable) excluded';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."NOTEXEC_LINES" IS 'Number of source lines not executed';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."UNKNOWN_LINES" IS 'Number of source lines with unknown DBMS_PROFILER metrics';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXEC_MIN_USEC" IS 'Minumum execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXEC_AVG_USEC" IS 'Average execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXEC_MAX_USEC" IS 'Maximum execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS"."EXEC_TOT_USEC" IS 'Total (Sum) of execution times for a line of source in microseconds';
+ COMMENT ON TABLE "WTP"."WT_DBOUT_RUNS" IS 'Database Object Under Test Run data for each Test Run.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_DBOUT_RUNS" to "PUBLIC";
+grant INSERT on "WTP"."WT_DBOUT_RUNS" to "PUBLIC";
+grant SELECT on "WTP"."WT_DBOUT_RUNS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUT_RUNS.tabfk b/wtpsav/WTP/WT_DBOUT_RUNS.tabfk
new file mode 100644
index 0000000..e50bd65
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUT_RUNS.tabfk
@@ -0,0 +1,17 @@
+
+--
+-- Create Foreign Keys for WTP.WT_DBOUT_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_DBOUT_RUNS_FK1
+
+ ALTER TABLE "WTP"."WT_DBOUT_RUNS" ADD CONSTRAINT "WT_DBOUT_RUNS_FK1" FOREIGN KEY ("TEST_RUN_ID")
+ REFERENCES "WTP"."WT_TEST_RUNS" ("ID") ENABLE;
+
+
+set define on
diff --git a/wtpsav/WTP/WT_DBOUT_RUNS_VW.vw b/wtpsav/WTP/WT_DBOUT_RUNS_VW.vw
new file mode 100644
index 0000000..6c79002
--- /dev/null
+++ b/wtpsav/WTP/WT_DBOUT_RUNS_VW.vw
@@ -0,0 +1,100 @@
+
+--
+-- Create WTP.WT_DBOUT_RUNS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_DBOUT_RUNS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_DBOUT_RUNS_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_DBOUT_RUNS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_DBOUT_RUNS_VW" ("TEST_RUN_ID", "DBOUT_ID", "DBOUT_OWNER", "DBOUT_NAME", "DBOUT_TYPE", "TEST_RUNNER_ID", "TEST_RUNNER_OWNER", "TEST_RUNNER_NAME", "START_DTM", "END_DTM", "IS_LAST_RUN", "ERROR_MESSAGE", "PROFILER_RUNID", "TRIGGER_OFFSET", "COVERAGE_PCT", "PROFILED_LINES", "EXECUTED_LINES", "IGNORED_LINES", "EXCLUDED_LINES", "NOTEXEC_LINES", "UNKNOWN_LINES", "EXEC_MIN_USEC", "EXEC_AVG_USEC", "EXEC_MAX_USEC", "EXEC_TOT_USEC") AS
+ select run.id TEST_RUN_ID
+ ,run.dbout_id
+ ,db.owner DBOUT_OWNER
+ ,db.name DBOUT_NAME
+ ,db.type DBOUT_TYPE
+ ,run.test_runner_id
+ ,tr.owner TEST_RUNNER_OWNER
+ ,tr.name TEST_RUNNER_NAME
+ ,run.start_dtm
+ ,run.end_dtm
+ ,run.is_last_run
+ ,run.error_message
+ ,dbr.profiler_runid
+ ,dbr.trigger_offset
+ ,dbr.coverage_pct
+ ,dbr.profiled_lines
+ ,dbr.executed_lines
+ ,dbr.ignored_lines
+ ,dbr.excluded_lines
+ ,dbr.notexec_lines
+ ,dbr.unknown_lines
+ ,dbr.exec_min_usec
+ ,dbr.exec_avg_usec
+ ,dbr.exec_max_usec
+ ,dbr.exec_tot_usec
+ from wt_test_runs run
+ join wt_dbouts db
+ on db.id = run.dbout_id
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id
+ left join wt_dbout_runs dbr
+ on run.id = dbr.test_run_id
+ where run.dbout_id is not null;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_DBOUT_RUNS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."TEST_RUN_ID" IS 'Primary (Surrogate) Key for each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."DBOUT_ID" IS 'Surrogate Key to the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."DBOUT_OWNER" IS 'Owner of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."DBOUT_NAME" IS 'Name of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."DBOUT_TYPE" IS 'Type of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."TEST_RUNNER_ID" IS 'Surrogate Key the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."TEST_RUNNER_OWNER" IS 'Owner of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."TEST_RUNNER_NAME" IS 'Name of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."START_DTM" IS 'Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."END_DTM" IS 'Date/time (and fractional seconds) this Test Run ended.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."IS_LAST_RUN" IS 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."ERROR_MESSAGE" IS 'Optional Error messages from this Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."PROFILER_RUNID" IS 'DBMS_PROFILER unique run identifier from plsql_profiler_runnumber sequence';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."TRIGGER_OFFSET" IS 'Calculated offset from start of Trigger Source to start of Trigger PL/SQL Block.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."COVERAGE_PCT" IS 'Percentage of executed source lines to valid executable source lines.';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."PROFILED_LINES" IS 'Total number of source lines as counted by DBMS_PROFILER';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXECUTED_LINES" IS 'Number of source lines executed';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."IGNORED_LINES" IS 'Number of source lines ignored as uncountable';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXCLUDED_LINES" IS 'Number of source lines excluded due to unexplained DBMS_PROFILER metrics';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."NOTEXEC_LINES" IS 'Number of source lines not executed';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."UNKNOWN_LINES" IS 'Number of source lines that have unexplained DBMS_PROFILER metrics';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXEC_MIN_USEC" IS 'Minumum execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXEC_AVG_USEC" IS 'Average execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXEC_MAX_USEC" IS 'Maximum execution time for a line of source in microseconds';
+ COMMENT ON COLUMN "WTP"."WT_DBOUT_RUNS_VW"."EXEC_TOT_USEC" IS 'Total (Sum) of execution times for a line of source in microseconds';
+ COMMENT ON TABLE "WTP"."WT_DBOUT_RUNS_VW" IS 'Test Run data for each execution of a Test Runner.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_DBOUT_RUNS_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_JOB.pbody b/wtpsav/WTP/WT_JOB.pbody
new file mode 100644
index 0000000..070a0a3
--- /dev/null
+++ b/wtpsav/WTP/WT_JOB.pbody
@@ -0,0 +1,521 @@
+
+--
+-- Create WTP.WT_JOB Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_JOB
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_JOB"
+as
+
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ g_current_user varchar2(30);
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+----------------------
+-- Private Procedures
+----------------------
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+
+ procedure tl_compile_db_object
+ (in_ptype in varchar2
+ ,in_pname in varchar2
+ ,in_source in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ l_errtxt varchar2(32000) := '';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ -- Wrap in_source to complete the DDL statement
+ l_sql_txt := 'create ' || in_ptype ||
+ ' ' || in_pname ||
+ ' as ' || in_source ;
+ wt_assert.raises
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ for buff in (select * from user_errors
+ where attribute = 'ERROR'
+ and name = in_pname
+ and type = in_ptype
+ order by sequence)
+ loop
+ l_errtxt := l_errtxt || buff.line || ', ' ||
+ buff.position || ': ' || buff.text || CHR(10);
+ end loop;
+ wt_assert.isnull
+ (msg_in => 'Compile ' || in_ptype || ' ' || in_pname ||
+ ' Error'
+ ,check_this_in => l_errtxt);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.objexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_compile_db_object;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_drop_db_object
+ (in_ptype in varchar2,
+ in_pname in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'drop ' || in_ptype || ' ' || in_pname;
+ wt_assert.raises
+ (msg_in => 'drop ' || in_ptype || ' ' || in_pname
+ ,check_call_in => l_sql_txt
+ ,against_exc_in => '');
+ wt_assert.objnotexists (
+ msg_in => in_pname || ' ' || in_ptype,
+ obj_owner_in => g_current_user,
+ obj_name_in => upper(in_pname),
+ obj_type_in => upper(in_ptype));
+ end tl_drop_db_object;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure create_db_link
+ (in_schema_name in varchar2
+ ,in_password in varchar2)
+is
+ connect_string varchar2(2000);
+begin
+ select '//' || 'localhost' ||
+ ':' || 1521 ||
+ '/' || global_name
+ into connect_string
+ from global_name;
+ execute immediate
+ 'create database link ' || in_schema_name ||
+ ' connect to ' || in_schema_name ||
+ ' identified by ' || in_password ||
+ ' using ''' || connect_string || '''';
+end create_db_link;
+
+
+------------------------------------------------------------
+procedure drop_db_link
+ (in_schema_name in varchar2)
+is
+begin
+ execute immediate
+ 'drop database link ' || in_schema_name;
+exception when OTHERS then
+ if SQLERRM != 'ORA-02024: database link not found'
+ then
+ ------%WTPLSQL_begin_ignore_lines%------
+ -- Can't Test This
+ raise;
+ -------%WTPLSQL_end_ignore_lines%-------
+ end if;
+end drop_db_link;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_create_drop_db_link
+ is
+ num_rows number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Create and Drop DB Link';
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links before testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 0);
+ wt_assert.raises (
+ msg_in => 'Create the Database Link',
+ check_call_in => 'begin wt_job.create_db_link(''' ||
+ g_current_user || ''',''' ||
+ upper(g_current_user) || '''); end;',
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links during testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 1);
+ select count(*)
+ into num_rows
+ from wt_self_test;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Rows from WT_SELF_TEST@' || g_current_user,
+ check_query_in => 'select count(*) from WT_SELF_TEST@' || g_current_user,
+ against_value_in => num_rows);
+ -------------------------------------- WTPLSQL Testing --
+ rollback;
+ wt_assert.raises (
+ msg_in => 'Close the Database Link',
+ check_call_in => 'alter session close database link ' ||
+ g_current_user,
+ against_exc_in => '');
+ wt_assert.raises (
+ msg_in => 'Drop the Database Link',
+ check_call_in => 'begin wt_job.drop_db_link(''' ||
+ g_current_user || '''); end;',
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.objnotexists (
+ msg_in => g_current_user || ' Database Link',
+ obj_owner_in => g_current_user,
+ obj_name_in => g_current_user,
+ obj_type_in => 'DATABASE LINK');
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of DB Links after testing',
+ check_query_in => 'select count(*) from user_db_links',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Drop Nonexistent DB Link';
+ wt_assert.raises (
+ msg_in => 'Drop BOGUS Database Link',
+ check_call_in => 'begin wt_job.drop_db_link(''BOGUS''); end;',
+ against_exc_in => '');
+ end t_create_drop_db_link;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Waits for all test runners to complete
+procedure wait_for_all_tests
+ (in_timeout_seconds in number default 3600
+ ,in_check_interval_seconds in number default 60)
+is
+ num_jobs number := 0;
+ max_intervals pls_integer;
+begin
+ max_intervals := nvl(in_timeout_seconds,3600) /
+ nvl(in_check_interval_seconds,60);
+ for i in 1 .. max_intervals
+ loop
+ select count(*) into num_jobs
+ from user_scheduler_running_jobs;
+ exit when num_jobs = 0;
+ dbms_lock.sleep(in_check_interval_seconds);
+ end loop;
+ if num_jobs > 0
+ then
+ raise_application_error(-20000, 'WAIT_FOR_ALL_TESTS timeout, ' ||
+ num_jobs || ' jobs still running');
+ end if;
+end wait_for_all_tests;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_wait_for_all_tests
+ is
+ procedure launch_job (in_timeout in number) is
+ plsql_block varchar2(32000);
+ begin
+ plsql_block :=
+ 'declare' || CHR(10) ||
+ ' l_msg varchar2(2000);' || CHR(10) ||
+ ' l_stat integer;' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' dbms_alert.register' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || '''' || CHR(10) ||
+ ' ,cleanup => TRUE);' || CHR(10) ||
+ ' dbms_alert.waitone' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || '''' || CHR(10) ||
+ ' ,message => l_msg' || CHR(10) ||
+ ' ,status => l_stat' || CHR(10) ||
+ ' ,timeout => ' || in_timeout || ');' || CHR(10) ||
+ ' dbms_alert.remove' || CHR(10) ||
+ ' (name => ''WT_JOB_WAIT_UT_ALRT' ||
+ in_timeout || ''');' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => 'WT_JOB_WAIT_UT_' || in_timeout
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block
+ ,enabled => TRUE);
+ dbms_lock.sleep(1); -- Must give job a chance to startup
+ exception when others then
+ wt_assert.isnotnull (
+ msg_in => 't_wait_for_all_tests: "launch_job" Error',
+ check_this_in => SQLERRM);
+ end launch_job;
+ procedure stop_jobs is
+ begin
+ for buff in (select name from sys.DBMS_ALERT_INFO)
+ loop
+ dbms_alert.signal(name => buff.name
+ ,message => 'STOP');
+ end loop;
+ dbms_lock.sleep(1); -- Must give job a chance to process signal
+ dbms_alert.removeall; -- Not sure why this is necessary
+ for buff in (select job_name from user_scheduler_running_jobs)
+ loop
+ dbms_scheduler.stop_job(job_name => buff.job_name
+ ,force => TRUE
+ ,commit_semantics => 'STOP_ON_FIRST_ERROR');
+ end loop;
+ exception when others then
+ wt_assert.isnotnull (
+ msg_in => 't_wait_for_all_tests: "launch_job" Error',
+ check_this_in => SQLERRM);
+ end stop_jobs;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Wait for All Tests Happy Path';
+ launch_job(1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 1);
+ wt_assert.raises(msg_in => 'Wait for All Tests Expected Exception'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(in_timeout_seconds => 1' ||
+ ', in_check_interval_seconds => 0.5); end;'
+ ,against_exc_in => cast (NULL as number));
+ stop_jobs;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Wait for All Tests Timeout';
+ launch_job(10);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 1);
+ wt_assert.raises(msg_in => 'Wait for All Tests Expected Exception'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(in_timeout_seconds => 1' ||
+ ', in_check_interval_seconds => 0.5); end;'
+ ,against_exc_in => -20000);
+ stop_jobs;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from user_scheduler_running_jobs',
+ against_value_in => 0);
+ end t_wait_for_all_tests;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run a test runner in a different schema
+-- Returns before the test runner is complete
+procedure test_run
+ (in_schema_name in varchar2
+ ,in_runner_name in varchar2)
+is
+ plsql_block varchar2(32000);
+begin
+ plsql_block :=
+ 'begin' || CHR(10) ||
+ ' wtplsql.test_run@' || in_schema_name ||
+ '(' || in_runner_name || ');' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => substr('WT_TEST_RUN$' || in_schema_name ||
+ '$' || in_runner_name
+ ,1,30)
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block
+ ,enabled => TRUE);
+end test_run;
+
+
+------------------------------------------------------------
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_run_and_wait_for_job
+ is
+ num_rows number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Run and Wait for Job';
+ tl_compile_db_object ('PACKAGE', 'WT_RUN_AND_WAIT_TEST','
+ procedure wtplsql_run;
+ end WT_RUN_AND_WAIT_TEST;');
+ tl_compile_db_object ('PACKAGE BODY', 'WT_RUN_AND_WAIT_TEST','
+ procedure wtplsql_run is
+ begin
+ wt_assert.isnotnull (
+ msg_in => ''Test1'',
+ check_this_in => ''Test1'');
+ end wtplsql_run;
+ end WT_RUN_AND_WAIT_TEST;');
+ select count(*) into num_rows
+ from wt_test_runs_vw
+ where test_runner_owner = g_current_user
+ and test_runner_name = 'WT_RUN_AND_WAIT_TEST';
+ wt_assert.isnotnull (
+ msg_in => 'Number of Test Runs Before',
+ check_this_in => num_rows);
+ wt_assert.raises
+ (msg_in => 'wt_job.test_run'
+ ,check_call_in => 'begin wt_job.test_run(''' || g_current_user ||
+ ''', ''WT_RUN_AND_WAIT_TEST''); end;'
+ ,against_exc_in => '');
+
+ wt_assert.raises
+ (msg_in => 'wait_for_all_tests'
+ ,check_call_in => 'begin wt_job.wait_for_all_tests(2,0.5); end;'
+ ,against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Runs After',
+ check_query_in => 'select count(*) from wt_test_runs_vw
+ where test_runner_id = wt_test_runner.get_id(''' ||
+ g_current_user ||
+ ''', ''WT_RUN_AND_WAIT_TEST'')',
+ against_value_in => num_rows);
+ tl_drop_db_object('PACKAGE', 'WT_RUN_AND_WAIT_TEST');
+ end t_run_and_wait_for_job;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in a different schema
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- OR or highly modified testing. Skipping Unit Test
+procedure test_all ------%WTPLSQL_begin_ignore_lines%------
+ (in_schema_name in varchar2)
+is
+ plsql_block varchar2(32000);
+begin
+ if in_schema_name is null
+ then
+ raise_application_error(-20000, 'in_schema_name must not be null');
+ end if;
+ plsql_block :=
+ 'begin' || CHR(10) ||
+ ' wtplsql.test_all@' || in_schema_name || ';' || CHR(10) ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => substr('WT_TEST_ALL$' || in_schema_name
+ ,1,128)
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block);
+end test_all; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in all schema in sequence
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- OR or highly modified testing. Skipping Unit Test
+procedure test_all_sequential ------%WTPLSQL_begin_ignore_lines%------
+is
+ plsql_block varchar2(32000);
+begin
+ plsql_block := 'begin' || CHR(10);
+ for buff in (
+ select owner
+ from wt_qual_test_runners_vw
+ group by owner)
+ loop
+ plsql_block := plsql_block ||
+ ' wtplsql.test_all@' || buff.owner || ';' || CHR(10);
+ end loop;
+ plsql_block := plsql_block ||
+ 'end;';
+ dbms_scheduler.create_job
+ (job_name => 'WT_TEST_ALL_SEQUENTIAL'
+ ,job_type => 'PLSQL_BLOCK'
+ ,job_action => plsql_block);
+end test_all_sequential; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all_sequential
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Sequential Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All Sequential',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all_sequential;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Run all test runners in all schema in parallel
+-- Returns before all test runners are complete
+-- NOTE: Unit Testing requires full repeat testing of WTP
+-- or highly modified testing. Skipping Unit Test
+procedure test_all_parallel ------%WTPLSQL_begin_ignore_lines%------
+is
+begin
+ for buff in (
+ select owner
+ from wt_qual_test_runners_vw
+ group by owner)
+ loop
+ test_all(buff.owner);
+ end loop;
+end test_all_parallel; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all_parallel
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test All Parallel Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test All Parallel',
+ check_this_in => 'Requires full repeat testing of WTP or highly modified testing');
+ end t_test_all_parallel;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'WT_JOB:PACKAGE BODY';
+ select username into g_current_user from user_users;
+ -------------------------------------- WTPLSQL Testing --
+ t_create_drop_db_link;
+ t_wait_for_all_tests;
+ t_run_and_wait_for_job;
+ t_test_all;
+ t_test_all_sequential;
+ t_test_all_parallel;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_job;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_JOB.pspec b/wtpsav/WTP/WT_JOB.pspec
new file mode 100644
index 0000000..48e72e5
--- /dev/null
+++ b/wtpsav/WTP/WT_JOB.pspec
@@ -0,0 +1,62 @@
+
+--
+-- Create WTP.WT_JOB Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_JOB
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_JOB"
+ authid definer
+as
+
+ -- Database Links are Required to
+ -- Run Jobs as Different Owners
+ procedure create_db_link
+ (in_schema_name in varchar2
+ ,in_password in varchar2);
+ procedure drop_db_link
+ (in_schema_name in varchar2);
+
+ -- Waits for all test runners to complete
+ procedure wait_for_all_tests
+ (in_timeout_seconds in number default 3600
+ ,in_check_interval_seconds in number default 60);
+
+ -- Run a test runner in a different schema
+ -- Returns before the test runner is complete
+ procedure test_run
+ (in_schema_name in varchar2
+ ,in_runner_name in varchar2);
+
+ -- Run all test runners in a different schema
+ -- Returns before all test runners are complete
+ procedure test_all
+ (in_schema_name in varchar2);
+
+ -- Run all test runners in all schema in sequence
+ -- Returns before all test runners are complete
+ procedure test_all_sequential;
+
+ -- Run all test runners in all schema in parallel
+ -- Returns before all test runners are complete
+ procedure test_all_parallel;
+
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_job;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_PERSIST_REPORT.pbody b/wtpsav/WTP/WT_PERSIST_REPORT.pbody
new file mode 100644
index 0000000..73f86a9
--- /dev/null
+++ b/wtpsav/WTP/WT_PERSIST_REPORT.pbody
@@ -0,0 +1,333 @@
+
+--
+-- Create WTP.WT_PERSIST_REPORT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_PERSIST_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_PERSIST_REPORT"
+as
+
+ g_test_runs_rec wt_test_runs_vw%ROWTYPE;
+ g_dbout_runs_rec wt_dbout_runs_vw%ROWTYPE;
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+------------------------------------------------------------
+procedure p
+ (in_text in varchar2)
+is
+begin
+ dbms_output.put_line(in_text);
+end p;
+
+------------------------------------------------------------
+procedure summary_out
+is
+ asrt_cnt number;
+ asrt_fail number;
+ runner_sec number;
+ tc_cnt number;
+ tc_fail number;
+ tc_yield_pct number;
+ asrt_min_msec number;
+ asrt_max_msec number;
+ asrt_tot_msec number;
+ asrt_avg_msec number;
+ --
+ ignored_lines number;
+ profiled_lines number;
+ excluded_lines number;
+ executed_lines number;
+ notexec_lines number;
+ unknown_lines number;
+ coverage_pct number;
+ trigger_offset number;
+ exec_min_usec number;
+ exec_avg_usec number;
+ exec_max_usec number;
+begin
+ p('');
+ p(' wtPLSQL ' || wtplsql.show_version);
+ p(' Test Results for ' || g_test_runs_rec.test_runner_owner ||
+ '.' || g_test_runs_rec.test_runner_name );
+ p(' Run ID ' || g_test_runs_rec.test_run_id ||
+ ': ' || to_char(g_test_runs_rec.start_dtm
+ ,wt_core_report.g_date_format));
+ p(' --------------------------------------------------------------');
+ --
+ asrt_cnt := nvl(g_test_runs_rec.asrt_cnt ,0);
+ asrt_fail := nvl(g_test_runs_rec.asrt_fail ,0);
+ runner_sec := nvl(g_test_runs_rec.runner_sec ,0);
+ tc_cnt := nvl(g_test_runs_rec.tc_cnt ,0);
+ tc_fail := nvl(g_test_runs_rec.tc_fail ,0);
+ tc_yield_pct := nvl(g_test_runs_rec.tc_yield_pct ,0);
+ asrt_min_msec := nvl(g_test_runs_rec.asrt_min_msec,0);
+ asrt_max_msec := nvl(g_test_runs_rec.asrt_max_msec,0);
+ asrt_tot_msec := nvl(g_test_runs_rec.asrt_tot_msec,0);
+ asrt_avg_msec := nvl(g_test_runs_rec.asrt_avg_msec,0);
+ --
+ p(' Minimum Elapsed msec: ' || to_char(asrt_min_msec,'9999999') ||
+ ' Total Assertions: ' || to_char(asrt_cnt ,'9999999') );
+ p(' Average Elapsed msec: ' || to_char(asrt_avg_msec,'9999999') ||
+ ' Failed Assertions: ' || to_char(asrt_fail ,'9999999') );
+ p(' Maximum Elapsed msec: ' || to_char(asrt_max_msec,'9999999') ||
+ ' Total Testcases: ' || to_char(tc_cnt ,'9999999') );
+ p(' Total Run Time (sec): ' || to_char(runner_sec ,'99990.9') ||
+ ' Failed Testcases: ' || to_char(tc_fail ,'9999999') );
+ p(' ' || ' ' ||
+ ' Testcase Yield: ' || to_char(tc_yield_pct ,'9999999') || '%');
+ --
+ if g_dbout_runs_rec.dbout_name is not null
+ AND g_dbout_runs_rec.profiler_runid is null
+ then
+ p('');
+ p(' Note: ' || g_dbout_runs_rec.dbout_type || ' ' ||
+ g_dbout_runs_rec.dbout_owner || '.' ||
+ g_dbout_runs_rec.dbout_name || ' was not profiled.');
+ end if;
+ --
+ if g_test_runs_rec.error_message is not null
+ then
+ p('');
+ p(' *** Test Runner Error ***');
+ p(g_test_runs_rec.error_message);
+ end if;
+ ----------------------------------------
+ if g_dbout_runs_rec.profiler_runid is null
+ then
+ return;
+ end if;
+ p('');
+ p(' Code Coverage for ' || g_dbout_runs_rec.dbout_type ||
+ ' ' || g_dbout_runs_rec.dbout_owner ||
+ '.' || g_dbout_runs_rec.dbout_name );
+ p(' ----------------------------------------------------------------');
+ --
+ ignored_lines := nvl(g_dbout_runs_rec.ignored_lines, 0);
+ profiled_lines := nvl(g_dbout_runs_rec.profiled_lines, 0);
+ excluded_lines := nvl(g_dbout_runs_rec.excluded_lines, 0);
+ executed_lines := nvl(g_dbout_runs_rec.executed_lines, 0);
+ notexec_lines := nvl(g_dbout_runs_rec.notexec_lines, 0);
+ unknown_lines := nvl(g_dbout_runs_rec.unknown_lines, 0);
+ coverage_pct := nvl(g_dbout_runs_rec.coverage_pct, 0);
+ trigger_offset := nvl(g_dbout_runs_rec.trigger_offset, 0);
+ exec_min_usec := nvl(g_dbout_runs_rec.exec_min_usec, 0);
+ exec_avg_usec := nvl(g_dbout_runs_rec.exec_avg_usec, 0);
+ exec_max_usec := nvl(g_dbout_runs_rec.exec_max_usec, 0);
+ --
+ p(' Ignored Lines: ' || to_char(ignored_lines, '9999999') ||
+ ' Total Profiled Lines: ' || to_char(profiled_lines, '9999999') );
+ p(' Excluded Lines: ' || to_char(excluded_lines, '9999999') ||
+ ' Total Executed Lines: ' || to_char(executed_lines, '9999999') );
+ p(' Minimum LineExec usec: ' || to_char(exec_min_usec, '9999999') ||
+ ' Not Executed Lines: ' || to_char(notexec_lines, '9999999') );
+ p(' Average LineExec usec: ' || to_char(exec_avg_usec, '9999999') ||
+ ' Unknown Lines: ' || to_char(unknown_lines, '9999999') );
+ p(' Maximum LineExec usec: ' || to_char(exec_max_usec, '9999999') ||
+ ' Code Coverage: ' || to_char(coverage_pct, '99990.9') || '%');
+ p(' Trigger Source Offset: ' || to_char(trigger_offset, '9999999') ||
+ ' ' || ' ' );
+end summary_out;
+
+------------------------------------------------------------
+procedure results_out
+ (in_show_pass in boolean)
+is
+ l_rec core_data.results_rec_type;
+ l_show_pass_txt varchar2(1);
+ old_testcase core_data.long_name;
+ show_header boolean := TRUE;
+begin
+ if in_show_pass
+ then
+ l_show_pass_txt := 'Y';
+ else
+ l_show_pass_txt := 'N';
+ end if;
+ for buff in (
+ select * from wt_results_vw
+ where test_run_id = g_test_runs_rec.test_run_id
+ and ( l_show_pass_txt = 'Y'
+ or status != 'PASS')
+ order by result_seq )
+ loop
+ -- Load l_rec
+ l_rec.assertion := buff.assertion;
+ l_rec.pass := (buff.status = 'PASS');
+ l_rec.details := buff.details;
+ l_rec.testcase := buff.testcase;
+ l_rec.message := buff.message;
+ l_rec.interval_msec := buff.interval_msec;
+ -- Remove Consecutive Testcases
+ if l_rec.testcase = old_testcase
+ then
+ l_rec.testcase := '';
+ else
+ old_testcase := l_rec.testcase;
+ end if;
+ -- Display header if needed
+ if show_header
+ then
+ p('');
+ p(' ' || g_test_runs_rec.test_runner_owner ||
+ '.' || g_test_runs_rec.test_runner_name ||
+ ' Test Result Details' );
+ p(' Test Run ID: ' ||
+ g_test_runs_rec.test_run_id );
+ p(' --------------------------------------------------------------');
+ show_header := FALSE;
+ end if;
+ -- Display the result
+ p(wt_core_report.format_test_result(l_rec));
+ end loop;
+end results_out;
+
+------------------------------------------------------------
+procedure profile_out
+ (in_show_aux in boolean)
+is
+ l_header_txt CONSTANT varchar2(2000) :=
+ 'Source TotTime MinTime MaxTime ' || chr(10) ||
+ ' Line Stat Occurs (usec) (usec) (usec) Text' || chr(10) ||
+ '------ ---- ------ --------- ------- --------- ------------';
+ l_show_aux_txt varchar2(1);
+ header_shown boolean;
+ procedure l_show_header is begin
+ p('');
+ p(' ' || g_dbout_runs_rec.dbout_owner ||
+ '.' || g_dbout_runs_rec.dbout_name ||
+ ' ' || g_dbout_runs_rec.dbout_type ||
+ ' Code Coverage Details' );
+ p(' Test Run ID: ' ||
+ g_test_runs_rec.test_run_id );
+ p(' ----------------------------------------------------------------');
+ end l_show_header;
+begin
+ if g_dbout_runs_rec.profiler_runid is null
+ then
+ return;
+ end if;
+ if in_show_aux
+ then
+ l_show_aux_txt := 'Y';
+ else
+ l_show_aux_txt := 'N';
+ end if;
+ header_shown := FALSE;
+ for buff in (
+ select line
+ ,status
+ ,exec_cnt
+ ,exec_tot_usec
+ ,exec_min_usec
+ ,exec_max_usec
+ ,text
+ ,rownum
+ from wt_profiles
+ where test_run_id = g_dbout_runs_rec.test_run_id
+ and ( l_show_aux_txt = 'Y'
+ or status not in ('EXEC','IGNR','UNKN','EXCL'))
+ order by line )
+ loop
+ if not header_shown
+ then
+ l_show_header;
+ p(l_header_txt);
+ header_shown := TRUE;
+ end if;
+ if mod(buff.rownum,25) = 0
+ then
+ p(l_header_txt);
+ end if;
+ p(to_char(buff.line,'99999') ||
+ case buff.status when 'NOTX' then '#NOTX#'
+ else ' ' || rpad(buff.status,4) || ' '
+ end ||
+ to_char(buff.exec_cnt,'99999') || ' ' ||
+ to_char(buff.exec_tot_usec,'99999999') || ' ' ||
+ to_char(buff.exec_min_usec,'999999') || ' ' ||
+ to_char(buff.exec_max_usec,'99999999') || ' ' ||
+ replace(buff.text,CHR(10),'') );
+ end loop;
+end profile_out;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure dbms_out
+ (in_runner_owner in varchar2 default USER
+ ,in_runner_name in varchar2 default null
+ ,in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE)
+is
+
+ g_dbout_runs_recNULL wt_dbout_runs_vw%ROWTYPE;
+
+begin
+
+ for buff in (
+ -- MAX(t2.start_dtm) is a fail-safe if IS_LAST_RUN is not set.
+ select * from wt_test_runs_vw
+ where ( test_runner_name, start_dtm) in
+ (select t2.test_runner_name, max(t2.start_dtm)
+ from wt_test_runs_vw t2
+ where ( ( in_runner_name is not null
+ and in_runner_name = t2.test_runner_name)
+ OR in_runner_name is null )
+ and t2.test_runner_owner = in_runner_owner
+ group by t2.test_runner_name )
+ order by start_dtm, test_runner_name )
+ loop
+
+ -- Load Test Run Record
+ g_test_runs_rec := buff;
+
+ -- Load the DBOUT Record
+ begin
+ select * into g_dbout_runs_rec
+ from wt_dbout_runs_vw
+ where test_run_id = buff.test_run_id;
+ exception when NO_DATA_FOUND
+ then
+ g_dbout_runs_rec := g_dbout_runs_recNULL;
+ end;
+
+ -- Setup Display Order
+ if in_summary_last
+ then
+ if in_detail_level >= 10
+ then
+ profile_out(in_detail_level >= 30);
+ results_out(in_detail_level >= 20);
+ end if;
+ summary_out;
+ else
+ summary_out;
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ profile_out(in_detail_level >= 30);
+ end if;
+ end if;
+
+ p('');
+
+ end loop;
+
+end dbms_out;
+
+
+end wt_persist_report;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_PERSIST_REPORT.pspec b/wtpsav/WTP/WT_PERSIST_REPORT.pspec
new file mode 100644
index 0000000..ff2491d
--- /dev/null
+++ b/wtpsav/WTP/WT_PERSIST_REPORT.pspec
@@ -0,0 +1,58 @@
+
+--
+-- Create WTP.WT_PERSIST_REPORT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_PERSIST_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_PERSIST_REPORT" authid definer
+as
+
+ -- To report a Test Runner result details:
+ -- begin
+ -- wt_persist_report.dbms_out('RUNNER_OWNER', 'RUNNER', 30);
+ -- end;
+ -- /
+
+-- "in_detail_level" settings for DBMS_OUT procedure:
+-- * Less than 10 (including null) - No Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * 10 to 19 - Minimal Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * Failed assertion result details.
+-- * Profiled source lines that were "not executed".
+-- * 20 to 29 - Partial Full Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * All assertion result details.
+-- * Profiled source lines that were "not executed".
+-- * 30 or more - Full Detail
+-- * Assertion results summary.
+-- * Profiled lines summary.
+-- * All assertion result details.
+-- * All profiled source lines.
+
+ procedure dbms_out
+ (in_runner_owner in varchar2 default USER
+ ,in_runner_name in varchar2 default null
+ ,in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE);
+
+end wt_persist_report;
+/
+
+
+-- Grants
+
+grant EXECUTE on "WTP"."WT_PERSIST_REPORT" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/src/core/wt_profiler.pkb b/wtpsav/WTP/WT_PROFILE.pbody
similarity index 51%
rename from src/core/wt_profiler.pkb
rename to wtpsav/WTP/WT_PROFILE.pbody
index ac5a429..6b94d3c 100644
--- a/src/core/wt_profiler.pkb
+++ b/wtpsav/WTP/WT_PROFILE.pbody
@@ -1,24 +1,23 @@
-create or replace package body wt_profiler
+
+--
+-- Create WTP.WT_PROFILE Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_PROFILE
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_PROFILE"
as
- TYPE rec_type is record
- (test_run_id wt_test_runs.id%TYPE
- ,dbout_owner wt_test_runs.dbout_owner%TYPE
- ,dbout_name wt_test_runs.dbout_name%TYPE
- ,dbout_type wt_test_runs.dbout_type%TYPE
- ,prof_runid binary_integer
- ,trigger_offset binary_integer
- ,error_message varchar2(4000));
- g_rec rec_type;
-
TYPE ignr_aa_type is table
of varchar2(1)
index by PLS_INTEGER;
- g_ignr_aa ignr_aa_type;
$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- g_skip_insert boolean := FALSE;
- g_skip_add boolean := FALSE;
+ g_current_user varchar2(30);
+ wtplsql_skip_test boolean := FALSE;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
----------------------
@@ -40,10 +39,10 @@ $THEN
begin
-------------------------------------- WTPLSQL Testing --
-- Wrap in_source to complete the DDL statement
- l_sql_txt := 'create or replace ' || in_ptype || ' ' ||
- in_pname || ' is' || CHR(10) ||
- in_source || CHR(10) ||
- 'end ' || in_pname || ';';
+ l_sql_txt := 'create or replace ' ||
+ in_ptype || ' ' ||
+ in_pname || ' is' || CHR(10) ||
+ in_source || ';' ;
wt_assert.raises
(msg_in => 'Compile ' || in_ptype || ' ' || in_pname
,check_call_in => l_sql_txt
@@ -65,7 +64,7 @@ $THEN
-------------------------------------- WTPLSQL Testing --
wt_assert.objexists (
msg_in => in_pname || ' ' || in_ptype,
- obj_owner_in => USER,
+ obj_owner_in => g_current_user,
obj_name_in => upper(in_pname),
obj_type_in => upper(in_ptype));
end tl_compile_db_object;
@@ -85,7 +84,7 @@ $THEN
,against_exc_in => '');
wt_assert.objnotexists (
msg_in => in_pname || ' ' || in_ptype,
- obj_owner_in => USER,
+ obj_owner_in => g_current_user,
obj_name_in => upper(in_pname),
obj_type_in => upper(in_ptype));
end tl_drop_db_object;
@@ -117,13 +116,15 @@ $THEN
--==============================================================--
-------------------------------------- WTPLSQL Testing --
procedure tl_insert_plsql_profiler_recs
- (in_test_run_id in number)
+ (in_test_run_id in number
+ ,in_run_date_offset in number default 0)
is
l_sql_txt varchar2(4000);
begin
-------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'insert into plsql_profiler_runs (runid)' ||
- ' values (' || in_test_run_id || ')';
+ l_sql_txt := 'insert into plsql_profiler_runs (runid, run_date)' ||
+ ' values (' || in_test_run_id ||
+ ', sysdate + ' || in_run_date_offset || ')';
wt_assert.raises (
msg_in => 'insert plsql_profiler_runs (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
@@ -158,6 +159,9 @@ $THEN
msg_in => 'delete plsql_profiler_data (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_data rows deleted',
+ check_this_in => SQL%ROWCOUNT);
-------------------------------------- WTPLSQL Testing --
l_sql_txt := 'delete from plsql_profiler_units' ||
' where runid = ' || in_test_run_id;
@@ -165,6 +169,9 @@ $THEN
msg_in => 'delete plsql_profiler_units (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_units rows deleted',
+ check_this_in => SQL%ROWCOUNT);
-------------------------------------- WTPLSQL Testing --
l_sql_txt := 'delete from plsql_profiler_runs' ||
' where runid = ' || in_test_run_id;
@@ -172,6 +179,9 @@ $THEN
msg_in => 'delete plsql_profiler_runs (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
against_exc_in => '');
+ wt_assert.isnotnull (
+ msg_in => 'plsql_profiler_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
commit;
end tl_delete_plsql_profiler_recs;
--==============================================================--
@@ -184,9 +194,10 @@ $THEN
begin
-------------------------------------- WTPLSQL Testing --
l_sql_txt := 'insert into wt_test_runs' ||
- ' (id, start_dtm, runner_owner, runner_name)' ||
- ' values (' || in_test_run_id || ', sysdate, USER, ''' ||
- in_runner_name || ''')';
+ ' (id, start_dtm, test_runner_id)' ||
+ ' values (' || in_test_run_id || ', sysdate, ' ||
+ wt_test_runner.dim_id(g_current_user
+ ,in_runner_name) || ')';
wt_assert.raises (
msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
@@ -211,6 +222,10 @@ $THEN
msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_test_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
wt_assert.eqqueryvalue (
msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
check_query_in => 'select count(*) from wt_test_runs' ||
@@ -220,14 +235,14 @@ $THEN
end tl_delete_test_runs;
--==============================================================--
-------------------------------------- WTPLSQL Testing --
- procedure tl_insert_dbout_profiles
- (in_rec in wt_dbout_profiles%ROWTYPE)
+ procedure tl_insert_wt_profiles
+ (in_rec in wt_profiles%ROWTYPE)
is
l_sqlerrm varchar2(4000);
begin
-------------------------------------- WTPLSQL Testing --
begin
- insert into wt_dbout_profiles values in_rec;
+ insert into wt_profiles values in_rec;
l_sqlerrm := SQLERRM;
commit;
exception when others then
@@ -235,39 +250,91 @@ $THEN
end;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq (
- msg_in => 'Insert wt_dbout_profiles (' || in_rec.test_run_id ||
+ msg_in => 'Insert wt_profiles (' || in_rec.test_run_id ||
',' || in_rec.line || ')',
check_this_in => l_sqlerrm,
against_this_in => 'ORA-0000: normal, successful completion');
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles (' || in_rec.test_run_id ||
+ msg_in => 'wt_profiles (' || in_rec.test_run_id ||
',' || in_rec.line || ') Count',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ check_query_in => 'select count(*) from wt_profiles' ||
' where test_run_id = ' || in_rec.test_run_id ||
' and line = ' || in_rec.line,
against_value_in => 1);
- end tl_insert_dbout_profiles;
+ end tl_insert_wt_profiles;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_wt_profiles
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_profiles where test_run_id = ' ||
+ in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_profiles (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_profiles rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_profiles (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_profiles' ||
+ ' where test_run_id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_wt_profiles;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_dbout_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into wt_dbout_runs' ||
+ ' (test_run_id, profiler_runid)' ||
+ ' values (' || in_test_run_id ||
+ ', ' || in_test_run_id || ')';
+ wt_assert.raises (
+ msg_in => 'Insert wt_dbout_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_dbout_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_dbout_runs' ||
+ ' where test_run_id = ' || in_test_run_id,
+ against_value_in => 1);
+ commit;
+ end tl_insert_dbout_runs;
--==============================================================--
-------------------------------------- WTPLSQL Testing --
- procedure tl_delete_dbout_profiles
+ procedure tl_delete_dbout_runs
(in_test_run_id in NUMBER)
is
l_sql_txt varchar2(4000);
begin
-------------------------------------- WTPLSQL Testing --
- l_sql_txt := 'delete from wt_dbout_profiles where test_run_id = ' ||
+ l_sql_txt := 'delete from wt_dbout_runs where test_run_id = ' ||
in_test_run_id;
wt_assert.raises (
- msg_in => 'Delete wt_dbout_profiles (' || in_test_run_id || ')',
+ msg_in => 'Delete wt_dbout_runs (' || in_test_run_id || ')',
check_call_in => l_sql_txt,
against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_dbout_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles (' || in_test_run_id || ') Count',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ msg_in => 'wt_dbout_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_dbout_runs' ||
' where test_run_id = ' || in_test_run_id,
against_value_in => 0);
commit;
- end tl_delete_dbout_profiles;
+ end tl_delete_dbout_runs;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
--==============================================================--
@@ -340,420 +407,117 @@ $END ----------------%WTPLSQL_end_ignore_lines%----------------
------------------------------------------------------------
-procedure delete_plsql_profiler_recs
- (in_profiler_runid in number)
+function clear_plsql_profiler_recs
+ (in_test_run_id in number default NULL)
+ return number
is
- PRAGMA AUTONOMOUS_TRANSACTION;
+ num_recs number := 0;
begin
- delete from plsql_profiler_data
- where runid = in_profiler_runid;
- delete from plsql_profiler_units
- where runid = in_profiler_runid;
- delete from plsql_profiler_runs
- where runid = in_profiler_runid;
- COMMIT;
-end delete_plsql_profiler_recs;
+ for buff in (
+ select runid
+ from plsql_profiler_runs
+ where ( in_test_run_id is null
+ and run_date < sysdate -1 )
+ or runid in (
+ select profiler_runid from wt_dbout_runs
+ where test_run_id = in_test_run_id ) )
+ loop
+ delete from plsql_profiler_data where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ delete from plsql_profiler_units where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ delete from plsql_profiler_runs where runid = buff.runid;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ end loop;
+ return num_recs;
+end clear_plsql_profiler_recs;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
- procedure t_delete_profiler_recs
+ procedure t_clear_plsql_profiler_recs
is
c_test_run_id constant number := -99;
- l_err_stack varchar2(32000);
begin
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 1';
begin
- delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs',
+ check_this_in => clear_plsql_profiler_recs,
+ against_this_in => 0);
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 1',
- check_this_in => l_err_stack);
- tl_count_plsql_profiler_recs(c_test_run_id, 0);
- -------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 2';
+ tl_insert_test_runs(c_test_run_id, 'Delete Profiler Test 2');
+ tl_insert_dbout_runs(c_test_run_id);
tl_insert_plsql_profiler_recs(c_test_run_id);
tl_count_plsql_profiler_recs(c_test_run_id, 1);
+ -------------------------------------- WTPLSQL Testing --
begin
- delete_plsql_profiler_recs(c_test_run_id); -- Should run without error
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs(' || c_test_run_id || ')',
+ check_this_in => clear_plsql_profiler_recs(c_test_run_id),
+ against_this_in => 3);
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs(' || c_test_run_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'delete_plsql_profiler_recs(' || c_test_run_id || ') 2',
- check_this_in => l_err_stack);
tl_count_plsql_profiler_recs(c_test_run_id, 0);
- end t_delete_profiler_recs;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
-procedure find_dbout
- (in_pkg_name in varchar2)
-is
- --
- -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
- -- Within a namespace, no two objects can have the same name. The following
- -- schema objects share one namespace:
- -- -) Packages
- -- -) Private synonyms
- -- -) Sequences
- -- -) Stand-alone procedures
- -- -) Stand-alone stored functions
- -- -) User-defined operators
- -- -) User-defined types
- -- -) Tables
- -- -) Views
- -- Each of the following schema objects has its own namespace:
- -- -) Clusters
- -- -) Constraints
- -- -) Database triggers
- -- -) Dimensions
- -- -) Indexes
- -- -) Materialized views (When you create a materialized view, the database
- -- creates an internal table of the same name. This table has the same
- -- namespace as the other tables in the schema. Therefore, a schema
- -- cannot contain a table and a materialized view of the same name.)
- -- -) Private database links
- -- Because tables and sequences are in the same namespace, a table and a
- -- sequence in the same schema cannot have the same name. However, tables
- -- and indexes are in different namespaces. Therefore, a table and an index
- -- in the same schema can have the same name.
- -- Each schema in the database has its own namespaces for the objects it
- -- contains. This means, for example, that two tables in different schemas
- -- are in different namespaces and can have the same name.
- -- Results are unknown if a Database Object Under Test has the same name in
- -- different namespaces.
- --
- -- Head Regular Expression is
- -- '--% WTPLSQL SET DBOUT "' - literal string
- -- Main Regular Expression is
- -- '[[:alnum:] ._$#:]' - Any alpha, numeric, " ", ".", "_", "$", "#", or ":" character
- -- + - One or more of the previous characters
- -- Tail Regular Expression is
- -- '" %--' - literal string
- C_HEAD_RE CONSTANT varchar2(30) := '--% WTPLSQL SET DBOUT "';
- C_MAIN_RE CONSTANT varchar2(30) := '[[:alnum:] ._$#:]+';
- C_TAIL_RE CONSTANT varchar2(30) := '" %--';
- -- This cursor is used to catch the first occurance of a DBOUT annotation
- cursor c_annotation is
- select regexp_substr(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE) TEXT
- from dba_source src
- where src.owner = USER
- and src.name = in_pkg_name
- and src.type = 'PACKAGE BODY'
- and regexp_like(src.text, C_HEAD_RE||C_MAIN_RE||C_TAIL_RE)
- order by src.line;
- l_target varchar2(32000);
- -- This cursor is used to confirm the PL/SQL source is readable
- cursor c_readable is
- select *
- from dba_source src
- where src.owner = g_rec.dbout_owner
- and src.name = g_rec.dbout_name
- and src.type = g_rec.dbout_type;
- b_readable c_readable%ROWTYPE;
- -- These hold the positions of the separators dot (.) and colon (:)
- l_dot_pos number;
- l_cln_pos number;
-begin
- -- Find the first occurance of the DBOUT annotation
- open c_annotation;
- fetch c_annotation into l_target;
- if c_annotation%NOTFOUND
- then
- -- No annotation was found, close and end
- close c_annotation;
- return;
- end if;
- close c_annotation;
- -- Strip the Head Sub-String
- l_target := regexp_replace(SRCSTR => l_target
- ,PATTERN => '^' || C_HEAD_RE
- ,REPLACESTR => ''
- ,POSITION => 1
- ,OCCURRENCE => 1);
- -- Strip the Tail Sub-String
- l_target := regexp_replace(SRCSTR => l_target
- ,PATTERN => C_TAIL_RE || '$'
- ,REPLACESTR => ''
- ,POSITION => 1
- ,OCCURRENCE => 1);
- -- Locate the Owner/Name separator
- l_dot_pos := instr(l_target,'.');
- l_cln_pos := instr(l_target,':');
- begin
- select obj.owner
- ,obj.object_name
- ,obj.object_type
- into g_rec.dbout_owner
- ,g_rec.dbout_name
- ,g_rec.dbout_type
- from dba_objects obj
- where ( ( -- No separators were given, assume USER is the owner.
- -- No object type was given. This could throw TOO_MANY_ROWS.
- l_dot_pos = 0
- and l_cln_pos = 0
- and obj.owner = USER
- and obj.object_name = l_target )
- OR ( -- No object type was given. This could throw TOO_MANY_ROWS.
- l_dot_pos != 0
- and l_cln_pos = 0
- and obj.owner = substr(l_target, 1, l_dot_pos-1)
- and obj.object_name = substr(l_target, l_dot_pos+1, 512) )
- OR ( -- No object owner was given, assume USER is the owner.
- l_dot_pos = 0
- and l_cln_pos != 0
- and obj.owner = USER
- and obj.object_name = substr(l_target, 1, l_cln_pos-1)
- and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
- OR ( -- All separators were given
- l_dot_pos != 0
- and l_cln_pos != 0
- and obj.owner = substr(l_target, 1, l_dot_pos-1)
- and obj.object_name = substr(l_target, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
- and obj.object_type = substr(l_target, l_cln_pos+1, 512) )
- );
- exception
- when NO_DATA_FOUND
- then
- g_rec.error_message := 'Unable to find database object "' ||
- l_target || '".';
- return;
- when TOO_MANY_ROWS
- then
- g_rec.error_message := 'Found too many database objects "' ||
- l_target || '".';
- return;
- end;
- -- Find the first occurance of any PL/SQL source
- open c_readable;
- fetch c_readable into b_readable;
- if c_readable%NOTFOUND
- then
- if g_rec.dbout_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE BODY',
- 'TYPE BODY', 'TRIGGER')
- then
- -- These object types should have PL/SQL source code available
- --%WTPLSQL_begin_ignore_lines%-- Untestable:
- g_rec.error_message := 'Unable to read source for ' || g_rec.dbout_type ||
- ' ' || g_rec.dbout_owner || '.' || g_rec.dbout_name ;
- --%WTPLSQL_end_ignore_lines%--
- else
- g_rec.prof_runid := -1; -- Don't run profiler.
- end if;
- end if;
- close c_readable;
- --
-end find_dbout;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_find_dbout
- is
- l_recSAVE rec_type;
- l_recNULL rec_type;
- l_recTEST rec_type;
- l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
- -------------------------------------- WTPLSQL Testing --
- procedure run_find_dbout is begin
- l_recSAVE := g_rec;
- g_rec := l_recNULL;
- find_dbout(l_pname);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- end run_find_dbout;
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Setup';
- tl_compile_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source => 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type);
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'PACKAGE BODY');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || USER ||
- '.' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'PACKAGE BODY');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- -- Don't remove the "||", otherwise this will set the DBOUT
- ' --% WTPLSQL SET DBOUT ' || '"BOGUS1" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type);
- wt_assert.eq
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message
- ,against_this_in => 'Unable to find database object "BOGUS1".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- ' --% WTPLSQL SET DBOUT "' || USER ||
- '.' || l_pname || '" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => USER);
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => l_pname);
- wt_assert.eq
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message
- ,against_this_in => 'Found too many database objects "WTP.WT_PROFILE_FIND_DBOUT".');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Sad Path 3';
- tl_compile_db_object
- (in_ptype => 'package body'
- ,in_pname => l_pname
- ,in_source =>
- -- Don't remove the "||", otherwise this will set the DBOUT
- ' --% WTPLSQL SET DBOUT ' || '"SYS.ALL_OBJECTS:VIEW" %--' || CHR(10) ||
- 'begin' || CHR(10) ||
- ' l_junk := 1;' );
- run_find_dbout;
+ tl_delete_dbout_runs(c_test_run_id);
+ tl_delete_test_runs(c_test_run_id);
-------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_owner'
- ,check_this_in => l_recTEST.dbout_owner
- ,against_this_in => 'SYS');
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_name'
- ,check_this_in => l_recTEST.dbout_name
- ,against_this_in => 'ALL_OBJECTS');
+ wt_assert.g_testcase := 'Delete PL/SQL Profiler Records Happy Path 3';
+ tl_insert_test_runs(c_test_run_id, 'Delete Profiler Test 3');
+ tl_insert_dbout_runs(c_test_run_id);
+ tl_insert_plsql_profiler_recs(c_test_run_id, -2);
+ tl_count_plsql_profiler_recs(c_test_run_id, 1);
-------------------------------------- WTPLSQL Testing --
- wt_assert.eq
- (msg_in => 'l_recTEST.dbout_type'
- ,check_this_in => l_recTEST.dbout_type
- ,against_this_in => 'VIEW');
- wt_assert.isnull
- (msg_in => 'l_recTEST.error_message'
- ,check_this_in => l_recTEST.error_message);
+ begin
+ wt_assert.eq (
+ msg_in => 'Run clear_plsql_profiler_recs',
+ check_this_in => clear_plsql_profiler_recs,
+ against_this_in => 3);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run clear_plsql_profiler_recs Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Find DBOUT Teardown';
- tl_drop_db_object(l_pname, 'package');
- end t_find_dbout;
+ tl_count_plsql_profiler_recs(c_test_run_id, 0);
+ tl_delete_dbout_runs(c_test_run_id);
+ tl_delete_test_runs(c_test_run_id);
+ end t_clear_plsql_profiler_recs;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
------------------------------------------------------------
-procedure load_ignr_aa
+function load_ignr_aa
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2
+ ,in_trigger_offset in number)
+ return ignr_aa_type
is
+ l_ignr_aa ignr_aa_type;
cursor c_find_begin is
select line
,instr(text,'--%WTPLSQL_begin_ignore_lines%--') col
from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type
and text like '%--\%WTPLSQL_begin_ignore_lines\%--%' escape '\'
order by line;
buff_find_begin c_find_begin%ROWTYPE;
@@ -762,9 +526,9 @@ is
select line
,instr(text,'--%WTPLSQL_end_ignore_lines%--') col
from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type
and line >= in_line
and text like '%--\%WTPLSQL_end_ignore_lines\%--%' escape '\'
)
@@ -778,7 +542,6 @@ is
,col;
buff_find_end c_find_end%ROWTYPE;
begin
- g_ignr_aa.delete;
open c_find_begin;
loop
fetch c_find_begin into buff_find_begin;
@@ -790,63 +553,55 @@ begin
select max(line)
into buff_find_end.line
from dba_source
- where owner = g_rec.dbout_owner
- and name = g_rec.dbout_name
- and type = g_rec.dbout_type;
+ where owner = in_dbout_owner
+ and name = in_dbout_name
+ and type = in_dbout_type;
end if;
close c_find_end;
- for i in buff_find_begin.line + g_rec.trigger_offset ..
- buff_find_end.line + g_rec.trigger_offset
+ for i in buff_find_begin.line + in_trigger_offset ..
+ buff_find_end.line + in_trigger_offset
loop
- g_ignr_aa(i) := 'X';
+ l_ignr_aa(i) := 'X';
end loop;
end loop;
close c_find_begin;
+ return l_ignr_aa;
end load_ignr_aa;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
procedure t_load_ignr_aa
is
- l_recSAVE rec_type;
- l_ignrSAVE ignr_aa_type;
- l_ignrTEST ignr_aa_type;
- l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
+ l_ignr_aa ignr_aa_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_pname varchar2(128) := 'WT_PROFILE_LOAD_IGNR';
-------------------------------------- WTPLSQL Testing --
procedure run_load_ignr is begin
- l_recSAVE := g_rec;
- l_ignrSAVE := g_ignr_aa;
- g_ignr_aa.delete;
- g_rec.dbout_owner := USER;
- g_rec.dbout_name := l_pname;
- g_rec.dbout_type := 'PACKAGE BODY';
- g_rec.trigger_offset := 0;
- load_ignr_aa;
- l_ignrTEST := g_ignr_aa;
- g_ignr_aa := l_ignrSAVE;
- g_rec := l_recSAVE;
+ l_recSAVE := g_rec;
+ l_ignr_aa := load_ignr_aa(g_current_user
+ ,l_pname
+ ,'PACKAGE BODY'
+ ,0);
+ g_rec := l_recSAVE;
end run_load_ignr;
begin
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Load Ignr Setup';
- wt_assert.isnotnull
- (msg_in => 'Number of IGNR_AA elements'
- ,check_this_in => g_ignr_aa.COUNT);
tl_compile_db_object
(in_ptype => 'package'
,in_pname => l_pname
- ,in_source => ' l_junk number;' );
+ ,in_source => ' l_junk number; end ' || l_pname);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Load Ignr Happy Path 1';
tl_compile_db_object
(in_ptype => 'package body'
,in_pname => l_pname
,in_source => 'begin' || CHR(10) ||
- ' l_junk := 1;' );
+ ' l_junk := 1; end ' || l_pname );
run_load_ignr;
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 0);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Load Ignr Happy Path 2';
@@ -856,19 +611,19 @@ $THEN
,in_source =>
'begin' || CHR(10) || -- Line 2
' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 3
- ' l_junk := 1;' ); -- Line 4
- -- end -- Line 5
+ ' l_junk := 1;' || CHR(10) || -- Line 4
+ 'end ' || l_pname ); -- Line 5
run_load_ignr;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 3);
for i in 3 .. 5
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
@@ -882,18 +637,19 @@ $THEN
' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 4
' l_junk := 2;' || CHR(10) || -- Line 5
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
- ' l_junk := 3;' ); -- Line 7
+ ' l_junk := 3;' || CHR(10) || -- Line 7
+ 'end ' || l_pname ); -- Line 8
run_load_ignr;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 3);
for i in 4 .. 6
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
@@ -909,27 +665,27 @@ $THEN
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
' l_junk := 3;' || CHR(10) || -- Line 7
' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
- -- end -- Line 10
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
run_load_ignr;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 6);
for i in 4 .. 6
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
for i in 8 .. 10
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
@@ -940,11 +696,12 @@ $THEN
,in_source =>
'begin' || CHR(10) || -- Line 2
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 3
- ' l_junk := 4;' ); -- Line 4
+ ' l_junk := 4;' || CHR(10) || -- Line 4
+ 'end ' || l_pname ); -- Line 5
run_load_ignr;
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 0);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Load Ignr Sad Path 2';
@@ -959,18 +716,19 @@ $THEN
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
' l_junk := 3;' || CHR(10) || -- Line 7
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
run_load_ignr;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 3);
for i in 4 .. 6
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
@@ -986,85 +744,366 @@ $THEN
' --%WTPLSQL_begin_' || 'ignore_lines%--' || CHR(10) || -- Line 6
' l_junk := 3;' || CHR(10) || -- Line 7
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 8
- ' l_junk := 4;' ); -- Line 9
+ ' l_junk := 4;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
run_load_ignr;
-------------------------------------- WTPLSQL Testing --
wt_assert.eq
- (msg_in => 'l_ignrTest.COUNT'
- ,check_this_in => l_ignrTest.COUNT
+ (msg_in => 'l_ignr_aa.COUNT'
+ ,check_this_in => l_ignr_aa.COUNT
,against_this_in => 5);
for i in 4 .. 8
loop
wt_assert.eq
- (msg_in => 'l_ignrTest.exists(' || i || ')'
- ,check_this_in => l_ignrTest.exists(i)
+ (msg_in => 'l_ignr_aa.exists(' || i || ')'
+ ,check_this_in => l_ignr_aa.exists(i)
,against_this_in => TRUE);
end loop;
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Load Ignr Teardown';
tl_drop_db_object(l_pname, 'package');
- wt_assert.isnotnull
- (msg_in => 'Number of IGNR_AA elements'
- ,check_this_in => g_ignr_aa.COUNT);
end t_load_ignr_aa;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
------------------------------------------------------------
-procedure insert_dbout_profile
+procedure add_dbout_run
+ (in_profiles_rec in wt_profiles%ROWTYPE)
is
- PRAGMA AUTONOMOUS_TRANSACTION;
- prof_rec wt_dbout_profiles%ROWTYPE;
- l_max_line number;
- procedure l_set_status is begin
- if g_ignr_aa.EXISTS(prof_rec.line)
+begin
+ -- If this raises an exception, it must be done before any other values
+ -- are set because they will not be rolled-back after the "raise".
+ case in_profiles_rec.status
+ when 'EXEC' then
+ g_rec.executed_lines := nvl(g_rec.executed_lines,0) + 1;
+ -- Only count the executed time.
+ g_rec.exec_min_usec := least(nvl(g_rec.exec_min_usec,999999999)
+ ,in_profiles_rec.exec_min_usec);
+ g_rec.exec_max_usec := greatest(nvl(g_rec.exec_max_usec,0)
+ ,in_profiles_rec.exec_max_usec);
+ g_rec.exec_tot_usec := nvl(g_rec.exec_tot_usec,0) +
+ ( in_profiles_rec.exec_tot_usec /
+ in_profiles_rec.exec_cnt );
+ when 'IGNR' then
+ g_rec.ignored_lines := nvl(g_rec.ignored_lines,0) + 1;
+ when 'EXCL' then
+ g_rec.excluded_lines := nvl(g_rec.excluded_lines,0) + 1;
+ when 'NOTX' then
+ g_rec.notexec_lines := nvl(g_rec.notexec_lines,0) + 1;
+ when 'UNKN' then
+ g_rec.unknown_lines := nvl(g_rec.unknown_lines,0) + 1;
+ else
+ raise_application_error(-20011, 'Unknown Profile status "' ||
+ in_profiles_rec.status || '"');
+ end case;
+ g_rec.profiled_lines := nvl(g_rec.profiled_lines,0) + 1;
+end add_dbout_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_add_dbout_run
+ is
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_profileTEST wt_profiles%ROWTYPE;
+ l_sqlerrm varchar2(4000);
+ begin
+ wt_assert.g_testcase := 'Add Profile Testing';
+ -------------------------------------- WTPLSQL Testing --
+ -- Overview:
+ -- 1) Save results in temporary variables
+ -- 2) Clear add_dbout_run variables
+ -- 3) Call add_dbout_run several times with test data.
+ -- 4) Capture test results
+ -- 5) Restore saved results
+ -- 6) Confirm the test results using WT_ASSERT.
+ -------------------------------------- WTPLSQL Testing --
+ l_recSAVE := g_rec;
+ g_rec := l_recTEST;
+ l_profileTEST.test_run_id := -20;
+ l_profileTEST.exec_min_usec := 10;
+ l_profileTEST.exec_max_usec := 20;
+ l_profileTEST.exec_tot_usec := 30;
+ l_profileTEST.exec_cnt := 1;
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXEC';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'IGNR';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'NOTX';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'EXCL';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'EXCL';
+ add_dbout_run(l_profileTEST);
+ l_profileTEST.status := 'UNKN';
+ add_dbout_run(l_profileTEST);
+ -------------------------------------- WTPLSQL Testing --
+ l_profileTEST.status := 'ABC';
+ begin
+ add_dbout_run(l_profileTEST);
+ l_sqlerrm := SQLERRM;
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.profiled_lines',
+ check_this_in => l_recTEST.profiled_lines,
+ against_this_in => 15);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_min_usec',
+ check_this_in => l_recTEST.exec_min_usec,
+ against_this_in => 10);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_max_usec',
+ check_this_in => l_recTEST.exec_max_usec,
+ against_this_in => 20);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.exec_tot_usec',
+ check_this_in => l_recTEST.exec_tot_usec,
+ against_this_in => 150);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.executed_lines',
+ check_this_in => l_recTEST.executed_lines,
+ against_this_in => 5);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.ignored_lines',
+ check_this_in => l_recTEST.ignored_lines,
+ against_this_in => 4);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.notexec_lines',
+ check_this_in => l_recTEST.notexec_lines,
+ against_this_in => 3);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.excluded_lines',
+ check_this_in => l_recTEST.excluded_lines,
+ against_this_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.unknown_lines',
+ check_this_in => l_recTEST.unknown_lines,
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'Add Result Sad Path 1',
+ check_this_in => 'ORA-20011: Unknown Profile status "ABC"',
+ against_this_in => l_sqlerrm);
+ end t_add_dbout_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+------------------------------------------------------------
+function set_prof_status
+ (in_prof_rec wt_profiles%ROWTYPE
+ ,in_max_line number)
+ return varchar2
+is
+begin
+ if in_prof_rec.exec_cnt > 0
+ then
+ -- Found Executed Statement
+ return 'EXEC';
+ end if;
+ if in_prof_rec.exec_cnt = 0
+ and in_prof_rec.exec_tot_usec = 0
+ then
+ -- Check for declaration if Not Executed
+ if regexp_like(in_prof_rec.text, '^[[:space:]]*' ||
+ '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
+ '[[:space:]]', 'i')
then
- -- Found Statement to Ignore
- prof_rec.status := 'IGNR';
- return;
- end if;
- if prof_rec.total_occur > 0
+ -- Exclude declarations if Not Executed
+ return 'EXCL';
+ elsif in_prof_rec.line = in_max_line
+ AND regexp_like(in_prof_rec.text, 'END', 'i')
then
- -- Found Executed Statement
- prof_rec.status := 'EXEC';
- return;
- end if;
- if prof_rec.total_occur = 0
- and prof_rec.total_usecs = 0
+ return 'EXCL';
+ -- ^ - Anchored to start of line
+ -- [[:space:]]* - Zero or more spaces
+ -- [Ee][Nn][Dd] - casefolded "end"
+ -- ( [[:space:]]* - Zero or more spaces
+ -- | - OR
+ -- [[:space:]]+ - One or more spaces followed by
+ -- [A-Za-z0-9_$#]{1,128}) - String of 1 to 128 characters
+ -- )
+ -- [[:space:]]* - Zero or more spaces
+ -- [;] - Semicolon character
+ -- $ - Anchored to end of line
+ elsif regexp_like(in_prof_rec.text, '^[[:space:]]*[Ee][Nn][Dd]([[:space:]]*|[[:space:]]+[A-Za-z0-9_$#]{1,128})[[:space:]]*[;]$')
then
- -- Check for declaration if Not Executed
- if regexp_like(prof_rec.text, '^[[:space:]]*' ||
- '(FUNCTION|PROCEDURE|PACKAGE|TYPE|TRIGGER)' ||
- '[[:space:]]', 'i')
- then
- -- Exclude declarations if Not Executed
- prof_rec.status := 'EXCL';
- elsif prof_rec.line = l_max_line
- AND regexp_like(prof_rec.text, 'END', 'i')
- then
- prof_rec.status := 'EXCL';
- else
- -- Found Not Executed Statement
- prof_rec.status := 'NOTX';
- end if;
- return;
+ return 'EXCL';
+ else
+ -- Found Not Executed Statement
+ return 'NOTX';
end if;
- -- Everything else is unknown
- prof_rec.status := 'UNKN';
- end l_set_status;
+ end if;
+ -- Everything else is unknown
+ return 'UNKN';
+end set_prof_status;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_prof_status
+ is
+ l_prof_rec wt_profiles%ROWTYPE;
+ begin
+ wt_assert.g_testcase := 'Set Prof Status Happy Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Executable Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Executable Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 10;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Not Executed Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'NOTX');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 0;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'Excluded Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'EXCL');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 4;
+ wt_assert.eq(
+ msg_in => 'Unknown Status 1',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 0;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' end set_prof_status_testing;';
+ l_prof_rec.line := 4;
+ wt_assert.eq(
+ msg_in => 'Unknown Status 2',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Set Prof Status Sad Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := NULL;
+ l_prof_rec.exec_tot_usec := NULL;
+ l_prof_rec.text := NULL;
+ l_prof_rec.line := NULL;
+ wt_assert.eq(
+ msg_in => 'NULL Profiler Record',
+ check_this_in => set_prof_status(l_prof_rec, 10),
+ against_this_in => 'UNKN');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := 1;
+ l_prof_rec.exec_tot_usec := 1;
+ l_prof_rec.text := ' function set_prof_status_testing';
+ l_prof_rec.line := 3;
+ wt_assert.eq(
+ msg_in => 'NULL Max Lines',
+ check_this_in => set_prof_status(l_prof_rec, NULL),
+ against_this_in => 'EXEC');
+ -------------------------------------- WTPLSQL Testing --
+ l_prof_rec.exec_cnt := NULL;
+ l_prof_rec.exec_tot_usec := NULL;
+ l_prof_rec.text := NULL;
+ l_prof_rec.line := NULL;
+ wt_assert.eq(
+ msg_in => 'All inputs NULL',
+ check_this_in => set_prof_status(l_prof_rec, NULL),
+ against_this_in => 'UNKN');
+ end t_set_prof_status;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure insert_wt_profile
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+is
+ l_ignr_aa ignr_aa_type;
+ l_prof_rec wt_profiles%ROWTYPE;
+ l_max_line number;
begin
+ l_prof_rec.test_run_id := g_rec.test_run_id;
+ -- Capture load_ignr_aa array
+ l_ignr_aa := load_ignr_aa(in_dbout_owner
+ ,in_dbout_name
+ ,in_dbout_type
+ ,g_rec.trigger_offset);
-- This will not RAISE NO_DATA_FOUND because it uses a GROUP FUNCTION.
select max(ppd.line#) into l_max_line
from plsql_profiler_units ppu
join plsql_profiler_data ppd
on ppd.unit_number = ppu.unit_number
- and ppd.runid = g_rec.prof_runid
- where ppu.unit_owner = g_rec.dbout_owner
- and ppu.unit_name = g_rec.dbout_name
- and ppu.unit_type = g_rec.dbout_type
- and ppu.runid = g_rec.prof_runid;
- load_ignr_aa;
- prof_rec.test_run_id := g_rec.test_run_id;
+ and ppd.runid = g_rec.profiler_runid
+ where ppu.unit_owner = in_dbout_owner
+ and ppu.unit_name = in_dbout_name
+ and ppu.unit_type = in_dbout_type
+ and ppu.runid = g_rec.profiler_runid;
for buf1 in (
select src.line
,ppd.total_occur
@@ -1075,55 +1114,54 @@ begin
from plsql_profiler_units ppu
join plsql_profiler_data ppd
on ppd.unit_number = ppu.unit_number
- and ppd.runid = g_rec.prof_runid
+ and ppd.runid = g_rec.profiler_runid
join dba_source src
on src.line = ppd.line# + g_rec.trigger_offset
- and src.owner = g_rec.dbout_owner
- and src.name = g_rec.dbout_name
- and src.type = g_rec.dbout_type
- where ppu.unit_owner = g_rec.dbout_owner
- and ppu.unit_name = g_rec.dbout_name
- and ppu.unit_type = g_rec.dbout_type
- and ppu.runid = g_rec.prof_runid )
+ and src.owner = in_dbout_owner
+ and src.name = in_dbout_name
+ and src.type = in_dbout_type
+ where ppu.unit_owner = in_dbout_owner
+ and ppu.unit_name = in_dbout_name
+ and ppu.unit_type = in_dbout_type
+ and ppu.runid = g_rec.profiler_runid )
loop
- prof_rec.line := buf1.line;
- prof_rec.total_occur := buf1.total_occur;
- prof_rec.total_usecs := buf1.total_time/1000;
- prof_rec.min_usecs := buf1.min_time/1000;
- prof_rec.max_usecs := buf1.max_time/1000;
- prof_rec.text := buf1.text;
- prof_rec.status := NULL;
- l_set_status;
- insert into wt_dbout_profiles values prof_rec;
-
- $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not g_skip_add then
- $END
- wt_test_run_stat.add_profile(prof_rec);
- $IF $$WTPLSQL_SELFTEST $THEN
+ l_prof_rec.line := buf1.line;
+ l_prof_rec.exec_cnt := buf1.total_occur;
+ l_prof_rec.exec_tot_usec := buf1.total_time/1000;
+ l_prof_rec.exec_min_usec := buf1.min_time/1000;
+ l_prof_rec.exec_max_usec := buf1.max_time/1000;
+ l_prof_rec.text := buf1.text;
+ if l_ignr_aa.EXISTS(l_prof_rec.line)
+ then
+ -- Found Statement to Ignore
+ l_prof_rec.status := 'IGNR';
+ else
+ l_prof_rec.status := set_prof_status(l_prof_rec, l_max_line);
end if;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
-
+ add_dbout_run(l_prof_rec); -- Updates g_rec
+ insert into wt_profiles values l_prof_rec;
end loop;
- COMMIT;
- -- Delete PLSQL Profiler has it's own
- -- PRAGMA AUTONOMOUS_TRANSACTION and COMMIT;
- g_ignr_aa.delete;
- delete_plsql_profiler_recs(g_rec.prof_runid);
-end insert_dbout_profile;
+ -- Update Aggregates in g_rec
+ g_rec.coverage_pct := calc_pct_coverage(g_rec.test_run_id);
+ if nvl(g_rec.executed_lines,0) != 0
+ then
+ g_rec.exec_avg_usec := round(g_rec.exec_tot_usec / g_rec.executed_lines, 2);
+ end if;
+end insert_wt_profile;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
- procedure t_insert_dbout_profile
+ procedure t_insert_wt_profile
is
- units_rec plsql_profiler_units%ROWTYPE;
- data_rec plsql_profiler_data%ROWTYPE;
- l_recSAVE rec_type;
- l_recNULL rec_type;
- c_test_run_id constant number := -97;
- l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
- l_sqlerrm varchar2(4000);
- l_err_stack varchar2(32000);
+ units_rec plsql_profiler_units%ROWTYPE;
+ data_rec plsql_profiler_data%ROWTYPE;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_recNULL wt_dbout_runs%ROWTYPE;
+ c_test_run_id constant number := -97;
+ l_pname varchar2(128) := 'WT_PROFILE_INSERT_DBOUT';
+ l_sqlerrm varchar2(4000);
+ l_err_stack varchar2(32000);
-------------------------------------- WTPLSQL Testing --
procedure insert_plsql_profiler_data
(in_line# in number
@@ -1144,7 +1182,7 @@ $THEN
end;
wt_assert.eq (
msg_in => 'insert plsql_profiler_data (LINE#: ' || data_rec.line#|| ')',
- check_this_in => SQLERRM,
+ check_this_in => l_sqlerrm,
against_this_in => 'ORA-0000: normal, successful completion');
end insert_plsql_profiler_data;
-------------------------------------- WTPLSQL Testing --
@@ -1155,10 +1193,10 @@ $THEN
is
begin
wt_assert.eqqueryvalue
- (msg_in => 'wt_dbout_profiles line ' || in_line# ||
+ (msg_in => 'wt_profiles line ' || in_line# ||
', column ' || in_col_name
,check_query_in => 'select ' || in_col_name ||
- ' from wt_dbout_profiles' ||
+ ' from wt_profiles' ||
' where test_run_id = ' || c_test_run_id ||
' and line = ' || in_line#
,against_value_in => in_value);
@@ -1169,7 +1207,7 @@ $THEN
tl_compile_db_object
(in_ptype => 'package'
,in_pname => l_pname
- ,in_source => ' l_junk number;' );
+ ,in_source => ' l_junk number; end ' || l_pname );
-------------------------------------- WTPLSQL Testing --
tl_compile_db_object
(in_ptype => 'package body'
@@ -1182,14 +1220,15 @@ $THEN
' --%WTPLSQL_end_' || 'ignore_lines%--' || CHR(10) || -- Line 6
' if 0 = 1 then' || CHR(10) || -- Line 7
' l_junk := 3;' || CHR(10) || -- Line 8
- ' end if;' ); -- Line 9
+ ' end if;' || CHR(10) || -- Line 9
+ 'end ' || l_pname ); -- Line 10
tl_insert_plsql_profiler_recs(c_test_run_id);
tl_count_plsql_profiler_recs(c_test_run_id, 1);
tl_insert_test_runs(c_test_run_id, 'Insert DBOUT Test');
-------------------------------------- WTPLSQL Testing --
units_rec.runid := c_test_run_id;
units_rec.unit_number := 1;
- units_rec.unit_owner := USER;
+ units_rec.unit_owner := g_current_user;
units_rec.unit_name := l_pname;
units_rec.unit_type := 'PACKAGE BODY';
units_rec.total_time := 0;
@@ -1197,16 +1236,19 @@ $THEN
begin
insert into plsql_profiler_units values units_rec;
commit;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
+ wt_assert.eq (
msg_in => 'insert UNIT 1 into plsql_profiler_units',
- check_this_in => l_err_stack);
+ check_this_in => substr(l_err_stack,1,39),
+ against_this_in => 'ORA-0000: normal, successful completion');
wt_assert.eqqueryvalue
(msg_in => 'Number of UNIT 1 plsql_profiler_units'
,check_query_in => 'select count(*) from plsql_profiler_units' ||
@@ -1235,29 +1277,37 @@ $THEN
,against_value_in => 8);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Insert DBOUT Profile Happy Path';
- l_recSAVE := g_rec;
- g_rec.test_run_id := c_test_run_id;
- g_rec.dbout_owner := USER;
- g_rec.dbout_name := l_pname;
- g_rec.dbout_type := 'PACKAGE BODY';
- g_rec.prof_runid := c_test_run_id;
- g_rec.trigger_offset := 0;
- g_rec.error_message := '';
- -------------------------------------- WTPLSQL Testing --
- g_skip_add := TRUE;
+ l_recSAVE := g_rec;
+ g_rec.test_run_id := c_test_run_id;
+ g_rec.profiler_runid := c_test_run_id;
+ g_rec.trigger_offset := 0;
+ -------------------------------------- WTPLSQL Testing --
begin
- insert_dbout_profile;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ insert_wt_profile(g_current_user
+ ,l_pname
+ ,'PACKAGE BODY');
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
end;
- g_skip_add := FALSE;
+ l_recTEST := g_rec;
g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
+ wt_assert.eq (
+ msg_in => 'insert_wt_profile SQLERRM',
+ check_this_in => substr(l_err_stack,1,39),
+ against_this_in => 'ORA-0000: normal, successful completion');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Check Coverage Percent',
+ check_this_in => l_recTEST.coverage_pct,
+ against_this_in => 75);
+ wt_assert.isnotnull (
+ msg_in => 'Check Line Execution Average Microseconds',
+ check_this_in => l_recTEST.exec_avg_usec);
-------------------------------------- WTPLSQL Testing --
test_dbout_profiler(1, 'STATUS', 'EXCL');
test_dbout_profiler(1, 'TEXT', 'package body WT_PROFILE_INSERT_DBOUT is' || CHR(10));
@@ -1277,12 +1327,12 @@ $THEN
test_dbout_profiler(10, 'TEXT', 'end WT_PROFILE_INSERT_DBOUT;');
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- tl_delete_dbout_profiles(c_test_run_id);
+ tl_delete_wt_profiles(c_test_run_id);
tl_delete_test_runs(c_test_run_id);
tl_delete_plsql_profiler_recs(c_test_run_id);
tl_count_plsql_profiler_recs(c_test_run_id, 0);
tl_drop_db_object(l_pname, 'package');
- end t_insert_dbout_profile;
+ end t_insert_wt_profile;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
@@ -1292,402 +1342,113 @@ $END ----------------%WTPLSQL_end_ignore_lines%----------------
------------------------------------------------------------
-procedure initialize
- (in_test_run_id in number,
- in_runner_name in varchar2,
- out_dbout_owner out varchar2,
- out_dbout_name out varchar2,
- out_dbout_type out varchar2,
- out_trigger_offset out number,
- out_profiler_runid out number,
- out_error_message out varchar2)
+function is_profilable -- find_dbout
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+ return boolean
is
- l_rec_NULL rec_type;
- l_retnum binary_integer;
+ cursor c_readable
+ is
+ select src.name
+ from dba_source src
+ where src.owner = in_dbout_owner
+ and src.name = in_dbout_name
+ and src.type = in_dbout_type;
+ b_readable c_readable%ROWTYPE;
+ ret_bool boolean;
begin
- -- Reset variables
- out_dbout_owner := '';
- out_dbout_name := '';
- out_dbout_type := '';
- out_trigger_offset := NULL;
- out_profiler_runid := NULL;
- out_error_message := '';
- g_rec := l_rec_NULL;
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- -- In case a test failed and left this set to TRUE
- g_skip_insert := FALSE;
- g_skip_add := FALSE;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- -- Abort if there is no Test Run ID
- if in_test_run_id is null
- then
- raise_application_error (-20004, 'i_test_run_id is null');
- end if;
- g_rec.test_run_id := in_test_run_id;
- -- Find the Database Object Under Test
- find_dbout(in_pkg_name => in_runner_name);
- out_dbout_owner := g_rec.dbout_owner;
- out_dbout_name := g_rec.dbout_name;
- out_dbout_type := g_rec.dbout_type;
- out_error_message := g_rec.error_message;
- -- There muxt be a name and no error message
- if g_rec.dbout_name is null -- No DBOUT notation
- or g_rec.error_message is not null -- Error with DBOUT or Source
- or g_rec.prof_runid = -1 -- Skip Profiling
- then
- g_rec.prof_runid := NULL;
- return;
- end if;
- -- Calculate the trigger offset, if any.
- g_rec.trigger_offset := wt_profiler.trigger_offset
- (dbout_owner_in => g_rec.dbout_owner
- ,dbout_name_in => g_rec.dbout_name
- ,dbout_type_in => g_rec.dbout_type );
- out_trigger_offset := g_rec.trigger_offset;
- -- Check Versions
- l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
- if l_retnum <> 0 then
- ------%WTPLSQL_begin_ignore_lines%------ Can't test this
- --dbms_profiler.get_version(major_version, minor_version);
- raise_application_error(-20005,
- 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
- ----------------%WTPLSQL_end_ignore_lines%----------------
- end if;
- -- This starts the PROFILER Running!!!
- --dbms_output.put_line('DEBUG1. g_rec.prof_runid = ' || g_rec.prof_runid);
- l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.prof_runid);
- if l_retnum <> 0 then
- ------%WTPLSQL_begin_ignore_lines%------ Can't test this
- raise_application_error(-20006,
- 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
- ----------------%WTPLSQL_end_ignore_lines%----------------
- end if;
- -- Everything is OK, set the Profiler Run ID
- out_profiler_runid := g_rec.prof_runid;
- --dbms_output.put_line('DEBUG2. g_rec.prof_runid = ' || g_rec.prof_runid);
-end initialize;
+ -- Find the first occurance of any PL/SQL source
+ open c_readable;
+ fetch c_readable into b_readable;
+ ret_bool := c_readable%FOUND;
+ close c_readable;
+ return ret_bool;
+end is_profilable;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
- procedure t_initialize
+ procedure t_is_profilable
is
- c_test_run_id constant number := -96;
- l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE';
- l_recSAVE rec_type;
- l_recTEST rec_type;
- l_recOUT rec_type;
- l_sqlerrm varchar2(4000);
+ l_pname varchar2(128) := 'WT_PROFILE_FIND_DBOUT';
begin
-------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Setup';
+ wt_assert.g_testcase := 't_is_profilable Happy Path 1';
tl_compile_db_object
(in_ptype => 'package'
,in_pname => l_pname
- ,in_source => ' l_junk number;' );
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test HAPPY Path 1';
+ ,in_source => ' l_junk number;' || CHR(10) ||
+ 'end ' || l_pname );
tl_compile_db_object
(in_ptype => 'package body'
,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- ' l_junk := 7;' ); -- Line 3
+ ,in_source => 'begin' || CHR(10) ||
+ 'l_junk := 1;' || CHR(10) ||
+ 'end ' || l_pname );
-------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- initialize
- (in_test_run_id => c_test_run_id,
- in_runner_name => l_pname,
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT dbout_owner',
- check_this_in => l_recOUT.dbout_owner);
- wt_assert.isnull (
- msg_in => 'OUT dbout_name',
- check_this_in => l_recOUT.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT dbout_type',
- check_this_in => l_recOUT.dbout_type);
- wt_assert.isnull (
- msg_in => 'OUT prof_runid',
- check_this_in => l_recOUT.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'OUT trigger_offset',
- check_this_in => l_recOUT.trigger_offset);
- wt_assert.isnull (
- msg_in => 'OUT error_message',
- check_this_in => l_recOUT.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type);
- wt_assert.isnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
+ wt_assert.eq
+ (msg_in => 'Check Package'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PACKAGE')
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'Check Package Body'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PACKAGE BODY')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'package');
-------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test HAPPY Path 2';
+ wt_assert.g_testcase := 't_is_profilable Happy Path 2';
tl_compile_db_object
- (in_ptype => 'package body'
+ (in_ptype => 'procedure'
,in_pname => l_pname
- ,in_source =>
- 'begin' || CHR(10) || -- Line 2
- '--% WTPLSQL SET DBOUT "' || l_pname ||
- ':PACKAGE BODY" %--' || CHR(10) || -- Line 3
- ' l_junk := 7;' ); -- Line 4
- -------------------------------------- WTPLSQL Testing --
- l_recSAVE := g_rec;
- initialize
- (in_test_run_id => c_test_run_id,
- in_runner_name => l_pname,
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
+ ,in_source => ' l_junk number;' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' l_junk := 1;' || CHR(10) ||
+ 'end ' || l_pname );
-------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT dbout_owner',
- check_this_in => l_recOUT.dbout_owner,
- against_this_in => USER);
- wt_assert.eq (
- msg_in => 'OUT dbout_name',
- check_this_in => l_recOUT.dbout_name,
- against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT dbout_type',
- check_this_in => l_recOUT.dbout_type,
- against_this_in => 'PACKAGE BODY');
- wt_assert.isnotnull (
- msg_in => 'OUT prof_runid',
- check_this_in => l_recOUT.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'OUT trigger_offset',
- check_this_in => l_recOUT.trigger_offset,
- against_this_in => 0);
- wt_assert.isnull (
- msg_in => 'OUT error_message',
- check_this_in => l_recOUT.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner,
- against_this_in => USER);
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name,
- against_this_in => l_pname);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type,
- against_this_in => 'PACKAGE BODY');
- wt_assert.isnotnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.eq (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset,
- against_this_in => 0);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Initialize Test Sad Path 1';
- l_recSAVE := g_rec;
- begin
- initialize
- (in_test_run_id => null,
- in_runner_name => 'Sad Path 1',
- out_dbout_owner => l_recOUT.dbout_owner,
- out_dbout_name => l_recOUT.dbout_name,
- out_dbout_type => l_recOUT.dbout_type,
- out_trigger_offset => l_recOUT.trigger_offset,
- out_profiler_runid => l_recOUT.prof_runid,
- out_error_message => l_recOUT.error_message);
- l_sqlerrm := SQLERRM;
- -------------------------------------- WTPLSQL Testing --
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => 'SQLERRM',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-20004: i_test_run_id is null');
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Insert DBOUT Profile Teardown';
- tl_drop_db_object
- (in_ptype => 'package'
- ,in_pname => l_pname);
- end t_initialize;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
-
-------------------------------------------------------------
--- Because this procedure is called to cleanup after erorrs,
--- it must be able to run multiple times without causing damage.
-procedure finalize
-is
- l_rec_NULL rec_type;
-begin
- if g_rec.prof_runid is null
- then
- return;
- end if;
- if g_rec.test_run_id is null
- then
- raise_application_error (-20000, 'g_rec.test_run_id is null');
- end if;
- $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
- $THEN
- if not g_skip_insert
- then
- $END
- begin
- -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
- --dbms_output.put_line('DEBUG3. g_rec.prof_runid = ' || g_rec.prof_runid);
- dbms_profiler.STOP_PROFILER;
- exception when others then
- g_rec := l_rec_NULL;
- --dbms_output.put_line('DEBUG4. SQLERRM = ' || sqlerrm);
- raise;
- end;
- insert_dbout_profile;
- $IF $$WTPLSQL_SELFTEST
- $THEN
- end if;
- $END ----------------%WTPLSQL_end_ignore_lines%----------------
- g_rec := l_rec_NULL;
-end finalize;
-
-$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
-$THEN
- procedure t_finalize
- is
- l_recSAVE rec_type;
- l_recTEST rec_type;
- l_sqlerrm varchar2(4000);
- l_err_stack varchar2(32000);
- begin
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path 1';
- l_recSAVE := g_rec;
- g_rec.prof_runid := NULL;
- wt_assert.isnull (
- msg_in => 'g_rec.prof_runid',
- check_this_in => g_rec.prof_runid);
- -------------------------------------- WTPLSQL Testing --
- begin
- finalize;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'format_error_stack and format_error_backtrace',
- check_this_in => l_err_stack);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Happy Path 2';
- l_recSAVE := g_rec;
- g_rec.test_run_id := -1;
- g_rec.dbout_owner := 'TEST OWNER';
- g_rec.dbout_name := 'TEST NAME';
- g_rec.dbout_type := 'TEST TYPE';
- g_rec.prof_runid := -2;
- g_rec.trigger_offset := -3;
- g_rec.error_message := 'TEST MESSAGE';
- -------------------------------------- WTPLSQL Testing --
- g_skip_insert := TRUE;
- begin
- finalize;
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
- end;
- g_skip_insert := FALSE;
- -------------------------------------- WTPLSQL Testing --
- l_recTEST := g_rec;
- g_rec := l_recSAVE;
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
- -------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.test_run_id',
- check_this_in => l_recTEST.test_run_id);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_owner',
- check_this_in => l_recTEST.dbout_owner);
+ wt_assert.eq
+ (msg_in => 'Check Procedure'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'PROCEDURE')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'procedure');
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_name',
- check_this_in => l_recTEST.dbout_name);
- wt_assert.isnull (
- msg_in => 'l_recTEST.dbout_type',
- check_this_in => l_recTEST.dbout_type);
+ wt_assert.g_testcase := 't_is_profilable Happy Path 3';
+ tl_compile_db_object
+ (in_ptype => 'type'
+ ,in_pname => l_pname
+ ,in_source => ' object(l_junk number' || CHR(10) ||
+ ' ,member procedure test1' || CHR(10) ||
+ ' )' );
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'l_recTEST.prof_runid',
- check_this_in => l_recTEST.prof_runid);
- wt_assert.isnull (
- msg_in => 'l_recTEST.trigger_offset',
- check_this_in => l_recTEST.trigger_offset);
- wt_assert.isnull (
- msg_in => 'l_recTEST.error_message',
- check_this_in => l_recTEST.error_message);
+ tl_compile_db_object
+ (in_ptype => 'type body'
+ ,in_pname => l_pname
+ ,in_source => 'member procedure test1' || CHR(10) ||
+ 'is' || CHR(10) ||
+ 'begin' || CHR(10) ||
+ ' l_junk := 1;' || CHR(10) ||
+ 'end;' || CHR(10) ||
+ 'end' );
-------------------------------------- WTPLSQL Testing --
- wt_assert.g_testcase := 'Finalize Sad Path 1';
- l_recSAVE := g_rec;
- g_rec.prof_runid := -1;
- g_rec.test_run_id := NULL;
- begin
- finalize;
- exception when others then
- l_sqlerrm := SQLERRM;
- end;
+ wt_assert.eq
+ (msg_in => 'Check Type'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'TYPE')
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'Check Type Body'
+ ,check_this_in => is_profilable(g_current_user, l_pname, 'TYPE BODY')
+ ,against_this_in => TRUE);
+ tl_drop_db_object(l_pname, 'type');
-------------------------------------- WTPLSQL Testing --
- g_rec := l_recSAVE;
- wt_assert.eq (
- msg_in => 'SQLERRM',
- check_this_in => l_sqlerrm,
- against_this_in => 'ORA-20000: g_rec.test_run_id is null');
- end t_finalize;
+ wt_assert.g_testcase := 't_is_profilable Happy Path 4';
+ wt_assert.eq
+ (msg_in => 'Check Missing Function'
+ ,check_this_in => is_profilable(g_current_user, 'BOGUS_FUNCTION_123', 'FUNCTION')
+ ,against_this_in => FALSE);
+ wt_assert.eq
+ (msg_in => 'Check Table'
+ ,check_this_in => is_profilable(g_current_user, 'WT_PROFILES', 'TABLE')
+ ,against_this_in => FALSE);
+ end t_is_profilable;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
@@ -1738,14 +1499,14 @@ $THEN
wt_assert.g_testcase := 'Trigger Offset Happy Path';
wt_assert.eq (
msg_in => 'Trigger Test',
- check_this_in => trigger_offset (dbout_owner_in => USER
+ check_this_in => trigger_offset (dbout_owner_in => g_current_user
,dbout_name_in => 'WT_SELF_TEST$TEST'
,dbout_type_in => 'TRIGGER'),
against_this_in => 3);
-------------------------------------- WTPLSQL Testing --
wt_assert.eq (
msg_in => 'Package Test',
- check_this_in => trigger_offset (dbout_owner_in => USER
+ check_this_in => trigger_offset (dbout_owner_in => g_current_user
,dbout_name_in => 'WT_PROFILER'
,dbout_type_in => 'PACKAGE BODY'),
against_this_in => 0);
@@ -1766,20 +1527,20 @@ function calc_pct_coverage
(in_test_run_id in number)
return number
IS
-BEGIN
- for buff in (
+ cursor main is
select sum(case status when 'EXEC' then 1 else 0 end) HITS
,sum(case status when 'NOTX' then 1 else 0 end) MISSES
- from wt_dbout_profiles p
- where test_run_id = in_test_run_id )
- loop
- if buff.hits + buff.misses = 0
- then
- return -1;
- else
- return round(100 * buff.hits / (buff.hits + buff.misses),2);
- end if;
- end loop;
+ from wt_profiles p
+ where test_run_id = in_test_run_id;
+ buff main%ROWTYPE;
+BEGIN
+ open main;
+ fetch main into buff;
+ close main;
+ if nvl(buff.hits + buff.misses, 0) != 0
+ then
+ return round(100 * buff.hits / (buff.hits + buff.misses),2);
+ end if;
return null;
END calc_pct_coverage;
@@ -1788,58 +1549,57 @@ $THEN
procedure t_calc_pct_coverage
is
c_test_run_id constant number := -95;
- l_rec wt_dbout_profiles%ROWTYPE;
+ l_profile wt_profiles%ROWTYPE;
begin
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Calculate Percent Coverage Setup';
tl_insert_test_runs(c_test_run_id, 'Calculate Offset Test');
- l_rec.test_run_id := c_test_run_id;
- l_rec.total_occur := 1;
- l_rec.total_usecs := 1;
- l_rec.min_usecs := 1;
- l_rec.max_usecs := 1;
+ l_profile.test_run_id := c_test_run_id;
+ l_profile.exec_cnt := 1;
+ l_profile.exec_tot_usec := 1;
+ l_profile.exec_min_usec := 1;
+ l_profile.exec_max_usec := 1;
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 1';
- l_rec.line := 1;
- l_rec.status := 'EXEC';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 2;
- l_rec.status := 'NOTX';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 3;
- l_rec.status := 'EXEC';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
+ l_profile.line := 1;
+ l_profile.status := 'EXEC';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 2;
+ l_profile.status := 'NOTX';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 3;
+ l_profile.status := 'EXEC';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
wt_assert.eq (
msg_in => 'Main Test',
check_this_in => calc_pct_coverage(c_test_run_id),
against_this_in => 66.67);
- tl_delete_dbout_profiles(c_test_run_id);
+ tl_delete_wt_profiles(c_test_run_id);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Calculate Percent Coverage Happy Path 2';
- l_rec.line := 1;
- l_rec.status := 'EXCL';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 2;
- l_rec.status := 'UNKN';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- -------------------------------------- WTPLSQL Testing --
- l_rec.line := 3;
- l_rec.status := 'EXCL';
- l_rec.text := 'Testing ' || l_rec.line;
- tl_insert_dbout_profiles(l_rec);
- wt_assert.eq (
+ l_profile.line := 1;
+ l_profile.status := 'EXCL';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 2;
+ l_profile.status := 'UNKN';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ -------------------------------------- WTPLSQL Testing --
+ l_profile.line := 3;
+ l_profile.status := 'EXCL';
+ l_profile.text := 'Testing ' || l_profile.line;
+ tl_insert_wt_profiles(l_profile);
+ wt_assert.isnull (
msg_in => 'Main Test',
- check_this_in => calc_pct_coverage(c_test_run_id),
- against_this_in => -1);
- tl_delete_dbout_profiles(c_test_run_id);
+ check_this_in => calc_pct_coverage(c_test_run_id));
+ tl_delete_wt_profiles(c_test_run_id);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Calculate Percent Coverage Sad Path';
wt_assert.isnull (
@@ -1856,29 +1616,344 @@ $END ----------------%WTPLSQL_end_ignore_lines%----------------
------------------------------------------------------------
-procedure delete_records
- (in_test_run_id in number)
+procedure initialize
+is
+ l_recNULL wt_dbout_runs%ROWTYPE;
+ l_retnum binary_integer;
+ junk number;
+begin
+ -- Clear g_rec
+ g_rec := l_recNULL;
+ -- Clear PLSQL Profiler Results Older than 1 Day
+ junk := clear_plsql_profiler_recs;
+ -- Check Versions
+ l_retnum := dbms_profiler.INTERNAL_VERSION_CHECK;
+ if l_retnum <> 0 then
+ ------%WTPLSQL_begin_ignore_lines%------ Can't test this
+ --dbms_profiler.get_version(major_version, minor_version);
+ raise_application_error(-20005,
+ 'dbms_profiler.INTERNAL_VERSION_CHECK returned: ' || get_error_msg(l_retnum));
+ ----------------%WTPLSQL_end_ignore_lines%----------------
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- This starts the PROFILER Running!!!
+ --dbms_output.put_line('running start_profiler in ' || wt_assert.g_testcase);
+ l_retnum := dbms_profiler.START_PROFILER(run_number => g_rec.profiler_runid);
+ if l_retnum <> 0 then
+ raise_application_error(-20006,
+ 'dbms_profiler.START_PROFILER returned: ' || get_error_msg(l_retnum));
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ else
+ g_rec.profiler_runid := 0;
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end initialize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ l_pname varchar2(128) := 'WT_PROFILE_INITIALIZE';
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_sqlerrm varchar2(4000);
+ begin
+ wt_assert.g_testcase := 'Initialize Happy Path 1';
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ wtplsql_skip_test := TRUE;
+ initialize;
+ wtplsql_skip_test := FALSE;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnotnull (
+ msg_in => 'l_recTEST.profiler_runid',
+ check_this_in => l_recTEST.profiler_runid);
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Because this procedure is called to cleanup after erorrs,
+-- it must be able to run multiple times without causing damage.
+procedure finalize
+ (in_test_run_id in number)
is
- l_profiler_runid number;
+ junk number;
begin
- select profiler_runid into l_profiler_runid
- from wt_test_runs where id = in_test_run_id;
- delete_plsql_profiler_recs(l_profiler_runid);
- delete from wt_dbout_profiles
- where test_run_id = in_test_run_id;
-exception
- when NO_DATA_FOUND
+ -- Return if not profiling
+ if g_rec.profiler_runid is null
then
return;
-end delete_records;
+ end if;
+ -- Abort if there is no Test Run ID
+ if in_test_run_id is null
+ then
+ raise_application_error (-20004, 'i_test_run_id is null');
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- DBMS_PROFILER.FLUSH_DATA is included with DBMS_PROFILER.STOP_PROFILER
+ --dbms_output.put_line('running stop_profiler in ' || wt_assert.g_testcase);
+ dbms_profiler.STOP_PROFILER;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ if is_profilable(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type)
+ then
+ -- Set g_rec values
+ g_rec.test_run_id := in_test_run_id;
+ g_rec.trigger_offset := trigger_offset(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ -- Save PLSQL Profiler Results (Also updates g_rec)
+ insert_wt_profile(core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ -- Save g_rec
+ insert into wt_dbout_runs values g_rec;
+ commit;
+ end if;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_test
+ then
+ $END
+ --
+ -- Clear PLSQL Profiler Results for this Run
+ junk := clear_plsql_profiler_recs(g_rec.test_run_id);
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end finalize;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
- procedure t_delete_records
+ procedure t_finalize
is
- c_test_run_id constant number := -98;
- l_rec wt_dbout_profiles%ROWTYPE;
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_recSAVE wt_dbout_runs%ROWTYPE;
+ l_recTEST wt_dbout_runs%ROWTYPE;
+ l_sqlerrm varchar2(4000);
l_err_stack varchar2(32000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.error_message := NULL;
+ g_rec.profiler_runid := NULL;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-1);
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ exception when others then
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-1);
+ tl_delete_wt_profiles(-1);
+ tl_delete_test_runs(-1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'finalize(-1) SQLERRM',
+ check_this_in => substr(l_err_stack,1,39),
+ against_this_in => 'ORA-0000: normal, successful completion');
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 2';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.dbout_owner := 'TEST OWNER';
+ core_data.g_run_rec.dbout_name := 'TEST NAME';
+ core_data.g_run_rec.dbout_type := 'TEST TYPE';
+ core_data.g_run_rec.error_message := NULL;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-2);
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ exception when others then
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-2);
+ tl_delete_wt_profiles(-2);
+ tl_delete_test_runs(-2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'finalize(-2) SQLERRM',
+ check_this_in => substr(l_err_stack,1,39),
+ against_this_in => 'ORA-0000: normal, successful completion');
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ wt_assert.isnotnull (
+ msg_in => 'l_recTEST.profiler_runid',
+ check_this_in => l_recTEST.profiler_runid);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id);
+ wt_assert.isnull (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Happy Path 3';
+ tl_insert_test_runs(-3, 'Finalize Happy Path 3');
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ core_data.g_run_rec.dbout_owner := g_current_user;
+ core_data.g_run_rec.dbout_name := 'WT_PROFILE';
+ core_data.g_run_rec.dbout_type := 'PACKAGE BODY';
+ core_data.g_run_rec.error_message := NULL;
+ g_rec.profiler_runid := -33;
+ g_rec.trigger_offset := -33;
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(-3);
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ exception when others then
+ l_err_stack := SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack ;
+ end;
+ wtplsql_skip_test := FALSE;
+ -------------------------------------- WTPLSQL Testing --
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ tl_delete_dbout_runs(-3);
+ tl_delete_wt_profiles(-3);
+ tl_delete_test_runs(-3);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'finalize(-3) SQLERRM',
+ check_this_in => substr(l_err_stack,1,39),
+ against_this_in => 'ORA-0000: normal, successful completion');
+ wt_assert.isnull (
+ msg_in => 'l_cdr_recTEST.error_message',
+ check_this_in => l_cdr_recTEST.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_recTEST.test_run_id',
+ check_this_in => l_recTEST.test_run_id,
+ against_this_in => -3);
+ wt_assert.eq (
+ msg_in => 'l_recTEST.trigger_offset',
+ check_this_in => l_recTEST.trigger_offset,
+ against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalize Sad Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_recSAVE := g_rec;
+ g_rec.profiler_runid := -4;
+ wtplsql_skip_test := TRUE;
+ begin
+ finalize(null);
+ l_sqlerrm := SQLERRM;
+ -------------------------------------- WTPLSQL Testing --
+ exception when others then
+ l_sqlerrm := SQLERRM;
+ end;
+ wtplsql_skip_test := FALSE;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_recTEST := g_rec;
+ g_rec := l_recSAVE;
+ wt_assert.eq (
+ msg_in => 'finalize(null) SQLERRM',
+ check_this_in => l_sqlerrm,
+ against_this_in => 'ORA-20004: i_test_run_id is null');
+ end t_finalize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ num_recs number;
+begin
+ delete from wt_profiles where test_run_id = in_test_run_id;
+ num_recs := SQL%ROWCOUNT;
+ delete from wt_dbout_runs where test_run_id = in_test_run_id;
+ num_recs := num_recs + SQL%ROWCOUNT;
+ if in_test_run_id is not null
+ then
+ num_recs := num_recs + clear_plsql_profiler_recs(in_test_run_id);
+ end if;
+ return num_recs;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ c_test_run_id constant number := -98;
+ l_run wt_dbout_runs%ROWTYPE;
+ l_profile wt_profiles%ROWTYPE;
begin
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete Records Setup';
@@ -1888,104 +1963,115 @@ $THEN
' where id = ' || c_test_run_id,
against_value_in => 0);
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 0',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ msg_in => 'wt_profiles Count 0',
+ check_query_in => 'select count(*) from wt_profiles' ||
' where test_run_id = ' || c_test_run_id,
against_value_in => 0);
tl_insert_test_runs(c_test_run_id, 'Delete Records Test');
-------------------------------------- WTPLSQL Testing --
- l_rec.test_run_id := c_test_run_id;
- l_rec.line := 1;
- l_rec.status := 'EXEC';
- l_rec.total_occur := 1;
- l_rec.total_usecs := 1;
- l_rec.min_usecs := 1;
- l_rec.max_usecs := 1;
- l_rec.text := 'Testing';
- tl_insert_dbout_profiles(l_rec);
+ l_profile.test_run_id := c_test_run_id;
+ l_profile.line := 1;
+ l_profile.status := 'EXEC';
+ l_profile.exec_cnt := 1;
+ l_profile.exec_tot_usec := 1;
+ l_profile.exec_min_usec := 1;
+ l_profile.exec_max_usec := 1;
+ l_profile.text := 'Testing';
+ tl_insert_wt_profiles(l_profile);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete Records Happy Path 1';
begin
- delete_records(c_test_run_id);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(' || c_test_run_id || ')',
+ check_this_in => delete_run_id(c_test_run_id),
+ against_this_in => 1);
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(' || c_test_run_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
' where test_run_id = ' || c_test_run_id,
against_value_in => 0);
+ tl_delete_test_runs(c_test_run_id);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete Records Sad Path 1';
begin
- delete_records(-9876);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-9876)',
+ check_this_in => delete_run_id(-9876),
+ against_this_in => 0);
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-9876) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
' where test_run_id = ' || c_test_run_id,
against_value_in => 0);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete Records Sad Path 2';
begin
- delete_records(NULL);
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(NULL)',
+ check_this_in => delete_run_id(NULL),
+ against_this_in => 0);
exception when others then
- l_err_stack := dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace ;
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(NULL) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
end;
-------------------------------------- WTPLSQL Testing --
- wt_assert.isnull (
- msg_in => 'SQLERRM',
- check_this_in => l_err_stack);
wt_assert.eqqueryvalue (
- msg_in => 'wt_dbout_profiles Count 2',
- check_query_in => 'select count(*) from wt_dbout_profiles' ||
+ msg_in => 'wt_profiles Count 2',
+ check_query_in => 'select count(*) from wt_profiles' ||
' where test_run_id = ' || c_test_run_id,
against_value_in => 0);
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Delete Records Teardown';
- tl_delete_test_runs(c_test_run_id);
- end t_delete_records;
+ end t_delete_run_id;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
--==============================================================--
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_PROFILER:PACKAGE BODY" %--
+ procedure WTPLSQL_RUN
is
begin
+ wtplsql.g_DBOUT := 'WT_PROFILE:PACKAGE BODY';
+ select username into g_current_user from user_users;
+ -------------------------------------- WTPLSQL Testing --
t_get_error_msg;
- t_delete_profiler_recs;
- t_find_dbout;
+ t_clear_plsql_profiler_recs;
t_load_ignr_aa;
- t_insert_dbout_profile;
- t_initialize;
- t_finalize;
+ t_add_dbout_run;
+ t_set_prof_status;
+ t_insert_wt_profile;
+ t_is_profilable;
t_trigger_offset;
t_calc_pct_coverage;
- t_delete_records;
+ t_initialize;
+ t_finalize;
+ t_delete_run_id;
end WTPLSQL_RUN;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
--==============================================================--
-end wt_profiler;
+end wt_profile;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_PROFILE.pspec b/wtpsav/WTP/WT_PROFILE.pspec
new file mode 100644
index 0000000..7f0e446
--- /dev/null
+++ b/wtpsav/WTP/WT_PROFILE.pspec
@@ -0,0 +1,63 @@
+
+--
+-- Create WTP.WT_PROFILE Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_PROFILE
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_PROFILE"
+ authid definer
+as
+
+ g_rec wt_dbout_runs%ROWTYPE;
+
+ function is_profilable
+ (in_dbout_owner in varchar2
+ ,in_dbout_name in varchar2
+ ,in_dbout_type in varchar2)
+ return boolean;
+
+ function trigger_offset
+ (dbout_owner_in in varchar2
+ ,dbout_name_in in varchar2
+ ,dbout_type_in in varchar2)
+ return number;
+
+ function calc_pct_coverage
+ (in_test_run_id in number)
+ return number;
+
+ procedure initialize;
+
+ procedure finalize
+ (in_test_run_id in number);
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_profile;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_PROFILES.tab b/wtpsav/WTP/WT_PROFILES.tab
new file mode 100644
index 0000000..5ea2c0c
--- /dev/null
+++ b/wtpsav/WTP/WT_PROFILES.tab
@@ -0,0 +1,51 @@
+
+--
+-- Create WTP.WT_PROFILES Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_PROFILES
+
+ CREATE TABLE "WTP"."WT_PROFILES"
+ ( "TEST_RUN_ID" NUMBER(38,0) CONSTRAINT "WT_PROFILES_NN1" NOT NULL ENABLE,
+ "LINE" NUMBER(6,0) CONSTRAINT "WT_PROFILES_NN2" NOT NULL ENABLE,
+ "STATUS" VARCHAR2(4 BYTE),
+ "EXEC_CNT" NUMBER(9,0),
+ "EXEC_TOT_USEC" NUMBER,
+ "EXEC_MIN_USEC" NUMBER,
+ "EXEC_MAX_USEC" NUMBER,
+ "TEXT" VARCHAR2(4000 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_PROFILES" ADD CONSTRAINT "WT_PROFILES_PK" PRIMARY KEY ("TEST_RUN_ID", "LINE")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_PROFILES
+
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."TEST_RUN_ID" IS 'Foreign Key for the Test Run, Primary Key part 1.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."LINE" IS 'Source code line number, Primary Key part 2.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."STATUS" IS 'EXEC/NOTX/EXCL/IGNR/UNKN Status from the Profiler';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."EXEC_CNT" IS 'Number of times this line was executed.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."EXEC_TOT_USEC" IS 'Total time in microseconds spent executing this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."EXEC_MIN_USEC" IS 'Minimum execution time in microseconds for this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."EXEC_MAX_USEC" IS 'Maximum execution time in microseconds for this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES"."TEXT" IS 'Source code text for this line number.';
+ COMMENT ON TABLE "WTP"."WT_PROFILES" IS 'PL/SQL Profiler data for Database Object Under Test (DBOUT).';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_PROFILES" to "PUBLIC";
+grant SELECT on "WTP"."WT_PROFILES" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_PROFILES.tabfk b/wtpsav/WTP/WT_PROFILES.tabfk
new file mode 100644
index 0000000..99b128d
--- /dev/null
+++ b/wtpsav/WTP/WT_PROFILES.tabfk
@@ -0,0 +1,16 @@
+
+--
+-- Create Foreign Keys for WTP.WT_PROFILES TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_PROFILES_FK1
+
+ ALTER TABLE "WTP"."WT_PROFILES" ADD CONSTRAINT "WT_PROFILES_FK1" FOREIGN KEY ("TEST_RUN_ID")
+ REFERENCES "WTP"."WT_TEST_RUNS" ("ID") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/WT_PROFILES_VW.vw b/wtpsav/WTP/WT_PROFILES_VW.vw
new file mode 100644
index 0000000..8a3e785
--- /dev/null
+++ b/wtpsav/WTP/WT_PROFILES_VW.vw
@@ -0,0 +1,83 @@
+
+--
+-- Create WTP.WT_PROFILES_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_PROFILES_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_PROFILES_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_PROFILES_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_PROFILES_VW" ("TEST_RUN_ID", "DBOUT_ID", "DBOUT_OWNER", "DBOUT_NAME", "DBOUT_TYPE", "TEST_RUNNER_ID", "TEST_RUNNER_OWNER", "TEST_RUNNER_NAME", "START_DTM", "END_DTM", "IS_LAST_RUN", "ERROR_MESSAGE", "LINE", "STATUS", "EXEC_CNT", "EXEC_TOT_USEC", "EXEC_MIN_USEC", "EXEC_MAX_USEC", "TEXT") AS
+ select run.id TEST_RUN_ID
+ ,run.dbout_id
+ ,db.owner DBOUT_OWNER
+ ,db.name DBOUT_NAME
+ ,db.type DBOUT_TYPE
+ ,run.test_runner_id
+ ,tr.owner TEST_RUNNER_OWNER
+ ,tr.name TEST_RUNNER_NAME
+ ,run.start_dtm
+ ,run.end_dtm
+ ,run.is_last_run
+ ,run.error_message
+ ,pf.line
+ ,pf.status
+ ,pf.exec_cnt
+ ,pf.exec_tot_usec
+ ,pf.exec_min_usec
+ ,pf.exec_max_usec
+ ,pf.text
+ from wt_test_runs run
+ join wt_dbouts db
+ on db.id = run.dbout_id
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id
+ join wt_profiles pf
+ on pf.test_run_id = run.id;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_PROFILES_VW
+
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."TEST_RUN_ID" IS 'Primary (Surrogate) Key for each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."DBOUT_ID" IS 'Primary (Surrogate) Key for each Database Objects Under Test (DBOUT)';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."DBOUT_OWNER" IS 'Owner of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."DBOUT_NAME" IS 'Name of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."DBOUT_TYPE" IS 'Type of the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."TEST_RUNNER_ID" IS 'Primary (Surrogate) Key for each Test Runner';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."TEST_RUNNER_OWNER" IS 'Owner of the Test Runner package. Natural Key 1 part 1';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."TEST_RUNNER_NAME" IS 'Name of the Test Runner package. Natural Key 1 part 2';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."LINE" IS 'Source code line number, Primary Key part 2.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."STATUS" IS 'EXEC/NOTX/EXCL/IGNR/UNKN Status from the Profiler';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."EXEC_CNT" IS 'Number of times this line was executed.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."EXEC_TOT_USEC" IS 'Total time in microseconds spent executing this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."EXEC_MIN_USEC" IS 'Minimum execution time in microseconds for this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."EXEC_MAX_USEC" IS 'Maximum execution time in microseconds for this line.';
+ COMMENT ON COLUMN "WTP"."WT_PROFILES_VW"."TEXT" IS 'Source code text for this line number.';
+ COMMENT ON TABLE "WTP"."WT_PROFILES_VW" IS 'Test Run profile statistics for each execution of a Test Runner.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_PROFILES_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULT.pbody b/wtpsav/WTP/WT_RESULT.pbody
new file mode 100644
index 0000000..cea6c0d
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULT.pbody
@@ -0,0 +1,347 @@
+
+--
+-- Create WTP.WT_RESULT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_RESULT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_RESULT"
+as
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure initialize
+is
+begin
+ return;
+end initialize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Initialize Happy Path';
+ wt_assert.raises (
+ msg_in => 'Empty Execution, nothing to do',
+ check_call_in => 'begin wt_result.initialize; end;',
+ against_exc_in => '');
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Because this procedure is called to cleanup after errors,
+-- it must be able to run multiple times without causing damage.
+procedure finalize
+ (in_test_run_id in number)
+is
+ l_results_rec wt_results%ROWTYPE;
+ l_results_recNULL wt_results%ROWTYPE;
+ l_testcase_runs_recNULL wt_testcase_runs%ROWTYPE;
+ l_testcase_runs_rec wt_testcase_runs%ROWTYPE;
+ testcase core_data.long_name;
+begin
+ if in_test_run_id IS NULL
+ then
+ return;
+ end if;
+ for i in 1 .. core_data.g_results_nt.COUNT
+ loop
+ l_results_rec := l_results_recNULL;
+ l_results_rec.TEST_RUN_ID := in_test_run_id;
+ l_results_rec.RESULT_SEQ := i;
+ l_results_rec.TESTCASE_ID := wt_testcase.dim_id
+ (core_data.g_results_nt(i).TESTCASE);
+ l_results_rec.EXECUTED_DTM := core_data.g_results_nt(i).EXECUTED_DTM;
+ l_results_rec.INTERVAL_MSEC := core_data.g_results_nt(i).INTERVAL_MSEC;
+ l_results_rec.ASSERTION := core_data.g_results_nt(i).ASSERTION;
+ if core_data.g_results_nt(i).PASS
+ then
+ l_results_rec.STATUS := 'PASS';
+ else
+ l_results_rec.STATUS := 'FAIL';
+ end if;
+ l_results_rec.MESSAGE := core_data.g_results_nt(i).MESSAGE;
+ l_results_rec.DETAILS := core_data.g_results_nt(i).DETAILS;
+ insert into wt_results values l_results_rec;
+ end loop;
+ commit;
+ -- Testcases
+ if core_data.g_tcases_aa.COUNT > 0
+ then
+ testcase := core_data.g_tcases_aa.FIRST;
+ loop
+ l_testcase_runs_rec := l_testcase_runs_recNULL;
+ l_testcase_runs_rec.test_run_id := in_test_run_id;
+ l_testcase_runs_rec.testcase_id := wt_testcase.dim_id(testcase);
+ l_testcase_runs_rec.asrt_cnt := core_data.g_tcases_aa(testcase).asrt_cnt;
+ l_testcase_runs_rec.asrt_fail := core_data.g_tcases_aa(testcase).asrt_fail;
+ l_testcase_runs_rec.asrt_min_msec := core_data.g_tcases_aa(testcase).asrt_min_msec;
+ l_testcase_runs_rec.asrt_max_msec := core_data.g_tcases_aa(testcase).asrt_max_msec;
+ l_testcase_runs_rec.asrt_tot_msec := core_data.g_tcases_aa(testcase).asrt_tot_msec;
+ --
+ l_testcase_runs_rec.asrt_pass := l_testcase_runs_rec.asrt_cnt -
+ l_testcase_runs_rec.asrt_fail;
+ if l_testcase_runs_rec.asrt_cnt > 0 then
+ l_testcase_runs_rec.asrt_yield_pct := l_testcase_runs_rec.asrt_pass /
+ l_testcase_runs_rec.asrt_cnt;
+ l_testcase_runs_rec.asrt_avg_msec := l_testcase_runs_rec.asrt_tot_msec /
+ l_testcase_runs_rec.asrt_cnt;
+ end if;
+ --
+ insert into wt_testcase_runs values l_testcase_runs_rec;
+ exit when testcase = core_data.g_tcases_aa.LAST;
+ testcase := core_data.g_tcases_aa.NEXT(testcase);
+ end loop;
+ commit;
+ end if;
+end finalize;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize
+ is
+ -------------------------------------- WTPLSQL Testing --
+ type num_recs_aa_type is table of number index by varchar2(50);
+ num_recs_aa num_recs_aa_type;
+ del_res_aa num_recs_aa_type;
+ del_tc_aa num_recs_aa_type;
+ l_results_ntSAVE core_data.results_nt_type;
+ l_results_ntTEST core_data.results_nt_type;
+ l_results_rec1 core_data.results_rec_type;
+ l_results_rec2 core_data.results_rec_type;
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ -------------------------------------- WTPLSQL Testing --
+ procedure run_test (in_test_run_id in number
+ ,in_test_name in varchar2) is
+ begin
+ finalize(in_test_run_id);
+ select count(*)
+ into num_recs_aa(in_test_name)
+ from wt_results
+ where test_run_id = in_test_run_id;
+ -------------------------------------- WTPLSQL Testing --
+ delete from wt_results where test_run_id = in_test_run_id;
+ del_res_aa(in_test_name) := SQL%ROWCOUNT;
+ delete from wt_testcase_runs where test_run_id = in_test_run_id;
+ del_tc_aa(in_test_name) := SQL%ROWCOUNT;
+ end run_test;
+ begin
+ wt_assert.g_testcase := 'Finalize Happy Path';
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec1.testcase := 'TESTCASE TEST';
+ l_results_rec1.executed_dtm := systimestamp;
+ l_results_rec1.interval_msec := 99;
+ l_results_rec1.assertion := 'FINALTEST';
+ l_results_rec1.pass := TRUE;
+ l_results_rec1.details := 'This is a Passing WT_RESULT.FINALIZE Test';
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec2.testcase := 'TESTCASE TEST';
+ l_results_rec2.executed_dtm := systimestamp;
+ l_results_rec2.interval_msec := 99;
+ l_results_rec2.assertion := 'FINALTEST';
+ l_results_rec2.pass := FALSE;
+ l_results_rec2.details := 'This is a Failing WT_RESULT.FINALIZE Test';
+ -------------------------------------- WTPLSQL Testing --
+ delete from wt_results where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Test Results',
+ check_this_in => SQL%ROWCOUNT);
+ delete from wt_testcase_runs where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Testcase Runs',
+ check_this_in => SQL%ROWCOUNT);
+ delete from wt_test_runs where id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Clear Previous Test Runs',
+ check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ -- Setup the FK Record
+ l_test_runs_rec.id := -99;
+ l_test_runs_rec.start_dtm := sysdate;
+ l_test_runs_rec.test_runner_id := wt_test_runner.dim_id('WT_RESULT_TEST','WT_RESULT_TEST');
+ insert into wt_test_runs values l_test_runs_rec;
+ wt_assert.eq (
+ msg_in => 'Create Test Results Run',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- Capture Original Values
+ l_results_ntSAVE := core_data.g_results_nt;
+ select count(*)
+ into num_recs_aa('Initial Record Count')
+ from wt_results
+ where test_run_id = -99;
+ -------------------------------------- WTPLSQL Testing --
+ -- No Assertion Testing in Here
+ core_data.g_results_nt := core_data.results_nt_type(l_results_rec1, l_results_rec2);
+ run_test(-99, 'Record Count Test');
+ core_data.g_results_nt := core_data.results_nt_type(NULL);
+ run_test(-99, 'NULL Record Count');
+ core_data.g_results_nt := core_data.results_nt_type(l_results_rec1);
+ run_test(NULL, 'NULL Test Run ID Test');
+ -------------------------------------- WTPLSQL Testing --
+ -- Restore values so we can test
+ core_data.g_results_nt := l_results_ntSAVE;
+ wt_assert.eq (
+ msg_in => 'Initial Record Count',
+ check_this_in => num_recs_aa('Initial Record Count'),
+ against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Record Count Test',
+ check_this_in => num_recs_aa('Record Count Test'),
+ against_this_in => 2);
+ wt_assert.eq (
+ msg_in => 'Delete Record Count Test Results',
+ check_this_in => del_res_aa('Record Count Test'),
+ against_this_in => 2);
+ wt_assert.isnotnull (
+ msg_in => 'Delete Record Count Test Testcase Runs',
+ check_this_in => del_tc_aa('Record Count Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'NULL Record Count',
+ check_this_in => num_recs_aa('NULL Record Count'),
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'Delete NULL Record Count Results',
+ check_this_in => del_res_aa('NULL Record Count'),
+ against_this_in => 1);
+ wt_assert.isnotnull (
+ msg_in => 'Delete NULL Record Count Testcase Runs',
+ check_this_in => del_tc_aa('NULL Record Count'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'NULL Test Run ID Test',
+ check_this_in => num_recs_aa('NULL Test Run ID Test'),
+ against_this_in => 0);
+ wt_assert.eq (
+ msg_in => 'Delete NULL Record Count Results',
+ check_this_in => del_res_aa('NULL Test Run ID Test'),
+ against_this_in => 0);
+ wt_assert.isnotnull (
+ msg_in => 'Delete NULL Record Count Testcase Runs',
+ check_this_in => del_tc_aa('NULL Test Run ID Test'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.raises (
+ msg_in => 'Clear Test Results Run',
+ check_call_in => 'delete from wt_test_runs where id = -99',
+ against_exc_in => '');
+ commit;
+ end t_finalize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ ret_num number;
+begin
+ delete from wt_testcase_runs where test_run_id = in_test_run_id;
+ ret_num := SQL%ROWCOUNT;
+ delete from wt_results where test_run_id = in_test_run_id;
+ ret_num := ret_num + SQL%ROWCOUNT;
+ return ret_num;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ l_results_rec wt_results%ROWTYPE;
+ l_num_recs number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Delete Records Happy Path';
+ select count(*) into l_num_recs
+ from wt_results
+ where test_run_id = -99;
+ wt_assert.isnotnull (
+ msg_in => 'Before Insert Count',
+ check_this_in => l_num_recs);
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec.id := -99;
+ l_test_runs_rec.start_dtm := sysdate;
+ l_test_runs_rec.test_runner_id := wt_test_runner.dim_id('WT_RESULT_TEST','WT_RESULT_TEST');
+ insert into wt_test_runs values l_test_runs_rec;
+ l_results_rec.test_run_id := -99;
+ -------------------------------------- WTPLSQL Testing --
+ l_results_rec.result_seq := 1;
+ l_results_rec.executed_dtm := sysdate;
+ l_results_rec.interval_msec := 99;
+ l_results_rec.assertion := 'DELRECTEST';
+ l_results_rec.status := 'PASS';
+ l_results_rec.details := 'This is a WT_RESULT.DELETE_RECORDS Test';
+ insert into wt_results values l_results_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'After Insert Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs + 1);
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-99)',
+ check_this_in => delete_run_id(-99),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-99) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'After Test Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs);
+ rollback;
+ wt_assert.eqqueryvalue (
+ msg_in => 'After ROLLBACK Count',
+ check_query_in => 'select count(*) from wt_results' ||
+ ' where test_run_id = -99',
+ against_value_in => l_num_recs);
+ end t_delete_run_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_RESULT:PACKAGE BODY';
+ t_initialize;
+ t_finalize;
+ t_delete_run_id;
+ end WTPLSQL_RUN;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_result;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULT.pspec b/wtpsav/WTP/WT_RESULT.pspec
new file mode 100644
index 0000000..576b5ec
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULT.pspec
@@ -0,0 +1,45 @@
+
+--
+-- Create WTP.WT_RESULT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_RESULT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_RESULT"
+ authid definer
+as
+
+ procedure initialize;
+
+ procedure finalize
+ (in_test_run_id in number);
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_result;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULTS.tab b/wtpsav/WTP/WT_RESULTS.tab
new file mode 100644
index 0000000..6da8e8d
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULTS.tab
@@ -0,0 +1,53 @@
+
+--
+-- Create WTP.WT_RESULTS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_RESULTS
+
+ CREATE TABLE "WTP"."WT_RESULTS"
+ ( "TEST_RUN_ID" NUMBER(38,0) CONSTRAINT "WT_RESULTS_NN1" NOT NULL ENABLE,
+ "RESULT_SEQ" NUMBER(8,0) CONSTRAINT "WT_RESULTS_NN2" NOT NULL ENABLE,
+ "TESTCASE_ID" NUMBER(38,0),
+ "EXECUTED_DTM" TIMESTAMP (6),
+ "INTERVAL_MSEC" NUMBER(12,3),
+ "ASSERTION" VARCHAR2(15 BYTE),
+ "STATUS" VARCHAR2(4 BYTE),
+ "MESSAGE" VARCHAR2(200 BYTE),
+ "DETAILS" VARCHAR2(4000 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_RESULTS" ADD CONSTRAINT "WT_RESULTS_PK" PRIMARY KEY ("TEST_RUN_ID", "RESULT_SEQ")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_RESULTS
+
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."TEST_RUN_ID" IS 'Foreign Key for the Test Run, Primary Key part 1.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."RESULT_SEQ" IS 'Sequence number for this Result, Primary Key part 2.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."TESTCASE_ID" IS 'Foreign Key for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."EXECUTED_DTM" IS 'Date/Time (with Fractional Seconds) this Result was captured';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."INTERVAL_MSEC" IS 'Interval time in milliseconds since the previous Result or start of the Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."ASSERTION" IS 'Name of the Assertion Test performed';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."STATUS" IS 'PASS/FAIL Status from the Assertion';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."MESSAGE" IS 'Optional test identifier that helps connect an Assertion to the Test Runner.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS"."DETAILS" IS 'Assertion Details, i.e. Expected Value and Actual Value';
+ COMMENT ON TABLE "WTP"."WT_RESULTS" IS 'Results data from Test Runs.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_RESULTS" to "PUBLIC";
+grant SELECT on "WTP"."WT_RESULTS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULTS.tabfk b/wtpsav/WTP/WT_RESULTS.tabfk
new file mode 100644
index 0000000..dd4c801
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULTS.tabfk
@@ -0,0 +1,23 @@
+
+--
+-- Create Foreign Keys for WTP.WT_RESULTS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_RESULTS_FK1
+
+ ALTER TABLE "WTP"."WT_RESULTS" ADD CONSTRAINT "WT_RESULTS_FK1" FOREIGN KEY ("TEST_RUN_ID")
+ REFERENCES "WTP"."WT_TEST_RUNS" ("ID") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_RESULTS_FK2
+
+ ALTER TABLE "WTP"."WT_RESULTS" ADD CONSTRAINT "WT_RESULTS_FK2" FOREIGN KEY ("TESTCASE_ID")
+ REFERENCES "WTP"."WT_TESTCASES" ("ID") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULTS.tabind b/wtpsav/WTP/WT_RESULTS.tabind
new file mode 100644
index 0000000..2f64a8e
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULTS.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for WTP.WT_RESULTS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.WT_RESULTS_IX1
+
+ CREATE INDEX "WTP"."WT_RESULTS_IX1" ON "WTP"."WT_RESULTS" ("TESTCASE_ID", "TEST_RUN_ID")
+ ;
+
+set define on
diff --git a/wtpsav/WTP/WT_RESULTS_VW.vw b/wtpsav/WTP/WT_RESULTS_VW.vw
new file mode 100644
index 0000000..ef1b540
--- /dev/null
+++ b/wtpsav/WTP/WT_RESULTS_VW.vw
@@ -0,0 +1,83 @@
+
+--
+-- Create WTP.WT_RESULTS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_RESULTS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_RESULTS_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_RESULTS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_RESULTS_VW" ("TEST_RUN_ID", "TEST_RUNNER_ID", "TEST_RUNNER_OWNER", "TEST_RUNNER_NAME", "START_DTM", "END_DTM", "IS_LAST_RUN", "ERROR_MESSAGE", "RESULT_SEQ", "TESTCASE_ID", "TESTCASE", "EXECUTED_DTM", "INTERVAL_MSEC", "ASSERTION", "STATUS", "MESSAGE", "DETAILS") AS
+ select run.id TEST_RUN_ID
+ ,run.test_runner_id
+ ,tr.owner TEST_RUNNER_OWNER
+ ,tr.name TEST_RUNNER_NAME
+ ,run.start_dtm
+ ,run.end_dtm
+ ,run.is_last_run
+ ,run.error_message
+ ,res.result_seq
+ ,res.testcase_id
+ ,tc.testcase
+ ,res.executed_dtm
+ ,res.interval_msec
+ ,res.assertion
+ ,res.status
+ ,res.message
+ ,res.details
+ from wt_test_runs run
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id
+ join wt_results res
+ on res.test_run_id = run.id
+ join wt_testcases tc
+ on tc.id = res.testcase_id;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_RESULTS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TEST_RUN_ID" IS 'Foreign Key for the Test Run';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TEST_RUNNER_ID" IS 'Surrogate Key the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TEST_RUNNER_OWNER" IS 'Owner of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TEST_RUNNER_NAME" IS 'Name of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."START_DTM" IS 'Date/time (and fractional seconds) this Test Run started.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."END_DTM" IS 'Date/time (and fractional seconds) this Test Run ended.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."IS_LAST_RUN" IS 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."ERROR_MESSAGE" IS 'Optional Error messages from this Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."RESULT_SEQ" IS 'Sequence number for this Result';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TESTCASE_ID" IS 'Foreign Key for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."TESTCASE" IS 'The Test Case name';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."EXECUTED_DTM" IS 'Date/Time (with Fractional Seconds) this Result was captured';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."INTERVAL_MSEC" IS 'Interval time in milliseconds since the previous Result or start ot the Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."ASSERTION" IS 'Name of the Assertion Test performed';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."STATUS" IS 'PASS/FAIL Status from the Assertion';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."MESSAGE" IS 'Optional test identifier that helps connect an Assertion to the Test Runner.';
+ COMMENT ON COLUMN "WTP"."WT_RESULTS_VW"."DETAILS" IS 'Assertion Details, i.e. Expected Value and Actual Value';
+ COMMENT ON TABLE "WTP"."WT_RESULTS_VW" IS 'Results data from Test Runs.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_RESULTS_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_SCHEDULER_JOBS_VW.vw b/wtpsav/WTP/WT_SCHEDULER_JOBS_VW.vw
new file mode 100644
index 0000000..72d4e40
--- /dev/null
+++ b/wtpsav/WTP/WT_SCHEDULER_JOBS_VW.vw
@@ -0,0 +1,70 @@
+
+--
+-- Create WTP.WT_SCHEDULER_JOBS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_SCHEDULER_JOBS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+
+
+
+--DBMS_METADATA:WTP.WT_SCHEDULER_JOBS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_SCHEDULER_JOBS_VW" ("LOG_ID", "START_DATE", "JOB_NAME", "STATUS", "INST", "SESSION_ID", "OS_PID", "ERROR_NUM", "ADDITIONAL_INFO") AS
+ select round(log_id) LOG_ID
+ ,systimestamp - elapsed_time START_DATE
+ ,job_name
+ ,'RUNNING' STATUS
+ ,running_instance INST
+ ,session_id
+ ,slave_process_id OS_PID
+ ,NULL ERROR_NUM
+ ,NULL ADDITIONAL_INFO
+ from user_scheduler_running_jobs
+union all
+select log_id
+ ,actual_start_date START_DATE
+ ,job_name
+ ,status
+ ,instance_id INST
+ ,NULL SESSION_ID
+ ,NULL OS_PID
+ ,error# ERROR_NUM
+ ,additional_info
+ from user_scheduler_job_run_details;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_SCHEDULER_JOBS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."LOG_ID" IS 'Unique identifier of the log entry (foreign key of the *_SCHEDULER_JOB_LOG views)';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."START_DATE" IS 'Actual date on which the job was run';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."JOB_NAME" IS 'Name of the Scheduler job';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."STATUS" IS 'Status of the job run';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."INST" IS 'Identifier of the instance on which the job was run';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."SESSION_ID" IS 'Identifier of the session running the Scheduler job';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."OS_PID" IS 'Process number of the slave process running the Scheduler job';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."ERROR_NUM" IS 'Error number in the case of an error';
+ COMMENT ON COLUMN "WTP"."WT_SCHEDULER_JOBS_VW"."ADDITIONAL_INFO" IS 'Additional information on the job run, if applicable';
+ COMMENT ON TABLE "WTP"."WT_SCHEDULER_JOBS_VW" IS 'User Scheduler Jobs, including running and not running jobs.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE.pbody b/wtpsav/WTP/WT_TESTCASE.pbody
new file mode 100644
index 0000000..28e720b
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE.pbody
@@ -0,0 +1,234 @@
+
+--
+-- Create WTP.WT_TESTCASE Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TESTCASE
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_TESTCASE"
+as
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_TESTCASE CONSTANT varchar2(50) := 'WT_TESTCASE_FOR_TESTING_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_testcase in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id
+ from wt_testcases
+ where testcase = in_testcase;
+ return l_id;
+exception when NO_DATA_FOUND
+then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_TESTCASE));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_testcases (id, testcase)
+ values (wt_testcases_seq.nextval, C_TESTCASE)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_TESTCASE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_testcase in varchar2)
+ return number
+is
+ pragma AUTONOMOUS_TRANSACTION;
+ rec wt_testcases%ROWTYPE;
+begin
+ if in_testcase is NULL
+ then
+ return NULL;
+ end if;
+ rec.id := get_id (in_testcase);
+ if rec.id is null
+ then
+ rec.id := wt_testcases_seq.nextval;
+ rec.testcase := in_testcase;
+ insert into wt_testcases values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_TESTCASE);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_TESTCASE)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure delete_records
+is
+begin
+ delete from wt_testcases
+ where id in (
+ select id from wt_testcases
+ MINUS
+ select distinct testcase_id ID from wt_results
+ MINUS
+ select distinct testcase_id ID from wt_testcase_runs);
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_testcases
+ where testcase = C_TESTCASE;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_testcases (id, testcase)
+ values (wt_testcases_seq.nextval, C_TESTCASE);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ delete_records;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_testcases' ||
+ ' where testcase = ''' || C_TESTCASE || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TESTCASE:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_testcase;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE.pspec b/wtpsav/WTP/WT_TESTCASE.pspec
new file mode 100644
index 0000000..a4e3fdd
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE.pspec
@@ -0,0 +1,51 @@
+
+--
+-- Create WTP.WT_TESTCASE Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TESTCASE
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_TESTCASE"
+ authid definer
+as
+
+ -- Return a Testcase Surrogate Key.
+ -- Return NULL if the Testcase does not exist.
+ function get_id
+ (in_testcase in varchar2)
+ return number;
+
+ -- Return a Testcase Surrogate Key.
+ -- Add the Testcase if it does not exist.
+ function dim_id
+ (in_testcase in varchar2)
+ return number;
+
+ -- Delete all records with no child records
+ procedure delete_records;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_testcase;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASES.tab b/wtpsav/WTP/WT_TESTCASES.tab
new file mode 100644
index 0000000..9878f42
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASES.tab
@@ -0,0 +1,41 @@
+
+--
+-- Create WTP.WT_TESTCASES Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TESTCASES
+
+ CREATE TABLE "WTP"."WT_TESTCASES"
+ ( "ID" NUMBER(38,0),
+ "TESTCASE" VARCHAR2(128 BYTE) CONSTRAINT "WT_TESTCASES_NN1" NOT NULL ENABLE
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_TESTCASES" ADD CONSTRAINT "WT_TESTCASES_PK" PRIMARY KEY ("ID")
+ USING INDEX ENABLE;
+ALTER TABLE "WTP"."WT_TESTCASES" ADD CONSTRAINT "WT_TESTCASES_NK1" UNIQUE ("TESTCASE")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TESTCASES
+
+ COMMENT ON COLUMN "WTP"."WT_TESTCASES"."ID" IS 'Primary (Surrogate) Key for each Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASES"."TESTCASE" IS '(Required) Natural Key. The Test Case name';
+ COMMENT ON TABLE "WTP"."WT_TESTCASES" IS 'Test Cases Used by Test Runners.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_TESTCASES" to "PUBLIC";
+grant SELECT on "WTP"."WT_TESTCASES" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASES_SEQ.seq b/wtpsav/WTP/WT_TESTCASES_SEQ.seq
new file mode 100644
index 0000000..744c7d7
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASES_SEQ.seq
@@ -0,0 +1,20 @@
+
+--
+-- Create WTP.WT_TESTCASES_SEQ Sequence
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TESTCASES_SEQ
+
+ CREATE SEQUENCE "WTP"."WT_TESTCASES_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE_RUNS.tab b/wtpsav/WTP/WT_TESTCASE_RUNS.tab
new file mode 100644
index 0000000..e4652c2
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE_RUNS.tab
@@ -0,0 +1,55 @@
+
+--
+-- Create WTP.WT_TESTCASE_RUNS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS
+
+ CREATE TABLE "WTP"."WT_TESTCASE_RUNS"
+ ( "TEST_RUN_ID" NUMBER(38,0) CONSTRAINT "WT_TESTCASE_RUNS_NN1" NOT NULL ENABLE,
+ "TESTCASE_ID" NUMBER(38,0) CONSTRAINT "WT_TESTCASE_RUNS_NN2" NOT NULL ENABLE,
+ "ASRT_YIELD_PCT" NUMBER(3,0),
+ "ASRT_CNT" NUMBER(7,0),
+ "ASRT_FAIL" NUMBER(7,0),
+ "ASRT_PASS" NUMBER(7,0),
+ "ASRT_MIN_MSEC" NUMBER(10,0),
+ "ASRT_AVG_MSEC" NUMBER(10,0),
+ "ASRT_MAX_MSEC" NUMBER(10,0),
+ "ASRT_TOT_MSEC" NUMBER(10,0)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_TESTCASE_RUNS" ADD CONSTRAINT "WT_TESTCASE_RUNS_PK" PRIMARY KEY ("TEST_RUN_ID", "TESTCASE_ID")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS
+
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."TEST_RUN_ID" IS 'Primary Key for each Test Run. Also the Test Runs Foreign Key.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."TESTCASE_ID" IS 'Primary Key (part 2) for each Test Case. Also the Test Cases Foreign Key.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_YIELD_PCT" IS 'Percentage of successful assertions to total assertions.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_CNT" IS 'Total number of assetions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_FAIL" IS 'Number of failed assertions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_PASS" IS 'Number of passed assertions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_MIN_MSEC" IS 'Minimum interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_AVG_MSEC" IS 'Average interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_MAX_MSEC" IS 'Maximum interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS"."ASRT_TOT_MSEC" IS 'Total (sum) of interval times between assertions in milliseconds for the Test Case';
+ COMMENT ON TABLE "WTP"."WT_TESTCASE_RUNS" IS 'Test Run data statistics for each testcase in the execution of a Test Runner.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_TESTCASE_RUNS" to "PUBLIC";
+grant SELECT on "WTP"."WT_TESTCASE_RUNS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE_RUNS.tabfk b/wtpsav/WTP/WT_TESTCASE_RUNS.tabfk
new file mode 100644
index 0000000..75bd7a0
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE_RUNS.tabfk
@@ -0,0 +1,23 @@
+
+--
+-- Create Foreign Keys for WTP.WT_TESTCASE_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS_FK1
+
+ ALTER TABLE "WTP"."WT_TESTCASE_RUNS" ADD CONSTRAINT "WT_TESTCASE_RUNS_FK1" FOREIGN KEY ("TEST_RUN_ID")
+ REFERENCES "WTP"."WT_TEST_RUNS" ("ID") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS_FK2
+
+ ALTER TABLE "WTP"."WT_TESTCASE_RUNS" ADD CONSTRAINT "WT_TESTCASE_RUNS_FK2" FOREIGN KEY ("TESTCASE_ID")
+ REFERENCES "WTP"."WT_TESTCASES" ("ID") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE_RUNS.tabind b/wtpsav/WTP/WT_TESTCASE_RUNS.tabind
new file mode 100644
index 0000000..7c38f8a
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE_RUNS.tabind
@@ -0,0 +1,16 @@
+
+--
+-- Create Indexes for WTP.WT_TESTCASE_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS_IX1
+
+ CREATE INDEX "WTP"."WT_TESTCASE_RUNS_IX1" ON "WTP"."WT_TESTCASE_RUNS" ("TESTCASE_ID")
+ ;
+
+set define on
diff --git a/wtpsav/WTP/WT_TESTCASE_RUNS_VW.vw b/wtpsav/WTP/WT_TESTCASE_RUNS_VW.vw
new file mode 100644
index 0000000..a5fea11
--- /dev/null
+++ b/wtpsav/WTP/WT_TESTCASE_RUNS_VW.vw
@@ -0,0 +1,81 @@
+
+--
+-- Create WTP.WT_TESTCASE_RUNS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_TESTCASE_RUNS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_TESTCASE_RUNS_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_TESTCASE_RUNS_VW" ("TEST_RUN_ID", "TESTCASE_ID", "TESTCASE", "TEST_RUNNER_ID", "TEST_RUNNER_OWNER", "TEST_RUNNER_NAME", "IS_LAST_RUN", "ERROR_MESSAGE", "ASRT_YIELD_PCT", "ASRT_CNT", "ASRT_FAIL", "ASRT_PASS", "ASRT_MIN_MSEC", "ASRT_AVG_MSEC", "ASRT_MAX_MSEC", "ASRT_TOT_MSEC") AS
+ select tcr.test_run_id
+ ,tcr.testcase_id
+ ,tc.testcase
+ ,run.test_runner_id
+ ,tr.owner TEST_RUNNER_OWNER
+ ,tr.name TEST_RUNNER_NAME
+ ,run.is_last_run
+ ,run.error_message
+ ,tcr.asrt_yield_pct
+ ,tcr.asrt_cnt
+ ,tcr.asrt_fail
+ ,tcr.asrt_pass
+ ,tcr.asrt_min_msec
+ ,tcr.asrt_avg_msec
+ ,tcr.asrt_max_msec
+ ,tcr.asrt_tot_msec
+ from wt_testcase_runs tcr
+ join wt_testcases tc
+ on tc.id = tcr.testcase_id
+ join wt_test_runs run
+ on run.id = tcr.test_run_id
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TESTCASE_RUNS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TEST_RUN_ID" IS 'Primary (Surrogate) Key for each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TESTCASE_ID" IS 'Primary (Surrogate) Key for each Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TESTCASE" IS 'The Test Case name';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TEST_RUNNER_ID" IS 'Primary (Surrogate) Key for each Test Runner';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TEST_RUNNER_OWNER" IS 'Owner of the Test Runner package. Natural Key 1 part 1';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."TEST_RUNNER_NAME" IS 'Name of the Test Runner package. Natural Key 1 part 2';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."IS_LAST_RUN" IS 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ERROR_MESSAGE" IS 'Optional Error messages from this Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_YIELD_PCT" IS 'Percentage of successful assertions to total assertions.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_CNT" IS 'Total number of assetions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_FAIL" IS 'Number of failed assertions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_PASS" IS 'Number of passed assertions for the Test Case.';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_MIN_MSEC" IS 'Minimum interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_AVG_MSEC" IS 'Average interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_MAX_MSEC" IS 'Maximum interval time between assertions in milliseconds for the Test Case';
+ COMMENT ON COLUMN "WTP"."WT_TESTCASE_RUNS_VW"."ASRT_TOT_MSEC" IS 'Total (sum) of interval times between assertions in milliseconds for the Test Case';
+ COMMENT ON TABLE "WTP"."WT_TESTCASE_RUNS_VW" IS 'Test Run data statistics for each testcase in the execution of a Test Runner.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_TESTCASE_RUNS_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUN.pbody b/wtpsav/WTP/WT_TEST_RUN.pbody
new file mode 100644
index 0000000..dbe7442
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUN.pbody
@@ -0,0 +1,1066 @@
+
+--
+-- Create WTP.WT_TEST_RUN Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUN
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_TEST_RUN"
+as
+
+ g_test_runs_rec wt_test_runs%ROWTYPE;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING_1234ABCD';
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_insert_test_runs
+ (in_test_run_id in NUMBER
+ ,in_runner_name in varchar2)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'insert into wt_test_runs' ||
+ ' (id, start_dtm, test_runner_id)' ||
+ ' values (' || in_test_run_id || ', sysdate, ' ||
+ wt_test_runner.dim_id(C_OWNER
+ ,C_NAME) || ')';
+ wt_assert.raises (
+ msg_in => 'Insert wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 1);
+ commit;
+ end tl_insert_test_runs;
+--==============================================================--
+ -------------------------------------- WTPLSQL Testing --
+ procedure tl_delete_test_runs
+ (in_test_run_id in NUMBER)
+ is
+ l_sql_txt varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ l_sql_txt := 'delete from wt_test_runs where id = ' || in_test_run_id;
+ wt_assert.raises (
+ msg_in => 'Delete wt_test_runs (' || in_test_run_id || ')',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'wt_test_runs rows deleted',
+ check_this_in => SQL%ROWCOUNT);
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (' || in_test_run_id || ') Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || in_test_run_id,
+ against_value_in => 0);
+ commit;
+ end tl_delete_test_runs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure set_g_test_runs_rec
+is
+ g_test_runs_recNULL wt_test_runs%ROWTYPE;
+begin
+ g_test_runs_rec := g_test_runs_recNULL;
+ g_test_runs_rec.id := wt_test_runs_seq.nextval;
+ g_test_runs_rec.test_runner_id := wt_test_runner.dim_id
+ (core_data.g_run_rec.test_runner_owner
+ ,core_data.g_run_rec.test_runner_name);
+ g_test_runs_rec.start_dtm := core_data.g_run_rec.start_dtm;
+ g_test_runs_rec.end_dtm := core_data.g_run_rec.end_dtm;
+ g_test_runs_rec.runner_sec := core_data.g_run_rec.runner_sec;
+ g_test_runs_rec.error_message := core_data.g_run_rec.error_message;
+ g_test_runs_rec.tc_cnt := core_data.g_run_rec.tc_cnt;
+ g_test_runs_rec.tc_fail := core_data.g_run_rec.tc_fail;
+ if g_test_runs_rec.tc_cnt != 0
+ then
+ g_test_runs_rec.tc_yield_pct := round( 100 *
+ ( g_test_runs_rec.tc_cnt -
+ g_test_runs_rec.tc_fail ) /
+ g_test_runs_rec.tc_cnt , 2);
+ end if;
+ g_test_runs_rec.asrt_fst_dtm := core_data.g_run_rec.asrt_fst_dtm;
+ g_test_runs_rec.asrt_lst_dtm := core_data.g_run_rec.asrt_lst_dtm;
+ g_test_runs_rec.asrt_cnt := core_data.g_run_rec.asrt_cnt;
+ g_test_runs_rec.asrt_fail := core_data.g_run_rec.asrt_fail;
+ g_test_runs_rec.asrt_min_msec := core_data.g_run_rec.asrt_min_msec;
+ g_test_runs_rec.asrt_max_msec := core_data.g_run_rec.asrt_max_msec;
+ g_test_runs_rec.asrt_tot_msec := core_data.g_run_rec.asrt_tot_msec;
+ g_test_runs_rec.dbout_id := wt_dbout.dim_id
+ (core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type);
+ if nvl(g_test_runs_rec.asrt_cnt,0) != 0
+ then
+ g_test_runs_rec.asrt_yield_pct := round(100 * ( g_test_runs_rec.asrt_cnt -
+ g_test_runs_rec.asrt_fail ) /
+ g_test_runs_rec.asrt_cnt , 2);
+ g_test_runs_rec.asrt_avg_msec := round(g_test_runs_rec.asrt_tot_msec /
+ g_test_runs_rec.asrt_cnt , 2);
+ end if;
+end set_g_test_runs_rec;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_g_test_runs_rec
+ is
+ l_cdr_recSAVE core_data.run_rec_type;
+ l_cdr_recTEST core_data.run_rec_type;
+ l_tr_recSAVE wt_test_runs%ROWTYPE;
+ l_tr_recTEST wt_test_runs%ROWTYPE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Set g_test_run_rec Happy Path 1';
+ l_cdr_recSAVE := core_data.g_run_rec;
+ l_tr_recSAVE := g_test_runs_rec;
+ -------------------------------------- WTPLSQL Testing --
+ core_data.g_run_rec.test_runner_owner := C_OWNER;
+ core_data.g_run_rec.test_runner_name := C_NAME;
+ core_data.g_run_rec.tc_cnt := 2;
+ core_data.g_run_rec.tc_fail := 1;
+ core_data.g_run_rec.dbout_owner := C_OWNER;
+ core_data.g_run_rec.dbout_name := C_NAME;
+ core_data.g_run_rec.dbout_type := 'TYPE';
+ core_data.g_run_rec.asrt_cnt := 10;
+ core_data.g_run_rec.asrt_fail := 5;
+ core_data.g_run_rec.asrt_tot_msec := 100;
+ -------------------------------------- WTPLSQL Testing --
+ set_g_test_runs_rec;
+ l_cdr_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_cdr_recSAVE;
+ l_tr_recTEST := g_test_runs_rec;
+ g_test_runs_rec := l_tr_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.id',
+ check_this_in => l_tr_recTEST.id);
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.test_runner_id',
+ check_this_in => l_tr_recTEST.test_runner_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull (
+ msg_in => 'l_tr_recTEST.dbout_id',
+ check_this_in => l_tr_recTEST.dbout_id);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_cnt',
+ check_this_in => l_tr_recTEST.tc_cnt,
+ against_this_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_fail',
+ check_this_in => l_tr_recTEST.tc_fail,
+ against_this_in => 1);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_cnt',
+ check_this_in => l_tr_recTEST.asrt_cnt,
+ against_this_in => 10);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_fail',
+ check_this_in => l_tr_recTEST.asrt_fail,
+ against_this_in => 5);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_tot_msec',
+ check_this_in => l_tr_recTEST.asrt_tot_msec,
+ against_this_in => 100);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_yield_pct',
+ check_this_in => l_tr_recTEST.tc_yield_pct,
+ against_this_in => 50);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.tc_fail',
+ check_this_in => l_tr_recTEST.tc_fail,
+ against_this_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_yield_pct',
+ check_this_in => l_tr_recTEST.asrt_yield_pct,
+ against_this_in => 50);
+ wt_assert.eq (
+ msg_in => 'l_tr_recTEST.asrt_avg_msec',
+ check_this_in => l_tr_recTEST.asrt_avg_msec,
+ against_this_in => 10);
+ end t_set_g_test_runs_rec;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Use the CLEAR_LAST_RUN procedure to clear the LAST_RUN_FLAG
+-- flag before running this procedure.
+function clear_last_run
+ (in_test_runner_id in number)
+ return number
+as
+begin
+ update wt_test_runs
+ set is_last_run = NULL
+ where test_runner_id = in_test_runner_id
+ and is_last_run = C_LAST_RUN_FLAG;
+ return SQL%ROWCOUNT;
+end clear_last_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_clear_last_run
+ is
+ l_sql_txt varchar2(4000);
+ l_sqlerrm varchar2(32000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Clear Last Run Happy Path 1';
+ tl_insert_test_runs(-1, 'Clear Last Run Testing');
+ l_sql_txt := 'update wt_test_runs' ||
+ ' set is_last_run = ''' || C_LAST_RUN_FLAG ||
+ ''' where id = -1';
+ wt_assert.raises (
+ msg_in => 'Update wt_test_runs (-1)',
+ check_call_in => l_sql_txt,
+ against_exc_in => '');
+ wt_assert.eqqueryvalue (
+ msg_in => 'wt_test_runs (-1) Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -1' ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME))',
+ check_this_in => clear_last_run(wt_test_runner.get_id(C_OWNER,C_NAME)),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME) Exception)',
+ check_this_in => SQLERRM);
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'clear_last_run(get_id(C_OWNER,C_NAME)) Count',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -1' ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ tl_delete_test_runs(-1);
+ end t_clear_last_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+------------------------------------------------------------
+procedure insert_test_run
+is
+ junk number;
+begin
+ if g_test_runs_rec.id is null
+ then
+ return;
+ end if;
+ junk := clear_last_run(in_test_runner_id => g_test_runs_rec.test_runner_id);
+ g_test_runs_rec.is_last_run := C_LAST_RUN_FLAG;
+ insert into wt_test_runs values g_test_runs_rec;
+ commit;
+end insert_test_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_insert_test_run
+ is
+ -------------------------------------- WTPLSQL Testing --
+ TYPE l_dbmsout_buff_type is table of varchar2(32767);
+ l_dbmsout_buff l_dbmsout_buff_type;
+ l_test_runs_rec wt_test_runs%ROWTYPE;
+ l_dbmsout_line varchar2(32767);
+ l_dbmsout_stat number;
+ l_num_recs number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 1';
+ wt_assert.eqqueryvalue (
+ msg_in => 'Records Before Insert',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -2',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ l_test_runs_rec := g_test_runs_rec;
+ g_test_runs_rec.id := -2;
+ g_test_runs_rec.test_runner_id := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ g_test_runs_rec.start_dtm := systimestamp;
+ insert_test_run;
+ g_test_runs_rec := l_test_runs_rec;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = -2',
+ against_value_in => 1);
+ tl_delete_test_runs(-2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INSERT_TEST_RUN Happy Path 2';
+ select count(*) into l_num_recs from wt_test_runs;
+ l_test_runs_rec := g_test_runs_rec;
+ g_test_runs_rec.id := null;
+ insert_test_run;
+ g_test_runs_rec := l_test_runs_rec;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Before and After Record Count',
+ check_query_in => 'select count(*) from wt_test_runs',
+ against_value_in => l_num_recs);
+ end t_insert_test_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_runs
+ (in_test_runner_id in number)
+ return number
+is
+ num_recs number := 0;
+begin
+ for buff in (
+ with q1 as (select start_dtm, id from wt_test_runs
+ where test_runner_id = in_test_runner_id
+ order by start_dtm desc, id desc)
+ ,q2 as (select rownum rnum, start_dtm, id from q1)
+ select start_dtm, id from q2
+ where rnum > g_keep_num_recs)
+ loop
+ num_recs := num_recs + wt_profile.delete_run_id(buff.id);
+ num_recs := num_recs + wt_result.delete_run_id(buff.id);
+ num_recs := num_recs + delete_run_id(buff.id);
+ end loop;
+ return num_recs;
+end delete_runs;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_runs
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Setup';
+ -- DELETE_RECORDS has already run when we arrive here.
+ -- Cleanup from previous test
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Happy Path 1';
+ for i in 1 .. g_keep_num_recs + 1
+ loop
+ insert into wt_test_runs
+ (id, start_dtm, test_runner_id)
+ values
+ (0-i, sysdate-100-i, l_tr_id);
+ end loop;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Check Added ' || g_keep_num_recs || ' records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => g_keep_num_recs + 1);
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_runs(' || l_tr_id || ')',
+ check_this_in => delete_runs(l_tr_id),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_runs(' || l_tr_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Check number of records reduced',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => g_keep_num_recs);
+ delete from wt_test_runs
+ where id between 0-g_keep_num_recs and 0-1;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUNS Sad Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_runs(-9995)',
+ check_this_in => delete_runs(-9995),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_runs(-9995) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ end t_delete_runs;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+-- Setting "g_test_runs_rec" to NULL is trivial.
+-- Other initializers already tested. NOT UNIT TESTING!
+procedure initialize
+is
+ l_test_runs_recNULL wt_test_runs%ROWTYPE;
+begin ------%WTPLSQL_begin_ignore_lines%------
+ g_test_runs_rec := l_test_runs_recNULL;
+ wt_result.initialize;
+ wt_profile.initialize; -- Clear, Check, and Set Profiler Runid
+end initialize; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_initialize
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Initialization Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Initialization',
+ check_this_in => 'Setting "g_test_runs_rec" to NULL is trivial. Other initializers already tested');
+ end t_initialize;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Not Testing Finalization
+-- All components already tested
+procedure finalize1
+is
+ junk number;
+begin ------%WTPLSQL_begin_ignore_lines%------
+ set_g_test_runs_rec;
+ junk := delete_runs(g_test_runs_rec.test_runner_id);
+ insert_test_run; -- With COMMIT
+ wt_result.finalize(g_test_runs_rec.id); -- With COMMIT
+ wt_profile.finalize(g_test_runs_rec.id); -- With COMMIT
+end finalize1; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize1
+ is
+ -- To Unit Test, need to save/set/restore these variables/structures/tables
+ -- For set_g_test_runs_rec
+ -- -) core_data.g_run_rec;
+ -- -) g_test_runs_rec
+ -- For delete_runs: wt_test_runs Table
+ -- For insert_test_run: g_test_runs_rec
+ -- For wt_result.finalize
+ -- -) core_data.results_rec_type
+ -- -) core_data.g_results_nt
+ -- -) wt_results Table
+ -- -) wt_testcase_runs Table
+ -- -) wt_test_runs Table
+ -- For wt_profile.finalize
+ -- -) core_data.g_run_rec
+ -- -) wt_profile.g_rec
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalization1 Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Finalization1',
+ check_this_in => 'All components already tested');
+ end t_finalize1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function finalize2
+ return number
+is
+ ret_num number;
+begin
+ -- Update any additional errors
+ -- This will cause a chained row in WT_TEST_RUNS
+ update wt_test_runs
+ set error_message = g_test_runs_rec.error_message
+ where id = g_test_runs_rec.id
+ and ( ( error_message is null
+ and g_test_runs_rec.error_message is not null )
+ or (error_message != g_test_runs_rec.error_message) );
+ ret_num := SQL%ROWCOUNT;
+ commit;
+ return ret_num;
+end finalize2;
+
+procedure finalize2
+is
+ -- Procedure Overload for finalize2
+ junk number;
+begin
+ junk := finalize2;
+end finalize2;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_finalize2
+ is
+ runner_id wt_test_runners.id%TYPE := -99;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Finalization2 Testing';
+ wt_assert.isnull (
+ msg_in => 'Confirm g_test_runs_rec.error_message NULL',
+ check_this_in => g_test_runs_rec.error_message);
+ wt_assert.isnull (
+ msg_in => 'Confirm g_test_runs_rec.id is NULL',
+ check_this_in => g_test_runs_rec.id);
+ g_test_runs_rec.id := -99;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into wt_test_runners (ID, OWNER, NAME)
+ values (runner_id, 'Finalization2 Testing', 'Finalization2 Testing');
+ wt_assert.eq (
+ msg_in => 'Setup WT_TEST_RUNNERS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Setup WT_TEST_RUNNERS Record for finalize2 Test Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ insert into wt_test_runs (ID, TEST_RUNNER_ID, START_DTM)
+ values (g_test_runs_rec.id, runner_id, sysdate);
+ wt_assert.eq (
+ msg_in => 'Setup WT_TEST_RUNS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Setup WT_TEST_RUNS Record for finalize2 Test Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ g_test_runs_rec.error_message := 'This is Test Message 1 for Finalization2 Testing';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run finalize2',
+ check_this_in => finalize2,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run finalize2 Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Confirm wt_test_runs.error_message updated',
+ check_query_in => 'select error_message from wt_test_runs' ||
+ ' where id = ' || g_test_runs_rec.id,
+ against_value_in => g_test_runs_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ g_test_runs_rec.error_message := 'This is Test Message 2 for Finalization2 Testing';
+ wt_assert.raises (
+ msg_in => 'Run wt_test_runs.error_message to clear message',
+ check_call_in => 'begin wt_test_run.finalize2; end;',
+ against_exc_in => cast (NULL as number));
+ wt_assert.eqqueryvalue (
+ msg_in => 'Confirm wt_test_runs.error_message cleared',
+ check_query_in => 'select error_message from wt_test_runs' ||
+ ' where id = ' || g_test_runs_rec.id,
+ against_value_in => g_test_runs_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ delete from wt_test_runs where ID = g_test_runs_rec.id;
+ wt_assert.eq (
+ msg_in => 'Delete WT_TEST_RUNS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Delete WT_TEST_RUNS Record for finalize2 Test Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ delete from wt_test_runners where ID = runner_id;
+ wt_assert.eq (
+ msg_in => 'Delete WT_TEST_RUNNERS Record for finalize2 Test',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Delete WT_TEST_RUNNERS Record for finalize2 Test Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ commit;
+ g_test_runs_rec.id := NULL;
+ end t_finalize2;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function get_last_run_flag
+ return varchar2
+is
+begin
+ return C_LAST_RUN_FLAG;
+end get_last_run_flag;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_last_run_flag
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Get Last Run Flag Testing';
+ wt_assert.eq (
+ msg_in => 'Test 01',
+ check_this_in => get_last_run_flag,
+ against_this_in => C_LAST_RUN_FLAG);
+ end t_get_last_run_flag;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Use the SET_LAST_RUN procedure to set the LAST_RUN flag
+-- after running this procedure.
+function set_last_run
+ (in_test_runner_id in number)
+ return number
+as
+ num_rows number;
+ num_clear number;
+begin
+ if in_test_runner_id is null
+ then
+ return 0;
+ end if;
+ select count(is_last_run)
+ into num_rows
+ from wt_test_runs
+ where test_runner_id = in_test_runner_id
+ and is_last_run = C_LAST_RUN_FLAG;
+ if num_rows = 1
+ then
+ -- Abort if a LAST_RUN_FLAG is already set
+ return -1;
+ end if;
+ if num_rows > 1
+ then
+ -- Clear out previous Flags
+ num_clear := clear_last_run(in_test_runner_id);
+ end if;
+ --Update the latest as the LAST_RUN
+ update wt_test_runs
+ set is_last_run = C_LAST_RUN_FLAG
+ where test_runner_id = in_test_runner_id
+ and start_dtm = (
+ select max(tr.start_dtm)
+ from wt_test_runs tr
+ where tr.test_runner_id = in_test_runner_id);
+ return SQL%ROWCOUNT;
+end set_last_run;
+
+------------------------------------------------------------
+-- Procedure Overload
+procedure set_last_run
+ (in_test_runner_id in number)
+as
+ junk number;
+begin
+ junk := set_last_run(in_test_runner_id);
+end set_last_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_set_last_run
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Setup';
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-11, l_tr_id, C_LAST_RUN_FLAG, sysdate);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-12, l_tr_id, C_LAST_RUN_FLAG, sysdate-1);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 2);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 2);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Sad Path: Too Many C_LAST_RUN_FLAG Set';
+ begin
+ wt_assert.eq (
+ msg_in => 'Too many C_LAST_RUN_FLAG is set for ' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => -1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Test Run ID of Last Run',
+ check_query_in => 'select id from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => -11);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Happy Path 1';
+ delete from wt_test_runs where id = -11;
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.raises (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_call_in => 'begin wt_test_run.set_last_run(' || l_tr_id || '); end;',
+ against_exc_in => cast(NULL as number));
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Test Run ID of Last Run',
+ check_query_in => 'select id from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => -12);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'C_LAST_RUN_FLAG is already set for ' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => -1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'SET_LAST_RUN Happy Path 2';
+ delete from wt_test_runs where id = -12;
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Test Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(' || l_tr_id || ')',
+ check_this_in => set_last_run(l_tr_id),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(' || l_tr_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(NULL)',
+ check_this_in => set_last_run(NULL),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(NULL) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run set_last_run(-99)',
+ check_this_in => set_last_run(-99),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run set_last_run(-99) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ end t_set_last_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function delete_run_id
+ (in_test_run_id in number)
+ return number
+is
+ l_test_runner_id number;
+ ret_num number;
+begin
+ begin
+ select test_runner_id
+ into l_test_runner_id
+ from wt_test_runs
+ where id = in_test_run_id;
+ exception when NO_DATA_FOUND then
+ return 0;
+ end;
+ delete from wt_test_runs where id = in_test_run_id;
+ ret_num := SQL%ROWCOUNT;
+ set_last_run(l_test_runner_id);
+ return ret_num;
+end delete_run_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_run_id
+ is
+ l_tr_id number := wt_test_runner.dim_id(C_OWNER, C_NAME);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Setup';
+ delete from wt_test_runs where test_runner_id = l_tr_id;
+ wt_assert.isnotnull (
+ msg_in => 'Clear any previous records (ROWCOUNT)',
+ check_this_in => SQL%ROWCOUNT);
+ COMMIT;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Happy Path 1';
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-9, l_tr_id, '', sysdate-3);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-10, l_tr_id, '', sysdate-2);
+ insert into wt_test_runs (id, test_runner_id, is_last_run, start_dtm)
+ values (-11, l_tr_id, C_LAST_RUN_FLAG, sysdate-1);
+ COMMIT;
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After Insert',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 3);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-11)',
+ check_this_in => delete_run_id(-11),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-11) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 2);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-10)',
+ check_this_in => delete_run_id(-10),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-10) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After 2nd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 1);
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Last Run Records, 2nd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id ||
+ ' and is_last_run = ''' || C_LAST_RUN_FLAG || '''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_run_id(-9)',
+ check_this_in => delete_run_id(-9),
+ against_this_in => 1);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_run_id(-9) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue (
+ msg_in => 'Number of Records After 3rd Delete',
+ check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where test_runner_id = ' || l_tr_id,
+ against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'DELETE_RUN_ID Sad Path 1';
+ -- Should run without error
+ wt_assert.raises(
+ msg_in => 'Delete Run ID(-9995)',
+ check_call_in => 'declare junk number; begin junk := wt_test_run.delete_run_id(-9995); end;',
+ against_exc_in => '');
+ end t_delete_run_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Hooks are active during Unit Testing
+-- Unable to Unit Test this
+procedure insert_hooks
+is
+begin ------%WTPLSQL_begin_ignore_lines%------
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_run', 30, 'begin wtp.wt_test_run.initialize; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 30, 'begin wtp.wt_test_run.finalize1; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 70, 'begin wtp.wt_test_run.finalize2; end;');
+ commit;
+ hook.init;
+end insert_hooks; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Hooks are active during Unit Testing
+-- Unable to Unit Test this
+procedure delete_hooks
+is
+begin ------%WTPLSQL_begin_ignore_lines%------
+ delete from hooks where run_string like '% wtp.wt_test_run.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "wt_test_run" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks; ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TEST_RUN:PACKAGE BODY';
+ t_set_g_test_runs_rec;
+ t_clear_last_run;
+ t_insert_test_run;
+ t_delete_runs;
+ t_initialize;
+ t_finalize1;
+ t_finalize2;
+ t_get_last_run_flag;
+ t_set_last_run;
+ t_delete_run_id;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_test_run;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUN.pspec b/wtpsav/WTP/WT_TEST_RUN.pspec
new file mode 100644
index 0000000..2ed49be
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUN.pspec
@@ -0,0 +1,66 @@
+
+--
+-- Create WTP.WT_TEST_RUN Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUN
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_TEST_RUN"
+ authid definer
+as
+
+ C_LAST_RUN_FLAG constant varchar2(1) := 'Y';
+
+ function get_last_run_flag
+ return varchar2 deterministic;
+
+ function set_last_run
+ (in_test_runner_id in number)
+ return number;
+ procedure set_last_run
+ (in_test_runner_id in number);
+
+ g_keep_num_recs number := 20;
+
+ procedure initialize;
+
+ procedure finalize1;
+
+ function finalize2
+ return number;
+ procedure finalize2;
+
+ function delete_run_id
+ (in_test_run_id in number)
+ return number;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_test_run;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WT_TEST_RUN" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNNER.pbody b/wtpsav/WTP/WT_TEST_RUNNER.pbody
new file mode 100644
index 0000000..edb6233
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNNER.pbody
@@ -0,0 +1,400 @@
+
+--
+-- Create WTP.WT_TEST_RUNNER Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNNER
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_TEST_RUNNER"
+as
+
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ C_OWNER CONSTANT varchar2(50) := 'WT_TEST_RUNNER_OWNER_FOR_TESTING_1234ABCD';
+ C_NAME CONSTANT varchar2(50) := 'WT_TEST_RUNNER_NAME_FOR_TESTING_1234ABCD';
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number
+is
+ l_id number;
+begin
+ select id into l_id
+ from wt_test_runners
+ where owner = in_owner
+ and name = in_name;
+ return l_id;
+exception when NO_DATA_FOUND
+then
+ return NULL;
+end get_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_get_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check for Null return'
+ ,check_this_in => get_id(C_OWNER, C_NAME));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Happy Path 2';
+ insert into wt_test_runners (id, owner, name)
+ values (wt_test_runners_seq.nextval, C_OWNER, C_NAME)
+ returning id into l_id;
+ wt_assert.eq
+ (msg_in => 'Check ID return'
+ ,check_this_in => get_id(C_OWNER, C_NAME)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_get_id Teardown';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_get_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number
+is
+ pragma AUTONOMOUS_TRANSACTION;
+ rec wt_test_runners%ROWTYPE;
+begin
+ if in_owner is NULL
+ OR in_name is NULL
+ then
+ return NULL;
+ end if;
+ rec.id := get_id (in_owner, in_name);
+ if rec.id is null
+ then
+ rec.id := wt_test_runners_seq.nextval;
+ rec.owner := in_owner;
+ rec.name := in_name;
+ insert into wt_test_runners values rec;
+ end if;
+ commit;
+ return rec.id;
+end dim_id;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_dim_id
+ is
+ l_id number;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 1';
+ l_id := dim_id(C_OWNER, C_NAME);
+ wt_assert.isnotnull
+ (msg_in => 'Check ID return 1'
+ ,check_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Happy Path 2';
+ wt_assert.eq
+ (msg_in => 'Check ID return 2'
+ ,check_this_in => dim_id(C_OWNER, C_NAME)
+ ,against_this_in => l_id);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Sad Path 1';
+ wt_assert.isnull
+ (msg_in => 'Check NULL return'
+ ,check_this_in => dim_id(NULL, NULL));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_dim_id Teardown';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.eq
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT
+ ,against_this_in => 1);
+ commit;
+ end t_dim_id;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+-- Delete all records for a test runner
+function delete_records
+ (in_test_runner_id in number)
+ return number
+is
+ ret_num number := 0;
+begin
+ for buff in (
+ select id from wt_test_runs
+ where test_runner_id = in_test_runner_id )
+ loop
+ ret_num := ret_num + wt_profile.delete_run_id(buff.id);
+ ret_num := ret_num + wt_result.delete_run_id(buff.id);
+ ret_num := ret_num + wt_test_run.delete_run_id(buff.id);
+ end loop;
+ delete from wt_test_runners where id = in_test_runner_id;
+ ret_num := ret_num + SQL%ROWCOUNT;
+ return ret_num;
+end delete_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_delete_records
+ is
+ l_runner_id number := -99;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of wt_test_runners Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ delete from wt_test_runs
+ where id = l_runner_id
+ and test_runner_id = l_runner_id;
+ wt_assert.isnotnull
+ (msg_in => 'Number of wt_test_runs Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runners (id, owner, name)
+ values (l_runner_id, C_OWNER, C_NAME);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of wt_test_runners Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runs (id, test_runner_id, start_dtm)
+ values (l_runner_id, l_runner_id, sysdate);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of wt_test_runs Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runs' ||
+ ' where id = ' || l_runner_id ||
+ ' and test_runner_id = ' || l_runner_id
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 1';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(' || l_runner_id || ')',
+ check_this_in => delete_records(l_runner_id),
+ against_this_in => 2);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(' || l_runner_id || ') Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(' || l_runner_id || ') Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 2';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(NULL)',
+ check_this_in => delete_records(NULL),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(NULL) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(NULL) Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_delete_records Happy Path 3';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run delete_records(-9999)',
+ check_this_in => delete_records(-9999),
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run delete_records(-9999) Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'delete_records(-9999) Number of wt_test_runners Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_delete_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+function cleanup_records
+ return number
+is
+begin
+ delete from wt_test_runners
+ where id in (
+ select id from wt_test_runners
+ MINUS
+ select distinct test_runner_id ID from wt_test_runs);
+ return SQL%ROWCOUNT;
+end cleanup_records;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_cleanup_records
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Setup';
+ delete from wt_test_runners
+ where owner = C_OWNER
+ and name = C_NAME;
+ wt_assert.isnotnull
+ (msg_in => 'Number of Rows deleted'
+ ,check_this_in => SQL%ROWCOUNT);
+ -------------------------------------- WTPLSQL Testing --
+ insert into wt_test_runners (id, owner, name)
+ values (wt_test_runners_seq.nextval, C_OWNER, C_NAME);
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 1'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Happy Path 1';
+ begin
+ wt_assert.isnotnull (
+ msg_in => 'Run cleanup_records 1',
+ check_this_in => cleanup_records);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run cleanup_records 1 Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 't_cleanup_records Happy Path 2';
+ begin
+ wt_assert.eq (
+ msg_in => 'Run cleanup_records 2',
+ check_this_in => cleanup_records,
+ against_this_in => 0);
+ exception when others then
+ wt_assert.isnull(
+ msg_in => 'Run cleanup_records 2 Exception',
+ check_this_in => SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack );
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of Rows should still be 0'
+ ,check_query_in => 'select count(*) from wt_test_runners' ||
+ ' where owner = ''' || C_OWNER ||
+ ''' and name = ''' || C_NAME || ''''
+ ,against_value_in => 0);
+ commit;
+ end t_cleanup_records;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql.g_DBOUT := 'WT_TEST_RUNNER:PACKAGE BODY';
+ t_get_id;
+ t_dim_id;
+ t_delete_records;
+ t_cleanup_records;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wt_test_runner;
+/
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNNER.pspec b/wtpsav/WTP/WT_TEST_RUNNER.pspec
new file mode 100644
index 0000000..63d2653
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNNER.pspec
@@ -0,0 +1,59 @@
+
+--
+-- Create WTP.WT_TEST_RUNNER Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNNER
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_TEST_RUNNER"
+ authid definer
+as
+
+ -- Return a Test Runner Surrogate Key.
+ -- Return NULL if the Test Runner does not exist.
+ function get_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number;
+
+ -- Return a Test Runner Surrogate Key.
+ -- Add the Test Runner if it does not exist.
+ function dim_id
+ (in_owner in varchar2
+ ,in_name in varchar2)
+ return number;
+
+ -- Delete all records for a test runner
+ function delete_records
+ (in_test_runner_id in number)
+ return number;
+
+ -- Delete all records with no child records
+ function cleanup_records
+ return number;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wt_test_runner;
+/
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNNERS.tab b/wtpsav/WTP/WT_TEST_RUNNERS.tab
new file mode 100644
index 0000000..81bfc89
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNNERS.tab
@@ -0,0 +1,43 @@
+
+--
+-- Create WTP.WT_TEST_RUNNERS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNNERS
+
+ CREATE TABLE "WTP"."WT_TEST_RUNNERS"
+ ( "ID" NUMBER(38,0) CONSTRAINT "WT_TEST_RUNNERS_NN1" NOT NULL ENABLE,
+ "OWNER" VARCHAR2(128 BYTE) CONSTRAINT "WT_TEST_RUNNERS_NN2" NOT NULL ENABLE,
+ "NAME" VARCHAR2(128 BYTE) CONSTRAINT "WT_TEST_RUNNERS_NN3" NOT NULL ENABLE
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_TEST_RUNNERS" ADD CONSTRAINT "WT_TEST_RUNNERS_PK" PRIMARY KEY ("ID")
+ USING INDEX ENABLE;
+ALTER TABLE "WTP"."WT_TEST_RUNNERS" ADD CONSTRAINT "WT_TEST_RUNNERS_NK1" UNIQUE ("OWNER", "NAME")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TEST_RUNNERS
+
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNNERS"."ID" IS 'Primary (Surrogate) Key for each Test Runner';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNNERS"."OWNER" IS 'Owner of the Test Runner package. Natural Key 1 part 1';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNNERS"."NAME" IS 'Name of the Test Runner package. Natural Key 1 part 2';
+ COMMENT ON TABLE "WTP"."WT_TEST_RUNNERS" IS 'List of Test Runners.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_TEST_RUNNERS" to "PUBLIC";
+grant SELECT on "WTP"."WT_TEST_RUNNERS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNNERS_SEQ.seq b/wtpsav/WTP/WT_TEST_RUNNERS_SEQ.seq
new file mode 100644
index 0000000..d62b7f5
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNNERS_SEQ.seq
@@ -0,0 +1,20 @@
+
+--
+-- Create WTP.WT_TEST_RUNNERS_SEQ Sequence
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNNERS_SEQ
+
+ CREATE SEQUENCE "WTP"."WT_TEST_RUNNERS_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 ORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNS.tab b/wtpsav/WTP/WT_TEST_RUNS.tab
new file mode 100644
index 0000000..632212a
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNS.tab
@@ -0,0 +1,78 @@
+
+--
+-- Create WTP.WT_TEST_RUNS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS
+
+ CREATE TABLE "WTP"."WT_TEST_RUNS"
+ ( "ID" NUMBER(38,0),
+ "TEST_RUNNER_ID" NUMBER(38,0) CONSTRAINT "WT_TEST_RUNS_NN1" NOT NULL ENABLE,
+ "START_DTM" TIMESTAMP (3) WITH LOCAL TIME ZONE CONSTRAINT "WT_TEST_RUNS_NN2" NOT NULL ENABLE,
+ "END_DTM" TIMESTAMP (3) WITH LOCAL TIME ZONE,
+ "DBOUT_ID" NUMBER(38,0),
+ "RUNNER_SEC" NUMBER(6,1),
+ "IS_LAST_RUN" VARCHAR2(1 BYTE),
+ "ERROR_MESSAGE" VARCHAR2(4000 BYTE),
+ "TC_CNT" NUMBER(7,0),
+ "TC_FAIL" NUMBER(7,0),
+ "TC_YIELD_PCT" NUMBER(4,1),
+ "ASRT_FST_DTM" TIMESTAMP (3) WITH LOCAL TIME ZONE,
+ "ASRT_LST_DTM" TIMESTAMP (3) WITH LOCAL TIME ZONE,
+ "ASRT_CNT" NUMBER(7,0),
+ "ASRT_FAIL" NUMBER(7,0),
+ "ASRT_YIELD_PCT" NUMBER(4,1),
+ "ASRT_MIN_MSEC" NUMBER(10,0),
+ "ASRT_AVG_MSEC" NUMBER(10,0),
+ "ASRT_MAX_MSEC" NUMBER(10,0),
+ "ASRT_TOT_MSEC" NUMBER(10,0)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_TEST_RUNS" ADD CONSTRAINT "WT_TEST_RUNS_PK" PRIMARY KEY ("ID")
+ USING INDEX ENABLE;
+ALTER TABLE "WTP"."WT_TEST_RUNS" ADD CONSTRAINT "WT_TEST_RUNS_NK1" UNIQUE ("TEST_RUNNER_ID", "START_DTM")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS
+
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ID" IS 'Primary (Surrogate) Key for each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."TEST_RUNNER_ID" IS '(Required) Surrogate Key the Test Runner package. Natural Key 1 part 1';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."START_DTM" IS '(Required) Date/time (and fractional seconds) this Test Run started. Natural Key 1 part 2';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."END_DTM" IS 'Date/time (and fractional seconds) this Test Run ended.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."DBOUT_ID" IS 'Surrogate Key to the Database Object Under Test (DBOUT).';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."RUNNER_SEC" IS 'Total Runtime for Test Runner in Seconds';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."IS_LAST_RUN" IS 'Flag "Y" to indicate this is the most recent run for this package owner/name';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ERROR_MESSAGE" IS 'Error messages from this Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."TC_CNT" IS 'Number of Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."TC_FAIL" IS 'Number of Failed Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."TC_YIELD_PCT" IS 'Percentage of successful test cases to total Test Cases.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_FST_DTM" IS 'Date/Time of First Assertion';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_LST_DTM" IS 'Date/Time of Last Assertion';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_CNT" IS 'Number of Assertions across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_FAIL" IS 'Number of Assertion Failures across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_YIELD_PCT" IS 'Percentage of successful assertions to total assertions.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_MIN_MSEC" IS 'Minumum Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_AVG_MSEC" IS 'Average Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_MAX_MSEC" IS 'Maximum Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS"."ASRT_TOT_MSEC" IS 'Total Assertion Intervals in Milliseconds across all Test Cases';
+ COMMENT ON TABLE "WTP"."WT_TEST_RUNS" IS 'Test Run data for each execution of a Test Runner.';
+
+
+-- Grants
+grant DELETE on "WTP"."WT_TEST_RUNS" to "PUBLIC";
+grant INSERT on "WTP"."WT_TEST_RUNS" to "PUBLIC";
+grant SELECT on "WTP"."WT_TEST_RUNS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNS.tabfk b/wtpsav/WTP/WT_TEST_RUNS.tabfk
new file mode 100644
index 0000000..9e8176e
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNS.tabfk
@@ -0,0 +1,23 @@
+
+--
+-- Create Foreign Keys for WTP.WT_TEST_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_FK1
+
+ ALTER TABLE "WTP"."WT_TEST_RUNS" ADD CONSTRAINT "WT_TEST_RUNS_FK1" FOREIGN KEY ("DBOUT_ID")
+ REFERENCES "WTP"."WT_DBOUTS" ("ID") ENABLE;
+
+-- NOTE: This is a "BASE TABLE" Foreign Key
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_FK2
+
+ ALTER TABLE "WTP"."WT_TEST_RUNS" ADD CONSTRAINT "WT_TEST_RUNS_FK2" FOREIGN KEY ("TEST_RUNNER_ID")
+ REFERENCES "WTP"."WT_TEST_RUNNERS" ("ID") ENABLE;
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNS.tabind b/wtpsav/WTP/WT_TEST_RUNS.tabind
new file mode 100644
index 0000000..3013461
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNS.tabind
@@ -0,0 +1,23 @@
+
+--
+-- Create Indexes for WTP.WT_TEST_RUNS TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_IX1
+
+ CREATE INDEX "WTP"."WT_TEST_RUNS_IX1" ON "WTP"."WT_TEST_RUNS" ("IS_LAST_RUN", "TEST_RUNNER_ID")
+ ;
+
+-- NOTE: This is a "TARGET" Index
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_IX2
+
+ CREATE INDEX "WTP"."WT_TEST_RUNS_IX2" ON "WTP"."WT_TEST_RUNS" ("DBOUT_ID", "TEST_RUNNER_ID")
+ ;
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNS_SEQ.seq b/wtpsav/WTP/WT_TEST_RUNS_SEQ.seq
new file mode 100644
index 0000000..7e040c4
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNS_SEQ.seq
@@ -0,0 +1,21 @@
+
+--
+-- Create WTP.WT_TEST_RUNS_SEQ Sequence
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_SEQ
+
+ CREATE SEQUENCE "WTP"."WT_TEST_RUNS_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 ORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
+
+
+-- Grants
+grant SELECT on "WTP"."WT_TEST_RUNS_SEQ" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/WTP/WT_TEST_RUNS_VW.vw b/wtpsav/WTP/WT_TEST_RUNS_VW.vw
new file mode 100644
index 0000000..25a47ac
--- /dev/null
+++ b/wtpsav/WTP/WT_TEST_RUNS_VW.vw
@@ -0,0 +1,87 @@
+
+--
+-- Create WTP.WT_TEST_RUNS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_TEST_RUNS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_TEST_RUNS_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_TEST_RUNS_VW" ("TEST_RUN_ID", "TEST_RUNNER_ID", "TEST_RUNNER_OWNER", "TEST_RUNNER_NAME", "START_DTM", "END_DTM", "RUNNER_SEC", "IS_LAST_RUN", "ERROR_MESSAGE", "TC_CNT", "TC_FAIL", "TC_YIELD_PCT", "ASRT_FST_DTM", "ASRT_LST_DTM", "ASRT_CNT", "ASRT_FAIL", "ASRT_YIELD_PCT", "ASRT_MIN_MSEC", "ASRT_AVG_MSEC", "ASRT_MAX_MSEC", "ASRT_TOT_MSEC") AS
+ select run.id TEST_RUN_ID
+ ,run.test_runner_id
+ ,tr.owner TEST_RUNNER_OWNER
+ ,tr.name TEST_RUNNER_NAME
+ ,run.start_dtm
+ ,run.end_dtm
+ ,run.runner_sec
+ ,run.is_last_run
+ ,run.error_message
+ ,run.tc_cnt
+ ,run.tc_fail
+ ,run.tc_yield_pct
+ ,run.asrt_fst_dtm
+ ,run.asrt_lst_dtm
+ ,run.asrt_cnt
+ ,run.asrt_fail
+ ,run.asrt_yield_pct
+ ,run.asrt_min_msec
+ ,run.asrt_avg_msec
+ ,run.asrt_max_msec
+ ,run.asrt_tot_msec
+ from wt_test_runs run
+ join wt_test_runners tr
+ on tr.id = run.test_runner_id;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_TEST_RUNS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TEST_RUN_ID" IS 'Primary (Surrogate) Key for each Test Run';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TEST_RUNNER_ID" IS 'Surrogate Key the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TEST_RUNNER_OWNER" IS 'Owner of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TEST_RUNNER_NAME" IS 'Name of the Test Runner package.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."START_DTM" IS 'Date/time (and fractional seconds) this Test Run started.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."END_DTM" IS 'Date/time (and fractional seconds) this Test Run ended.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."RUNNER_SEC" IS 'Total Runtime for Test Runner in Seconds';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."IS_LAST_RUN" IS 'Optional Flag "Y" to indicate this is the most recent run for this package owner/name';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ERROR_MESSAGE" IS 'Optional Error messages from this Test Run.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TC_CNT" IS 'Number of Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TC_FAIL" IS 'Number of Failed Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."TC_YIELD_PCT" IS 'Percentage of successful test cases to total Test Cases.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_FST_DTM" IS 'Date/Time of First Assertion';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_LST_DTM" IS 'Date/Time of Last Assertion';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_CNT" IS 'Number of Assertions across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_FAIL" IS 'Number of Assertion Failures across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_YIELD_PCT" IS 'Percentage of successful assertions to total assertions.';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_MIN_MSEC" IS 'Minumum Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_AVG_MSEC" IS 'Sum of Squares of Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_MAX_MSEC" IS 'Maximum Assertion Interval in Milliseconds across all Test Cases';
+ COMMENT ON COLUMN "WTP"."WT_TEST_RUNS_VW"."ASRT_TOT_MSEC" IS 'Total Assertion Intervals in Milliseconds across all Test Cases';
+ COMMENT ON TABLE "WTP"."WT_TEST_RUNS_VW" IS 'Test Run data for each execution of a Test Runner.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_TEST_RUNS_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsav/alter_foreign_keys.sql b/wtpsav/alter_foreign_keys.sql
new file mode 100644
index 0000000..5bd5a97
--- /dev/null
+++ b/wtpsav/alter_foreign_keys.sql
@@ -0,0 +1,88 @@
+
+--
+-- Alter "wtpsav" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Foreign Keys for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/alter_queues.sql b/wtpsav/alter_queues.sql
new file mode 100644
index 0000000..fdadd67
--- /dev/null
+++ b/wtpsav/alter_queues.sql
@@ -0,0 +1,36 @@
+
+--
+-- Alter "wtpsav" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Queues for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/alter_scheduler_jobs.sql b/wtpsav/alter_scheduler_jobs.sql
new file mode 100644
index 0000000..339dbf9
--- /dev/null
+++ b/wtpsav/alter_scheduler_jobs.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpsav" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Scheduler Jobs for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/alter_triggers.sql b/wtpsav/alter_triggers.sql
new file mode 100644
index 0000000..85267f7
--- /dev/null
+++ b/wtpsav/alter_triggers.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpsav" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Triggers for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/compile_all.sql b/wtpsav/compile_all.sql
new file mode 100644
index 0000000..f731fdd
--- /dev/null
+++ b/wtpsav/compile_all.sql
@@ -0,0 +1,36 @@
+
+--
+-- Compile All "wtpsav" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+ dbms_output.put_line('Compile All for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/db_build_junit_report.sql b/wtpsav/db_build_junit_report.sql
new file mode 100644
index 0000000..02394ef
--- /dev/null
+++ b/wtpsav/db_build_junit_report.sql
@@ -0,0 +1,112 @@
+
+--
+-- Create JUnit XML Report of Database Build Status for "wtpsav" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+ do_it('WTP');
+ ot('');
+end;
+/
diff --git a/wtpsav/db_install.sql b/wtpsav/db_install.sql
new file mode 100644
index 0000000..8fab835
--- /dev/null
+++ b/wtpsav/db_install.sql
@@ -0,0 +1,57 @@
+
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+/
+
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+/
+
+set feedback on
diff --git a/wtpsav/fix_invalid_public_synonyms.sql b/wtpsav/fix_invalid_public_synonyms.sql
new file mode 100644
index 0000000..ef70282
--- /dev/null
+++ b/wtpsav/fix_invalid_public_synonyms.sql
@@ -0,0 +1,49 @@
+
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+/
+
diff --git a/wtpsav/install.sql b/wtpsav/install.sql
new file mode 100644
index 0000000..6033345
--- /dev/null
+++ b/wtpsav/install.sql
@@ -0,0 +1,76 @@
+
+--
+-- Master Installation Script
+-- All scripts created by "https://ODBCapture.org", Version V2.1
+--
+-- Must be run as SYS
+--
+-- Command Line Parameters:
+-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the pluggable database.
+-- The Data Load installation requires this connection information.
+--
+
+-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:
+-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv
+
+define TOP_PDB_SYSTEM="&1."
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt Identify this Module in V$SESSION
+set appinfo "wtpsav Installation"
+
+----------------------------------------
+prompt Setup Abort on Error
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+----------------------------------------
+prompt
+prompt **************************
+prompt * Run SYS Installation *
+prompt **************************
+prompt
+@install_sys.sql "" "" ""
+
+----------------------------------------
+prompt Setup Continue on Error
+WHENEVER SQLERROR CONTINUE
+WHENEVER OSERROR CONTINUE
+
+----------------------------------------
+prompt
+prompt *****************************
+prompt * Run SYSTEM Installation *
+prompt *****************************
+prompt
+connect &TOP_PDB_SYSTEM.
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+@install_system.sql "" "" ""
+
+----------------------------------------
+prompt
+prompt *************************
+prompt * Install Application *
+prompt *************************
+prompt
+@install_wtpsav.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+prompt
+prompt *****************
+prompt * Run Reports *
+prompt *****************
+prompt
+@report_status.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+set appinfo "Null"
+set appinfo off
+prompt
+prompt "wtpsav" Installation is Done.
+
diff --git a/wtpsav/install_sys.sql b/wtpsav/install_sys.sql
new file mode 100644
index 0000000..c53ba1c
--- /dev/null
+++ b/wtpsav/install_sys.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYS Installation Script
+--
+-- Must be run as SYS
+--
+
+spool install_sys.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpsav/install_system.sql b/wtpsav/install_system.sql
new file mode 100644
index 0000000..dd64dd5
--- /dev/null
+++ b/wtpsav/install_system.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYSTEM Installation Script
+--
+-- Must be run as SYSTEM
+--
+
+spool install_system.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpsav/install_wtpsav.sql b/wtpsav/install_wtpsav.sql
new file mode 100644
index 0000000..d5968ec
--- /dev/null
+++ b/wtpsav/install_wtpsav.sql
@@ -0,0 +1,117 @@
+
+--
+-- wtpsav Installation Script
+--
+-- Must be run as a SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+spool install_wtpsav.log
+
+define INSTALL_SYSTEM_CONNECT="&1."
+
+-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages
+set sqlprefix "~"
+
+-- Using "^P", CHR(16), DLE as an escape character
+set escape OFF
+set escape ""
+
+----------------------------------------
+-- Prepare for Install
+@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- SEQUENCE Install
+
+@db_install.sql "WTP/PLSQL_PROFILER_RUNNUMBER.seq" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_DBOUTS_SEQ.seq" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASES_SEQ.seq" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNNERS_SEQ.seq" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNS_SEQ.seq" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PROCEDURE Install
+
+@db_install.sql "WTP/JUNIT_XML_PERSIST_ALL.proc" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE Install
+
+@db_install.sql "WTP/WT_DBOUT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_JOB.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PERSIST_REPORT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PROFILE.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUN.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNNER.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE Install
+
+@db_install.sql "WTP/PLSQL_PROFILER_DATA.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/PLSQL_PROFILER_RUNS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/PLSQL_PROFILER_UNITS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_DBOUTS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_DBOUT_RUNS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PROFILES.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULTS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASES.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE_RUNS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNNERS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- INDEX Install
+
+@db_install.sql "WTP/PLSQL_PROFILER_RUNS.tabind" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_DBOUTS.tabind" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULTS.tabind" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE_RUNS.tabind" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNS.tabind" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- VIEW Install
+
+@db_install.sql "WTP/WT_DBOUT_RUNS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PROFILES_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULTS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_SCHEDULER_JOBS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE_RUNS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE BODY Install
+
+@db_install.sql "WTP/WT_DBOUT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_JOB.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PERSIST_REPORT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PROFILE.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUN.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNNER.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE_FOREIGN_KEY Install
+
+@db_install.sql "WTP/PLSQL_PROFILER_DATA.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/PLSQL_PROFILER_UNITS.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_DBOUT_RUNS.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_PROFILES.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_RESULTS.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TESTCASE_RUNS.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_TEST_RUNS.tabfk" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- Finalize Installation
+@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+spool off
+
diff --git a/wtpsav/installation_finalize.sql b/wtpsav/installation_finalize.sql
new file mode 100644
index 0000000..7660714
--- /dev/null
+++ b/wtpsav/installation_finalize.sql
@@ -0,0 +1,48 @@
+
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."
diff --git a/wtpsav/installation_prepare.sql b/wtpsav/installation_prepare.sql
new file mode 100644
index 0000000..265eb55
--- /dev/null
+++ b/wtpsav/installation_prepare.sql
@@ -0,0 +1,9 @@
+
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;
diff --git a/wtpsav/list_invalids.csv b/wtpsav/list_invalids.csv
new file mode 100644
index 0000000..e2d4f25
--- /dev/null
+++ b/wtpsav/list_invalids.csv
@@ -0,0 +1 @@
+"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"
diff --git a/wtpsav/list_invalids.sql b/wtpsav/list_invalids.sql
new file mode 100644
index 0000000..285c5f4
--- /dev/null
+++ b/wtpsav/list_invalids.sql
@@ -0,0 +1,47 @@
+
+--
+-- List Invalid Objects for "wtpsav" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsav/log_files_junit_report.sql b/wtpsav/log_files_junit_report.sql
new file mode 100644
index 0000000..3ea9f0a
--- /dev/null
+++ b/wtpsav/log_files_junit_report.sql
@@ -0,0 +1,282 @@
+
+--
+-- Create JUnit XML Report of Database Log Files for "wtpsav" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_wtpsav
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = 'wtpsav'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+/
diff --git a/wtpsav/odbcapture_installation_logs.cdl b/wtpsav/odbcapture_installation_logs.cdl
new file mode 100644
index 0000000..efb09a6
--- /dev/null
+++ b/wtpsav/odbcapture_installation_logs.cdl
@@ -0,0 +1,71 @@
+
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+/
+
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpsav/odbcapture_installation_logs.csv b/wtpsav/odbcapture_installation_logs.csv
new file mode 100644
index 0000000..21815fe
--- /dev/null
+++ b/wtpsav/odbcapture_installation_logs.csv
@@ -0,0 +1,3 @@
+"wtpsav","install_sys.log"
+"wtpsav","install_system.log"
+"wtpsav","install_wtpsav.log"
diff --git a/wtpsav/odbcapture_installation_logs.ctl b/wtpsav/odbcapture_installation_logs.ctl
new file mode 100644
index 0000000..3a1cf46
--- /dev/null
+++ b/wtpsav/odbcapture_installation_logs.ctl
@@ -0,0 +1,8 @@
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )
diff --git a/wtpsav/report_status.sql b/wtpsav/report_status.sql
new file mode 100644
index 0000000..fd1a73a
--- /dev/null
+++ b/wtpsav/report_status.sql
@@ -0,0 +1,114 @@
+
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = 'wtpsav'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+/
+
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
diff --git a/wtpsav/update_id_sequences.sql b/wtpsav/update_id_sequences.sql
new file mode 100644
index 0000000..e58f26f
--- /dev/null
+++ b/wtpsav/update_id_sequences.sql
@@ -0,0 +1,59 @@
+
+--
+-- Update "wtpsav" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Update ID Sequences for wtpsav Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/SYS/WTP.usr b/wtpsrc/SYS/WTP.usr
new file mode 100644
index 0000000..b7f2376
--- /dev/null
+++ b/wtpsrc/SYS/WTP.usr
@@ -0,0 +1,26 @@
+
+--
+-- Create WTP Schema
+--
+
+set define off
+
+create user "WTP"
+ identified by "WTP"
+ default tablespace USERS
+ temporary tablespace TEMP
+ profile DEFAULT
+ quota 512M on USERS
+;
+
+-- Grant SYS Objects (but not directories)
+
+grant SELECT on "SYS"."DBA_OBJECTS" to "WTP" with grant option;
+grant SELECT on "SYS"."DBA_PROCEDURES" to "WTP" with grant option;
+grant SELECT on "SYS"."DBA_SOURCE" to "WTP" with grant option;
+grant EXECUTE on "SYS"."DBMS_ALERT" to "WTP";
+grant SELECT on "SYS"."DBMS_ALERT_INFO" to "WTP" with grant option;
+grant EXECUTE on "SYS"."DBMS_LOCK" to "WTP";
+grant SELECT on "SYS"."GV_$PARAMETER" to "WTP" with grant option;
+
+set define on
diff --git a/wtpsrc/SYSTEM/WTP_usr.grnt b/wtpsrc/SYSTEM/WTP_usr.grnt
new file mode 100644
index 0000000..ae40430
--- /dev/null
+++ b/wtpsrc/SYSTEM/WTP_usr.grnt
@@ -0,0 +1,56 @@
+
+--
+-- Create WTP Grants
+--
+
+set define off
+
+
+-- Database System Privileges
+
+--DBMS_METADATA:WTP
+
+ GRANT CREATE SESSION TO "WTP";
+ GRANT CREATE TABLE TO "WTP";
+ GRANT CREATE PUBLIC SYNONYM TO "WTP";
+ GRANT CREATE VIEW TO "WTP";
+ GRANT CREATE SEQUENCE TO "WTP";
+ GRANT CREATE DATABASE LINK TO "WTP";
+ GRANT CREATE PROCEDURE TO "WTP";
+ GRANT EXECUTE ANY PROCEDURE TO "WTP";
+ GRANT CREATE TRIGGER TO "WTP";
+ GRANT CREATE TYPE TO "WTP";
+ GRANT CREATE JOB TO "WTP";
+
+-- "sys" INSTALL_TYPE Role Grants
+-- "GRANTEE" (delayed) Role Grants
+-- Note: "OBJECT" Schema Object Grants are given during Role creation
+
+
+
+-- "sys" INSTALL_TYPE Schema Object Grants, excluding SYS objects
+-- "GRANTEE" (delayed) Schema Object Grants
+-- Note: "OBJECT" Schema Object Grants are given during object creation
+
+
+
+-- Advanced Queue System Privileges
+
+
+
+-- Advanced Queue Grants
+-- "GRANTEE" (Delayed) Advanced Queue Grants
+-- Note: "QUEUE" Advanced Queue Grants are given during object creation
+
+-- Advanced Queue Subscriptions
+-- "GRANTEE" (Delayed) Advanced Queue Subscription
+-- Note: "QUEUE" Advanced Queue Subscriptions are given during object creation
+
+
+
+-- "GRANTEE" (Delayed) Fine-Grained Java Permissions
+-- Note: "JAVA_CLASS" Fine-Grained Java Permissions are given during object creation
+--
+
+
+set define on
diff --git a/wtpsrc/WTP/CORE_DATA.pbody b/wtpsrc/WTP/CORE_DATA.pbody
new file mode 100644
index 0000000..2a18d41
--- /dev/null
+++ b/wtpsrc/WTP/CORE_DATA.pbody
@@ -0,0 +1,690 @@
+
+--
+-- Create WTP.CORE_DATA Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.CORE_DATA
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."CORE_DATA"
+is
+
+ g_first_executed_dtm timestamp(6) with local time zone;
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+function get_testcase
+ return long_name
+is
+begin
+ return nvl(wt_assert.g_testcase
+ ,substr(core_data.g_run_rec.test_runner_owner || '.' ||
+ core_data.g_run_rec.test_runner_name, 1, 128));
+end get_testcase;
+
+------------------------------------------------------------
+procedure init1
+ (in_package_name in varchar2)
+is
+ l_run_recNULL run_rec_type;
+ l_testcase long_name;
+begin
+ -- Initialize Test Run Record
+ g_run_rec := l_run_recNULL;
+ g_run_rec.start_dtm := systimestamp;
+ g_run_rec.test_runner_name := in_package_name;
+ -- These don't always work:
+ -- g_run_rec.test_runner_owner := sys_context('userenv', 'current_schema');
+ -- select username into g_run_rec.test_runner_owner from user_users;
+ g_run_rec.test_runner_owner := USER;
+ -- Initialize Test Cases Array
+ l_testcase := g_tcases_aa.LAST;
+ while l_testcase is not null
+ loop
+ g_tcases_aa.DELETE(l_testcase);
+ l_testcase := g_tcases_aa.PRIOR(l_testcase);
+ end loop;
+ -- Initialize Test Results Array
+ g_results_nt := null;
+end init1;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_init1
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INIT "One" Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ g_tcases_aa('INIT Happy 1 Test 1') := NULL;
+ g_tcases_aa('INIT Happy 1 Test 2') := NULL;
+ init1 ('WTPLSQL');
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.test_runner_owner'
+ ,check_this_in => l_run_recTEST.test_runner_owner
+ ,against_this_in => USER);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.test_runner_name'
+ ,check_this_in => l_run_recTEST.test_runner_name
+ ,against_this_in => 'WTPLSQL');
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.start_dtm'
+ ,check_this_in => l_run_recTEST.start_dtm);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm'
+ ,check_this_in => l_run_recTEST.start_dtm > l_run_recSAVE.start_dtm);
+ wt_assert.isnull
+ (msg_in => 'l_run_recTEST.end_dtm'
+ ,check_this_in => l_run_recTEST.end_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.tc_cnt'
+ ,check_this_in => l_run_recTEST.tc_cnt
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.tc_fail'
+ ,check_this_in => l_run_recTEST.tc_fail
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_tot_msec'
+ ,check_this_in => l_run_recTEST.asrt_tot_msec
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'l_tcases_aaTEST.FIRST'
+ ,check_this_in => l_tcases_aaTEST.FIRST);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST is null'
+ ,check_this_in => (l_results_ntTEST is NULL) );
+ end t_init1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure init2
+is
+begin
+ g_first_executed_dtm := systimestamp;
+end init2;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_init2
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ lt PLS_INTEGER;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'INIT "Two" Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ -- lt points to the NULL record in g_results_nt
+ lt := g_results_nt.COUNT;
+ g_results_nt(lt).executed_dtm := null;
+ init2;
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(1).executed_dtm'
+ ,check_this_in => l_results_ntTEST(1).executed_dtm);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm'
+ ,check_this_in => l_results_ntTEST(1).executed_dtm >= l_run_recTEST.start_dtm);
+ end t_init2;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure add
+ (in_testcase in varchar2
+ ,in_assertion in varchar2
+ ,in_pass in boolean
+ ,in_details in varchar2
+ ,in_message in varchar2)
+is
+ l_results_rec results_rec_type;
+ l_results_recNULL results_rec_type;
+ l_tcases_rec tcases_rec_type;
+ l_current_tstamp timestamp(6) with local time zone := systimestamp;
+ l_interval_buff interval day(9) to second(6);
+begin
+ ------------------------------------------------------------
+ -- Set and Update "l_results_rec"
+ if g_results_nt is null
+ then
+ l_results_rec := l_results_recNULL;
+ else
+ l_results_rec := g_results_nt(g_results_nt.COUNT);
+ end if;
+ l_results_rec.testcase := nvl(in_testcase
+ ,substr(g_run_rec.test_runner_owner || '.' ||
+ g_run_rec.test_runner_name, 1, 128));
+ l_results_rec.assertion := in_assertion;
+ l_results_rec.pass := nvl(in_pass,FALSE);
+ l_results_rec.details := in_details;
+ l_results_rec.message := in_message;
+ l_interval_buff := l_current_tstamp -
+ nvl(l_results_rec.executed_dtm
+ ,g_first_executed_dtm);
+ l_results_rec.interval_msec := 1000*( extract(second from l_interval_buff) +
+ 60*( extract(minute from l_interval_buff) +
+ 60*( extract(hour from l_interval_buff) +
+ 24*extract(day from l_interval_buff)
+ ) ) );
+ l_results_rec.executed_dtm := l_current_tstamp;
+ ------------------------------------------------------------
+ -- Add New Element
+ if g_results_nt is null
+ then
+ -- Initialize the "g_results_nt" Array
+ g_results_nt := results_nt_type(l_results_rec);
+ else
+ -- Add New Element to "g_results_nt" Array
+ g_results_nt.extend;
+ g_results_nt(g_results_nt.COUNT) := l_results_rec;
+ end if;
+ -----------------------------------------------
+ -- Update "g_run_rec" based on "l_results_rec"
+ g_run_rec.asrt_cnt := g_run_rec.asrt_cnt + 1;
+ if NOT l_results_rec.pass
+ then
+ g_run_rec.asrt_fail := g_run_rec.asrt_fail + 1;
+ end if;
+ g_run_rec.asrt_tot_msec := g_run_rec.asrt_tot_msec +
+ l_results_rec.interval_msec;
+ if l_results_rec.interval_msec < nvl(g_run_rec.asrt_min_msec,9999999)
+ then
+ g_run_rec.asrt_min_msec := l_results_rec.interval_msec;
+ end if;
+ if l_results_rec.interval_msec > nvl(g_run_rec.asrt_max_msec,-1)
+ then
+ g_run_rec.asrt_max_msec := l_results_rec.interval_msec;
+ end if;
+ -----------------------------------------------------------------------
+ -- Set "l_tcases_rec" and update the appropriate "g_tcases_aa" element
+ --
+ if g_tcases_aa.EXISTS(l_results_rec.testcase)
+ then
+ l_tcases_rec := g_tcases_aa(l_results_rec.testcase);
+ end if;
+ l_tcases_rec.asrt_cnt := l_tcases_rec.asrt_cnt + 1;
+ if NOT l_results_rec.pass
+ then
+ l_tcases_rec.asrt_fail := l_tcases_rec.asrt_fail + 1;
+ end if;
+ l_tcases_rec.asrt_tot_msec := l_tcases_rec.asrt_tot_msec +
+ l_results_rec.interval_msec;
+ if l_results_rec.interval_msec < nvl(l_tcases_rec.asrt_min_msec,9999999)
+ then
+ l_tcases_rec.asrt_min_msec := l_results_rec.interval_msec;
+ end if;
+ if l_results_rec.interval_msec > nvl(l_tcases_rec.asrt_max_msec,-1)
+ then
+ l_tcases_rec.asrt_max_msec := l_results_rec.interval_msec;
+ end if;
+ g_tcases_aa(l_results_rec.testcase) := l_tcases_rec;
+ --
+end add;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_add
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ lt PLS_INTEGER;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Add Procedure Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ add(in_testcase => 'The Testcase'
+ ,in_assertion => 'The Assert'
+ ,in_pass => TRUE
+ ,in_details => 'The Details'
+ ,in_message => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ lt := l_results_ntTEST.COUNT;
+ wt_assert.isnotnull
+ (msg_in => 'The last element in l_resultsTEST_nt'
+ ,check_this_in => lt);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_results_nt Testing
+ -----------------------
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST.COUNT = ' ||
+ 'l_results_ntSAVE.COUNT + 1'
+ ,check_this_in => l_results_ntTEST.COUNT
+ ,against_this_in => l_results_ntSAVE.COUNT + 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(lt).interval_msec'
+ ,check_this_in => l_results_ntTEST(lt).interval_msec);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(lt).interval_msec >= 0'
+ ,check_this_in => l_results_ntTEST(lt).interval_msec >= 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_results_ntTEST(lt).executed_dtm'
+ ,check_this_in => l_results_ntTEST(lt).executed_dtm);
+ wt_assert.this
+ (msg_in => 'l_results_ntTEST(lt).executed_dtm >= ' ||
+ 'l_results_ntTEST(lt-1).executed_dtm'
+ ,check_this_in => l_results_ntTEST(lt).executed_dtm >=
+ l_results_ntTEST(lt-1).executed_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).testcase'
+ ,check_this_in => l_results_ntTEST(lt).testcase
+ ,against_this_in => 'The Testcase');
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).assertion'
+ ,check_this_in => l_results_ntTEST(lt).assertion
+ ,against_this_in => 'The Assert');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).pass'
+ ,check_this_in => l_results_ntTEST(lt).pass
+ ,against_this_in => TRUE);
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).details'
+ ,check_this_in => l_results_ntTEST(lt).details
+ ,against_this_in => 'The Details');
+ wt_assert.eq
+ (msg_in => 'l_results_ntTEST(lt).message'
+ ,check_this_in => l_results_ntTEST(lt).message
+ ,against_this_in => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ -- l_run_rec Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_tot_msec = ' ||
+ 'l_run_recSAVE.asrt_tot_msec + ' ||
+ 'l_results_ntTEST(lt).interval_msec'
+ ,check_this_in => l_run_recTEST.asrt_tot_msec
+ ,against_this_in => l_run_recSAVE.asrt_tot_msec +
+ l_results_ntTEST(lt).interval_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_min_msec'
+ ,check_this_in => l_run_recTEST.asrt_min_msec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.asrt_min_msec <= ' ||
+ 'l_run_recSAVE.asrt_min_msec'
+ ,check_this_in => l_run_recTEST.asrt_min_msec <=
+ l_run_recSAVE.asrt_min_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_max_msec'
+ ,check_this_in => l_run_recTEST.asrt_max_msec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.asrt_max_msec >= ' ||
+ 'l_run_recSAVE.asrt_max_msec'
+ ,check_this_in => l_run_recTEST.asrt_max_msec >=
+ l_run_recSAVE.asrt_max_msec);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_tcases_aa Testing
+ ----------------------
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_cnt
+ ,against_this_in => 1);
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail
+ ,against_this_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail);
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_tot_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_tot_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_min_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_min_msec);
+ wt_assert.isnotnull
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_max_msec'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_max_msec);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Add Procedure Happy Path 2';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ add(in_testcase => 'The Testcase'
+ ,in_assertion => 'The Assert'
+ ,in_pass => FALSE
+ ,in_details => 'The Details'
+ ,in_message => 'The Message');
+ -------------------------------------- WTPLSQL Testing --
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ lt := l_results_ntTEST.COUNT;
+ wt_assert.isnotnull
+ (msg_in => 'The last element in l_resultsTEST_nt'
+ ,check_this_in => lt);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_results_nt Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail + 1'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail + 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_run_rec Testing
+ --------------------
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_cnt = ' ||
+ 'l_run_recSAVE.asrt_cnt + 1'
+ ,check_this_in => l_run_recTEST.asrt_cnt
+ ,against_this_in => l_run_recSAVE.asrt_cnt + 1);
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.asrt_fail = ' ||
+ 'l_run_recSAVE.asrt_fail + 1'
+ ,check_this_in => l_run_recTEST.asrt_fail
+ ,against_this_in => l_run_recSAVE.asrt_fail + 1);
+ -------------------------------------- WTPLSQL Testing --
+ -- l_tcases_aa Testing
+ ----------------------
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_cnt'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_cnt
+ ,against_this_in => 1);
+ wt_assert.eq
+ (msg_in => 'l_tcases_aaTEST(''The Testcase'').asrt_fail'
+ ,check_this_in => l_tcases_aaTEST('The Testcase').asrt_fail
+ ,against_this_in => 1);
+ end t_add;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure final1
+is
+ l_testcase long_name;
+ l_interval_buff interval day(9) to second(6);
+begin
+ -- Update Test Case Data
+ g_run_rec.tc_cnt := g_tcases_aa.COUNT;
+ g_run_rec.tc_fail := 0;
+ if g_tcases_aa.COUNT > 0
+ then
+ l_testcase := g_tcases_aa.FIRST;
+ loop
+ if g_tcases_aa(l_testcase).asrt_fail > 0
+ then
+ g_run_rec.tc_fail := g_run_rec.tc_fail + 1;
+ end if;
+ exit when l_testcase = g_tcases_aa.LAST;
+ l_testcase := g_tcases_aa.NEXT(l_testcase);
+ end loop;
+ end if;
+ --
+ if g_results_nt.EXISTS(1)
+ then
+ g_run_rec.asrt_fst_dtm := g_results_nt(1).executed_dtm;
+ g_run_rec.asrt_lst_dtm := g_results_nt(g_results_nt.COUNT).executed_dtm;
+ end if;
+ -- Update Test Run Data
+ g_run_rec.end_dtm := systimestamp;
+ l_interval_buff := g_run_rec.end_dtm - g_run_rec.start_dtm;
+ g_run_rec.runner_sec := (extract(second from l_interval_buff) +
+ 60 * ( extract(minute from l_interval_buff) +
+ 60 * ( extract(hour from l_interval_buff) +
+ 24 * ( extract(day from l_interval_buff)
+ ) ) ) );
+end final1;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_final1
+ is
+ l_run_recSAVE run_rec_type;
+ l_tcases_aaSAVE tcases_aa_type;
+ l_results_ntSAVE results_nt_type;
+ l_run_recTEST run_rec_type;
+ l_tcases_aaTEST tcases_aa_type;
+ l_results_ntTEST results_nt_type;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'FINAL "One" Happy Path';
+ l_run_recSAVE := g_run_rec;
+ l_tcases_aaSAVE := g_tcases_aa;
+ l_results_ntSAVE := g_results_nt;
+ g_tcases_aa('TC1').asrt_fail := 2;
+ final1;
+ l_run_recTEST := g_run_rec;
+ l_tcases_aaTEST := g_tcases_aa;
+ l_results_ntTEST := g_results_nt;
+ g_run_rec := l_run_recSAVE;
+ g_tcases_aa := l_tcases_aaSAVE;
+ g_results_nt := l_results_ntSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ -- Update Test Case Data
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.tc_cnt'
+ ,check_this_in => l_run_recTEST.tc_cnt);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.tc_cnt > 0'
+ ,check_this_in => l_run_recTEST.tc_cnt > 0);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.tc_fail'
+ ,check_this_in => l_run_recTEST.tc_fail);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.tc_fail >= 0'
+ ,check_this_in => l_run_recTEST.tc_fail >= 0);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.asrt_fst_dtm'
+ ,check_this_in => l_run_recSAVE.asrt_fst_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_fst_dtm'
+ ,check_this_in => l_run_recTEST.asrt_fst_dtm);
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.asrt_lst_dtm'
+ ,check_this_in => l_run_recSAVE.asrt_lst_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.asrt_lst_dtm'
+ ,check_this_in => l_run_recTEST.asrt_lst_dtm);
+ -------------------------------------- WTPLSQL Testing --
+ -- Update Test Run Data
+ wt_assert.isnull
+ (msg_in => 'l_run_recSAVE.end_dtm'
+ ,check_this_in => l_run_recSAVE.end_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.end_dtm'
+ ,check_this_in => l_run_recTEST.end_dtm);
+ wt_assert.isnotnull
+ (msg_in => 'l_run_recTEST.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec);
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec'
+ ,check_this_in => l_run_recTEST.runner_sec >= l_run_recSAVE.runner_sec);
+ end t_final1;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure run_error
+ (in_error_message in varchar2)
+is
+begin
+ if g_run_rec.error_message is null
+ then
+ g_run_rec.error_message := substr(in_error_message,1,4000);
+ else
+ g_run_rec.error_message := substr(g_run_rec.error_message || CHR(10) ||
+ in_error_message,1,4000);
+ end if;
+end run_error;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_run_error
+ is
+ l_run_recSAVE run_rec_type;
+ l_run_recTEST run_rec_type;
+ test_message varchar2(32767);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 1';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('Simlple Message');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Simlple Message');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 2';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('Message 1');
+ run_error('Message 2');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Message 1' || CHR(10) || 'Message 2');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 3';
+ for i in 1 .. 399
+ loop
+ test_message := test_message || '1234567890';
+ end loop;
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error(test_message);
+ run_error('Longer than 10 characters.');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.isnotnull
+ (msg_in => 'substr(l_run_recTEST.error_message,3000)'
+ ,check_this_in => substr(l_run_recTEST.error_message,3000));
+ wt_assert.this
+ (msg_in => 'l_run_recTEST.error_message like ''%Longer th'''
+ ,check_this_in => l_run_recTEST.error_message like '%Longer th');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'RUN_ERROR Happy Path 4';
+ l_run_recSAVE := g_run_rec;
+ g_run_rec.error_message := '';
+ run_error('');
+ run_error('Message');
+ run_error('');
+ l_run_recTEST := g_run_rec;
+ g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => 'l_run_recTEST.error_message'
+ ,check_this_in => l_run_recTEST.error_message
+ ,against_this_in => 'Message' || CHR(10));
+ end t_run_error;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ wtplsql.g_DBOUT := 'CORE_DATA:PACKAGE BODY';
+ -------------------------------------- WTPLSQL Testing --
+ t_init1;
+ t_init2;
+ t_add;
+ t_final1;
+ --t_final2;
+ t_run_error;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end core_data;
+/
+
+set define on
diff --git a/wtpsrc/WTP/CORE_DATA.pspec b/wtpsrc/WTP/CORE_DATA.pspec
new file mode 100644
index 0000000..ac04d21
--- /dev/null
+++ b/wtpsrc/WTP/CORE_DATA.pspec
@@ -0,0 +1,101 @@
+
+--
+-- Create WTP.CORE_DATA Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.CORE_DATA
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."CORE_DATA"
+ authid definer
+is
+
+ SUBTYPE long_name is varchar2(128);
+
+ TYPE run_rec_type is record
+ (test_runner_owner long_name -- Owner of the Test Runner
+ ,test_runner_name long_name -- Name of the Test Runner
+ ,start_dtm timestamp(3) with local time zone -- Test Runner Start Date/Time
+ ,end_dtm timestamp(3) with local time zone -- Test Runner End Date/Time
+ ,runner_sec number(6,1) default 0 -- Total Runtime for Test Runner in Seconds
+ ,error_message varchar2(4000) -- Error Message
+ ,tc_cnt number(7) default 0 -- Number of Test Cases
+ ,tc_fail number(7) default 0 -- Number of Failed Test Cases
+ ,asrt_fst_dtm timestamp(3) with local time zone -- Date/Time of First Assertion
+ ,asrt_lst_dtm timestamp(3) with local time zone -- Date/Time of Last Assertion
+ ,asrt_cnt number(7) default 0 -- Number of Assertions across all Test Cases
+ ,asrt_fail number(7) default 0 -- Number of Assertion Failures across all Test Cases
+ ,asrt_min_msec number(10,3) -- Minumum Assertion Interval in Milliseconds across all Test Cases
+ ,asrt_max_msec number(10,3) -- Maximum Assertion Interval in Milliseconds across all Test Cases
+ ,asrt_tot_msec number(10,3) default 0 -- Total Assertion Intervals in Milliseconds across all Test Cases
+ ,dbout_owner long_name -- Owner of the Database Object Under Test
+ ,dbout_name long_name -- Name of the Database Object Under Test
+ ,dbout_type varchar2(20) -- Type of the Database Object Under Test
+ );
+ g_run_rec run_rec_type;
+
+ TYPE tcases_rec_type is record
+ (asrt_cnt number(7) default 0 -- Number of Assertions in this Test Case
+ ,asrt_fail number(7) default 0 -- Number of Failed Assertsion in this Test Case
+ ,asrt_min_msec number(10,3) -- Minumum Assertion Interval in Milliseconds in this Test Cases
+ ,asrt_max_msec number(10,3) -- Maximum Assertion Interval in Milliseconds in this Test Cases
+ ,asrt_tot_msec number(10,3) default 0 -- Total Assertion Interval in Milliseconds in this Test Cases
+ );
+ TYPE tcases_aa_type is table of tcases_rec_type index by long_name;
+ g_tcases_aa tcases_aa_type;
+
+ TYPE results_rec_type is record
+ (testcase long_name -- Test Case Name of the Assertion
+ ,executed_dtm timestamp(6) with local time zone -- Execution Date/Time of the Assertion
+ ,interval_msec number(10,3) default 0 -- Interval from Previous Assertion in Milliseconds
+ ,assertion varchar2(15) -- Name of the Assertion
+ ,pass boolean -- Did the Assertion Pass? (TRUE/FALSE)
+ ,message varchar2(200) -- Identification Message of the Assertion
+ ,details varchar2(4000) -- Test Details of the Assertion
+ );
+ TYPE results_nt_type is table of results_rec_type;
+ g_results_nt results_nt_type;
+
+ procedure init1
+ (in_package_name in varchar2);
+
+ procedure init2;
+
+ procedure add
+ (in_testcase in varchar2
+ ,in_assertion in varchar2
+ ,in_pass in boolean
+ ,in_details in varchar2
+ ,in_message in varchar2);
+
+ procedure final1;
+
+ procedure run_error
+ (in_error_message in varchar2);
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end core_data;
+/
+
+
+-- Grants
+
+grant EXECUTE on "WTP"."CORE_DATA" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/HOOK.pbody b/wtpsrc/WTP/HOOK.pbody
new file mode 100644
index 0000000..c8ced0d
--- /dev/null
+++ b/wtpsrc/WTP/HOOK.pbody
@@ -0,0 +1,237 @@
+
+--
+-- Create WTP.HOOK Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.HOOK
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."HOOK"
+as
+
+ TYPE run_nt_type is table
+ of hooks%ROWTYPE;
+ TYPE run_aa_type is table
+ of run_nt_type
+ index by varchar2(20);
+ g_run_aa run_aa_type;
+
+----------------------
+-- Private Procedures
+----------------------
+
+---------------------
+-- Public Procedures
+---------------------
+
+------------------------------------------------------------
+procedure run
+ (in_hook_name in varchar2)
+is
+ l_error_stack varchar2(32000);
+begin
+ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+ $THEN
+ if NOT g_run_assert_hook
+ AND in_hook_name = 'after_assertion'
+ then
+ return;
+ end if;
+ $END ------%WTPLSQL_end_ignore_lines%------
+ if NOT g_run_aa.EXISTS(in_hook_name)
+ then
+ --dbms_output.put_line('No hook for ' || in_hook_name);
+ return;
+ end if;
+ for i in 1 .. g_run_aa(in_hook_name).COUNT
+ loop
+ begin
+ execute immediate g_run_aa(in_hook_name)(i).run_string;
+ exception when OTHERS then
+ l_error_stack := 'Hook Error in "' || in_hook_name ||
+ '", SEQ ' || g_run_aa(in_hook_name)(i).seq ||
+ '.' || CHR(10) ||
+ SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack;
+ core_data.run_error(l_error_stack);
+ end;
+ end loop;
+end run;
+
+------------------------------------------------------------
+procedure init
+is
+ l_run_nt run_nt_type;
+begin
+ g_run_aa.DELETE;
+ for buff in (
+ select hook_name
+ from hooks
+ group by hook_name )
+ loop
+ select * bulk collect into l_run_nt
+ from hooks
+ where hook_name = buff.hook_name
+ order by hooks.seq;
+ if SQL%FOUND
+ then
+ g_run_aa(buff.hook_name) := l_run_nt;
+ end if;
+ end loop;
+end init;
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ -------------------------------------- WTPLSQL Testing --
+ procedure test_hook
+ (in_msg in varchar2)
+ is
+ begin
+ g_test_hook_msg := in_msg;
+ end test_hook;
+ -------------------------------------- WTPLSQL Testing --
+ procedure WTPLSQL_RUN
+ is
+ TYPE hooks_nt_type is table of hooks%ROWTYPE;
+ l_hooks_ntSAVE hooks_nt_type;
+ TYPE hname_nt_type is table of hooks.hook_name%TYPE;
+ l_hname_nt hname_nt_type;
+ l_hooks_rec hooks%ROWTYPE;
+ l_err_msgSAVE core_data.g_run_rec.error_message%TYPE;
+ l_err_msgTEST core_data.g_run_rec.error_message%TYPE;
+ num_recs number;
+ begin
+ wtplsql.g_DBOUT := 'HOOK:PACKAGE BODY';
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Setup';
+ g_run_assert_hook := FALSE;
+ select count(*) into num_recs from hooks;
+ wt_assert.isnotnull
+ (msg_in => 'Number of records before setup'
+ ,check_this_in => num_recs);
+ -------------------------------------- WTPLSQL Testing --
+ l_hname_nt := hname_nt_type('before_test_all'
+ ,'before_test_run'
+ ,'execute_test_runner'
+ ,'after_assertion'
+ ,'after_test_run'
+ ,'after_test_all'
+ ,'ad_hoc_report');
+ select * bulk collect into l_hooks_ntSAVE from hooks;
+ delete from hooks;
+ -------------------------------------- WTPLSQL Testing --
+ l_hooks_rec.seq := 1;
+ l_hooks_rec.description := 'WTPLSQL Self Test';
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ l_hooks_rec.hook_name := l_hname_nt(i);
+ l_hooks_rec.run_string := 'begin hook.test_hook(''' ||
+ l_hname_nt(i) || '''); end;';
+ insert into hooks values l_hooks_rec;
+ end loop;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => l_hname_nt.COUNT);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'All Hooks On';
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ g_test_hook_msg := '';
+ g_run_assert_hook := TRUE;
+ hook.run(l_hname_nt(i));
+ g_run_assert_hook := FALSE;
+ wt_assert.eq
+ (msg_in => l_hname_nt(i) || ' is active'
+ ,check_this_in => g_test_hook_msg
+ ,against_this_in => l_hname_nt(i));
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'All Hooks Off';
+ delete from hooks;
+ commit;
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records 2'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => 0);
+ -------------------------------------- WTPLSQL Testing --
+ for i in 1 .. l_hname_nt.COUNT
+ loop
+ g_test_hook_msg := '';
+ hook.run(l_hname_nt(i));
+ wt_assert.isnull
+ (msg_in => l_hname_nt(i) || ' is not active'
+ ,check_this_in => g_test_hook_msg);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Hooks Sad Path 1';
+ l_hooks_rec.seq := 1;
+ l_hooks_rec.description := 'WTPLSQL Self Test';
+ l_hooks_rec.hook_name := 'ad_hoc_report';
+ l_hooks_rec.run_string := 'declare n1 number; begin n1:=1/0; end;';
+ insert into hooks values l_hooks_rec;
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eqqueryvalue
+ (msg_in => 'Confirm number of test records'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => 1);
+ init;
+ wt_assert.isnull
+ (msg_in => 'core_data.g_run_rec.error_message'
+ ,check_this_in => core_data.g_run_rec.error_message);
+ -------------------------------------- WTPLSQL Testing --
+ l_err_msgSAVE := core_data.g_run_rec.error_message;
+ core_data.g_run_rec.error_message := '';
+ wt_assert.raises
+ (msg_in => 'Test Exception Handler'
+ ,check_call_in => 'begin hook.run(''ad_hoc_report''); end;'
+ ,against_exc_in => '');
+ l_err_msgTEST := core_data.g_run_rec.error_message;
+ core_data.g_run_rec.error_message := l_err_msgSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnotnull
+ (msg_in => 'Confirm core_data.run_error'
+ ,check_this_in => l_err_msgTEST);
+ wt_assert.this
+ (msg_in => 'l_err_msgTEST like ''Hook Error in "ad_hoc_report", SEQ 1.' || '\n' ||
+ 'ORA-01476: divisor is equal to zero' || '\n' ||
+ 'ORA-06512: at line 1%'''
+ ,check_this_in => l_err_msgTEST like 'Hook Error in "ad_hoc_report", SEQ 1.' || CHR(10) ||
+ 'ORA-01476: divisor is equal to zero' || CHR(10) ||
+ 'ORA-06512: at line 1%');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Teardown';
+ delete from hooks;
+ forall i in 1 .. l_hooks_ntSAVE.COUNT
+ insert into hooks values l_hooks_ntSAVE(i);
+ commit;
+ init;
+ wt_assert.eqqueryvalue
+ (msg_in => 'Number of records after teardown'
+ ,check_query_in => 'select count(*) from hooks'
+ ,against_value_in => num_recs);
+ g_run_assert_hook := TRUE;
+ end WTPLSQL_RUN;
+
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+------------------------------------------------------------
+------%WTPLSQL_begin_ignore_lines%------ Can't Test This
+begin
+ init;
+end hook;
+/
+
+set define on
diff --git a/wtpsrc/WTP/HOOK.pspec b/wtpsrc/WTP/HOOK.pspec
new file mode 100644
index 0000000..5893fbd
--- /dev/null
+++ b/wtpsrc/WTP/HOOK.pspec
@@ -0,0 +1,48 @@
+
+--
+-- Create WTP.HOOK Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.HOOK
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."HOOK"
+ authid definer
+as
+
+ procedure run
+ (in_hook_name in varchar2);
+
+ procedure init;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ g_run_assert_hook boolean := TRUE;
+ g_test_hook_msg varchar2(4000);
+ --
+ procedure test_hook
+ (in_msg in varchar2);
+ procedure WTPLSQL_RUN;
+ $END
+
+end hook;
+/
+
+
+-- Grants
+
+grant EXECUTE on "WTP"."HOOK" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/HOOKS.cdl b/wtpsrc/WTP/HOOKS.cdl
new file mode 100644
index 0000000..1e597b9
--- /dev/null
+++ b/wtpsrc/WTP/HOOKS.cdl
@@ -0,0 +1,59 @@
+
+--
+-- Consolidated Data Load script for WTP.HOOKS data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'WTP'
+ and table_name = 'HOOKS'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'WTP'
+ and table_name = 'HOOKS'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "WTP"."HOOKS"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=WTP/HOOKS.ctl
+host sqlldr '&1.' control=WTP/HOOKS.ctl data=WTP/HOOKS.csv log=WTP/HOOKS.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "WTP/HOOKS.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpsrc/WTP/HOOKS.csv b/wtpsrc/WTP/HOOKS.csv
new file mode 100644
index 0000000..d06ea00
--- /dev/null
+++ b/wtpsrc/WTP/HOOKS.csv
@@ -0,0 +1,6 @@
+"HOOK_NAME","SEQ","RUN_STRING","DESCRIPTION"
+"ad_hoc_report",20,"begin wtp.wt_ad_hoc_report; end;",
+"after_test_all",20,"begin wtp.wt_core_report.after_test_all; end;",
+"after_test_run",20,"begin wtp.wt_core_report.dbms_out(in_detail_level => 10); end;",
+"before_test_all",20,"begin wtp.wt_core_report.before_test_all; end;",
+"execute_test_runner",20,"begin wtp.wt_execute_test_runner; end;",
diff --git a/wtpsrc/WTP/HOOKS.ctl b/wtpsrc/WTP/HOOKS.ctl
new file mode 100644
index 0000000..8bfeae8
--- /dev/null
+++ b/wtpsrc/WTP/HOOKS.ctl
@@ -0,0 +1,10 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "WTP"."HOOKS"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (HOOK_NAME CHAR(20)
+ ,SEQ FLOAT EXTERNAL
+ ,RUN_STRING CHAR(4000)
+ ,DESCRIPTION CHAR(1000)
+ )
diff --git a/wtpsrc/WTP/HOOKS.tab b/wtpsrc/WTP/HOOKS.tab
new file mode 100644
index 0000000..1c179e3
--- /dev/null
+++ b/wtpsrc/WTP/HOOKS.tab
@@ -0,0 +1,54 @@
+
+--
+-- Create WTP.HOOKS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.HOOKS
+
+ CREATE TABLE "WTP"."HOOKS"
+ ( "HOOK_NAME" VARCHAR2(20 BYTE) CONSTRAINT "WT_HOOKS_NN1" NOT NULL ENABLE,
+ "SEQ" NUMBER(2,0) CONSTRAINT "WT_HOOKS_NN2" NOT NULL ENABLE,
+ "RUN_STRING" VARCHAR2(4000 BYTE) CONSTRAINT "WT_HOOKS_NN3" NOT NULL ENABLE,
+ "DESCRIPTION" VARCHAR2(1000 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."HOOKS" ADD CONSTRAINT "HOOKS_CK1" CHECK ( hook_name in
+('before_test_all'
+,'before_test_run'
+,'execute_test_runner'
+,'after_assertion'
+,'after_test_run'
+,'after_test_all'
+,'ad_hoc_report') ) ENABLE;
+ALTER TABLE "WTP"."HOOKS" ADD CONSTRAINT "HOOKS_CK2" CHECK (seq > 0) ENABLE;
+ALTER TABLE "WTP"."HOOKS" ADD CONSTRAINT "HOOKS_PK" PRIMARY KEY ("HOOK_NAME", "SEQ")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.HOOKS
+
+ COMMENT ON COLUMN "WTP"."HOOKS"."HOOK_NAME" IS 'Primary Key for each Hook Name';
+ COMMENT ON COLUMN "WTP"."HOOKS"."SEQ" IS 'Primary Key for the sequence of the Hook';
+ COMMENT ON COLUMN "WTP"."HOOKS"."RUN_STRING" IS 'Procedure Name or Un-named PL/SQL Block for EXECUTE IMMEDIATE';
+ COMMENT ON COLUMN "WTP"."HOOKS"."DESCRIPTION" IS 'Description of this Hook.';
+ COMMENT ON TABLE "WTP"."HOOKS" IS 'wtPLSQL Hooks.';
+
+
+-- Grants
+grant DELETE on "WTP"."HOOKS" to "PUBLIC";
+grant INSERT on "WTP"."HOOKS" to "PUBLIC";
+grant SELECT on "WTP"."HOOKS" to "PUBLIC";
+grant UPDATE on "WTP"."HOOKS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/JUNIT_CORE_REPORT.pbody b/wtpsrc/WTP/JUNIT_CORE_REPORT.pbody
new file mode 100644
index 0000000..48b2d10
--- /dev/null
+++ b/wtpsrc/WTP/JUNIT_CORE_REPORT.pbody
@@ -0,0 +1,248 @@
+
+--
+-- Create WTP.JUNIT_CORE_REPORT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.JUNIT_CORE_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."JUNIT_CORE_REPORT"
+as
+
+
+----------------------
+-- PRivate Procedures
+----------------------
+
+
+------------------------------------------------------------
+-- Print to DBMS_OUTPUT
+procedure p
+ (in_line in varchar2)
+is
+begin
+ if g_in_process
+ then
+ vc_aa(vc_aa.COUNT + 1) := in_line;
+ else
+ dbms_output.put_line(in_line);
+ end if;
+end p;
+
+
+------------------------------------------------------------
+-- XML Escape
+function xe
+ (in_txt in varchar2)
+ return varchar2
+is
+begin
+ return replace
+ (replace
+ (replace
+ (replace
+ (replace
+ (in_txt
+ ,'<','<') -- Less Than
+ ,'>','>') -- Greater Than
+ ,'&','&') -- Ampersand
+ ,'''',''') -- Apostrophe
+ ,'"','"'); -- Quotation Mark
+end xe;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure xml_header
+is
+begin
+ p('');
+ p('');
+ p('');
+ p('');
+ p('');
+end xml_header;
+
+
+------------------------------------------------------------
+procedure xml_body
+is
+ l_rec core_data.results_rec_type;
+ l_testcase core_data.long_name;
+ l_classname varchar2(4000);
+ single_line_save boolean;
+begin
+ single_line_save := wt_core_report.g_single_line_output;
+ wt_core_report.g_single_line_output := TRUE;
+ if core_data.g_run_rec.dbout_name is not null
+ then
+ l_classname := xe(core_data.g_run_rec.dbout_owner) ||
+ '.' || xe(core_data.g_run_rec.dbout_name) ||
+ ':' || xe(replace(core_data.g_run_rec.dbout_type,' ','_'));
+ end if;
+ if core_data.g_tcases_aa.COUNT > 0
+ then
+ ---------------------
+ -- Test Suite Header
+ p(' ' );
+ l_testcase := core_data.g_tcases_aa.FIRST;
+ loop
+ --------------------
+ -- Test Case Header
+ p(' ' );
+ if core_data.g_tcases_aa(l_testcase).asrt_fail > 0
+ or ( core_data.g_run_rec.error_message is not null
+ and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase)
+ then
+ -----------------------
+ -- Short Error Message
+ if core_data.g_run_rec.error_message is not null
+ and l_testcase = core_data.g_results_nt(core_data.g_results_nt.COUNT).testcase
+ then
+ p(' ' );
+ else
+ p(' ' );
+ end if;
+ p(' ');
+ p(' ');
+ -----------------------
+ end if;
+ p(' ');
+ --------------------
+ exit when l_testcase = core_data.g_tcases_aa.LAST;
+ l_testcase := core_data.g_tcases_aa.NEXT(l_testcase);
+ end loop;
+ p(' ');
+ ---------------------
+ end if;
+ wt_core_report.g_single_line_output := single_line_save;
+end xml_body;
+
+
+------------------------------------------------------------
+procedure xml_trailer
+is
+begin
+ p('');
+end xml_trailer;
+
+
+------------------------------------------------------------
+-- This can be used as an
+procedure show_current
+is
+begin
+ --
+ if not g_in_process
+ then
+ xml_header;
+ end if;
+ --
+ xml_body;
+ --
+ if not g_in_process
+ then
+ xml_trailer;
+ end if;
+ --
+end show_current;
+
+
+------------------------------------------------------------
+procedure before_test_all
+is
+begin
+ vc_aa.DELETE;
+ g_in_process := TRUE;
+ xml_header;
+end before_test_all;
+
+
+------------------------------------------------------------
+procedure after_test_all
+is
+begin
+ xml_trailer;
+ for i in 1 .. vc_aa.COUNT
+ loop
+ dbms_output.put_line(vc_aa(i));
+ end loop;
+ g_in_process := FALSE;
+end after_test_all;
+
+
+------------------------------------------------------------
+procedure insert_hooks
+is
+begin
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_all', 20, 'begin wtp.junit_core_report.before_test_all; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 20, 'begin wtp.junit_core_report.show_current; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_all', 20, 'begin wtp.junit_core_report.after_test_all; end;');
+ commit;
+ hook.init;
+end insert_hooks;
+
+
+------------------------------------------------------------
+procedure delete_hooks
+is
+begin
+ delete from hooks where run_string like '%wtp.junit_core_report.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "junit_core_report" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks;
+
+
+end junit_core_report;
+/
+
+set define on
diff --git a/wtpsrc/WTP/JUNIT_CORE_REPORT.pspec b/wtpsrc/WTP/JUNIT_CORE_REPORT.pspec
new file mode 100644
index 0000000..09e3b23
--- /dev/null
+++ b/wtpsrc/WTP/JUNIT_CORE_REPORT.pspec
@@ -0,0 +1,47 @@
+
+--
+-- Create WTP.JUNIT_CORE_REPORT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.JUNIT_CORE_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."JUNIT_CORE_REPORT"
+ authid definer
+as
+
+ g_in_process boolean := FALSE;
+
+ TYPE vc_aa_type is table of varchar2(4000) index by pls_integer;
+ vc_aa vc_aa_type;
+
+ procedure xml_header;
+
+ procedure xml_body;
+
+ procedure xml_trailer;
+
+ procedure before_test_all;
+
+ procedure show_current;
+
+ procedure after_test_all;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+end junit_core_report;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."JUNIT_CORE_REPORT" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/WTPLSQL.pbody b/wtpsrc/WTP/WTPLSQL.pbody
new file mode 100644
index 0000000..72f7d8e
--- /dev/null
+++ b/wtpsrc/WTP/WTPLSQL.pbody
@@ -0,0 +1,634 @@
+
+--
+-- Create WTP.WTPLSQL Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WTPLSQL
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WTPLSQL"
+as
+
+ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+ $THEN
+ TYPE test_all_aa_type is table of varchar2(400) index by varchar2(400);
+ test_all_aa test_all_aa_type;
+ wtplsql_skip_test boolean := FALSE;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+------------------------------------------------------------
+-- This procedure is separated for internal WTPLSQL testing
+procedure check_runner
+is
+ l_package_check number;
+begin
+ -- These RAISEs can be captured because the Test Runs Record is set.
+ -- Check for NULL Runner Name
+ if core_data.g_run_rec.test_runner_name is null
+ then
+ raise_application_error (-20001, 'TEST_RUNNER_NAME is null');
+ end if;
+ -- Check for Valid Runner Name
+ select count(*) into l_package_check
+ from wt_qual_test_runners_vw
+ where owner = core_data.g_run_rec.test_runner_owner
+ and package_name = core_data.g_run_rec.test_runner_name;
+ if l_package_check = 0
+ then
+ raise_application_error (-20002, 'TEST_RUNNER_NAME Procedure "' ||
+ core_data.g_run_rec.test_runner_name ||
+ '.' || C_RUNNER_ENTRY_POINT ||
+ '" is not valid' );
+ end if;
+end check_runner;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_check_runner
+ is
+ l_run_recSAVE core_data.run_rec_type;
+ l_msg_in varchar2(4000);
+ l_err_in varchar2(4000);
+ -------------------------------------- WTPLSQL Testing --
+ procedure l_test_sqlerrm is begin
+ -- Restore the core_data.g_run_rec
+ core_data.g_run_rec := l_run_recSAVE;
+ wt_assert.eq
+ (msg_in => l_msg_in
+ ,check_this_in => SQLERRM
+ ,against_this_in => l_err_in);
+ end l_test_sqlerrm;
+ begin
+ -- Save CORE_DATA data
+ l_run_recSAVE := core_data.g_run_rec;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Happy Path 1';
+ wt_assert.eq
+ (msg_in => 'Confirm TEST_RUNNER_OWNER'
+ ,check_this_in => core_data.g_run_rec.test_runner_owner
+ ,against_this_in => USER);
+ core_data.g_run_rec.test_runner_name := 'WTPLSQL';
+ l_msg_in := 'Valid TEST_RUNNER_NAME';
+ l_err_in := 'ORA-0000: normal, successful completion';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ l_test_sqlerrm;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 1';
+ core_data.g_run_rec.test_runner_name := '';
+ l_msg_in := 'Null TEST_RUNNER_NAME';
+ l_err_in := 'ORA-20001: TEST_RUNNER_NAME is null';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ -- This test is expected to throw an error
+ l_test_sqlerrm;
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'CHECK_RUNNER Sad Path 2';
+ core_data.g_run_rec.test_runner_name := 'BOGUS';
+ l_msg_in := 'Invalid TEST_RUNNER_NAME';
+ l_err_in := 'ORA-20002: TEST_RUNNER_NAME Procedure "BOGUS.' ||
+ C_RUNNER_ENTRY_POINT || '" is not valid';
+ begin
+ check_runner;
+ l_test_sqlerrm;
+ exception when others then
+ l_test_sqlerrm;
+ end;
+ end t_check_runner;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure check_dbout
+is
+ --
+ -- https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF51129
+ -- Within a namespace, no two objects can have the same name. The following
+ -- schema objects share one namespace:
+ -- -) Packages
+ -- -) Private synonyms
+ -- -) Sequences
+ -- -) Stand-alone procedures
+ -- -) Stand-alone stored functions
+ -- -) User-defined operators
+ -- -) User-defined types
+ -- -) Tables
+ -- -) Views
+ -- Each of the following schema objects has its own namespace:
+ -- -) Clusters
+ -- -) Constraints
+ -- -) Database triggers
+ -- -) Dimensions
+ -- -) Indexes
+ -- -) Materialized views (When you create a materialized view, the database
+ -- creates an internal table of the same name. This table has the same
+ -- namespace as the other tables in the schema. Therefore, a schema
+ -- cannot contain a table and a materialized view of the same name.)
+ -- -) Private database links
+ -- Because tables and sequences are in the same namespace, a table and a
+ -- sequence in the same schema cannot have the same name. However, tables
+ -- and indexes are in different namespaces. Therefore, a table and an index
+ -- in the same schema can have the same name.
+ -- Each schema in the database has its own namespaces for the objects it
+ -- contains. This means, for example, that two tables in different schemas
+ -- are in different namespaces and can have the same name.
+ -- Results are unknown if a Database Object Under Test has the same name in
+ -- different namespaces.
+ --
+ l_dot_pos number;
+ l_cln_pos number;
+begin
+ if g_DBOUT is null
+ then
+ return;
+ end if;
+ l_dot_pos := instr(g_DBOUT,'.');
+ l_cln_pos := instr(g_DBOUT,':');
+ begin
+ with q_main as (
+ select obj.owner
+ ,obj.object_name
+ ,obj.object_type
+ from dba_objects obj
+ where obj.owner = core_data.g_run_rec.test_runner_owner
+ and ( ( -- No separators were given, assume USER is the owner.
+ -- No object type was given. This could throw TOO_MANY_ROWS.
+ l_dot_pos = 0
+ and l_cln_pos = 0
+ and obj.object_name = g_DBOUT )
+ OR ( -- No object owner was given, assume USER is the owner.
+ l_dot_pos = 0
+ and l_cln_pos != 0
+ and obj.object_name = substr(g_DBOUT, 1, l_cln_pos-1)
+ and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) ) )
+ UNION ALL
+ select obj.owner
+ ,obj.object_name
+ ,obj.object_type
+ from dba_objects obj
+ where ( -- No object type was given. This could throw TOO_MANY_ROWS.
+ l_dot_pos != 0
+ and l_cln_pos = 0
+ and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1)
+ and obj.object_name = substr(g_DBOUT, l_dot_pos+1, 512) )
+ OR ( -- All separators were given
+ l_dot_pos != 0
+ and l_cln_pos != 0
+ and obj.owner = substr(g_DBOUT, 1, l_dot_pos-1)
+ and obj.object_name = substr(g_DBOUT, l_dot_pos+1, l_cln_pos-l_dot_pos-1)
+ and obj.object_type = substr(g_DBOUT, l_cln_pos+1, 512) )
+ )
+ select owner
+ ,object_name
+ ,object_type
+ into core_data.g_run_rec.dbout_owner
+ ,core_data.g_run_rec.dbout_name
+ ,core_data.g_run_rec.dbout_type
+ from q_main;
+ exception
+ when NO_DATA_FOUND
+ then
+ core_data.run_error('Unable to find database object "' ||
+ g_DBOUT || '".' );
+ return;
+ when TOO_MANY_ROWS
+ then
+ -- The SELECT INTO will load some values into these variables
+ -- when TOO_MANY_ROWS are selected.
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.run_error('Found too many database objects "' ||
+ g_DBOUT || '".' );
+ return;
+ when OTHERS
+ then
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.run_error('Error finding database object: ' || SQLERRM);
+ return;
+ end;
+ --
+end check_dbout;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_check_dbout
+ is
+ l_run_recSAVE core_data.run_rec_type;
+ l_run_recTEST core_data.run_rec_type;
+ procedure clear_run_rec is begin
+ core_data.g_run_rec.dbout_owner := '';
+ core_data.g_run_rec.dbout_name := '';
+ core_data.g_run_rec.dbout_type := '';
+ core_data.g_run_rec.error_message := '';
+ end clear_run_rec;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 1';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := '';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 2';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'SYS.DUAL';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => 'SYS');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'DUAL');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'TABLE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 3';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WTPLSQL:PACKAGE BODY';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => USER);
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'WTPLSQL');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'PACKAGE BODY');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Happy Path 4';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WT_EXECUTE_TEST_RUNNER';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner,
+ against_this_in => USER);
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name,
+ against_this_in => 'WT_EXECUTE_TEST_RUNNER');
+ wt_assert.eq(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type,
+ against_this_in => 'PROCEDURE');
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Sad Path 1';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'someone.bogus:thingy';
+ check_dbout;
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ wt_assert.isnotnull(
+ msg_in => 'l_run_recTEST.error_message',
+ check_this_in => l_run_recTEST.error_message);
+ wt_assert.eqqueryvalue (
+ msg_in => 'l_run_recTEST.error_message',
+ check_query_in => 'select 1 from dual where ''' ||
+ l_run_recTEST.error_message ||
+ ''' like ''%Unable to find database object "' ||
+ g_DBOUT || '".%''',
+ against_value_in => 1);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Find DBOUT Sad Path 2';
+ l_run_recSAVE := core_data.g_run_rec;
+ clear_run_rec;
+ g_DBOUT := 'WTPLSQL';
+ check_dbout;
+ g_DBOUT := '';
+ l_run_recTEST := core_data.g_run_rec;
+ core_data.g_run_rec := l_run_recSAVE;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_owner',
+ check_this_in => l_run_recTEST.dbout_owner);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_name',
+ check_this_in => l_run_recTEST.dbout_name);
+ wt_assert.isnull(
+ msg_in => 'l_run_recTEST.dbout_type',
+ check_this_in => l_run_recTEST.dbout_type);
+ wt_assert.eqqueryvalue (
+ msg_in => 'l_run_recTEST.error_message',
+ check_query_in => 'select 1 from dual where ''' ||
+ l_run_recTEST.error_message ||
+ ''' like ''%Found too many database objects "WTPLSQL".%''',
+ against_value_in => 1);
+ end t_check_dbout;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+function get_runner_entry_point
+ return varchar2
+is
+begin
+ return C_RUNNER_ENTRY_POINT;
+end get_runner_entry_point;
+
+------------------------------------------------------------
+function show_version
+ return varchar2
+is
+ ret_str varchar2(4000);
+begin
+ for buff in (
+ select component, version
+ from wt_versions t1
+ where (component, install_tstmp) in (
+ select t2.component, max(t2.install_tstmp)
+ from wt_versions t2
+ group by t2.component)
+ and action != 'REMOVE'
+ order by install_tstmp )
+ loop
+ ret_str := ret_str || buff.component || ' ' ||
+ trim(to_char(buff.version,'9999.099')) || ', ';
+ end loop;
+ return substr(ret_str, 1, length(ret_str)-2);
+exception when NO_DATA_FOUND
+then
+ return '';
+end show_version;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_show_version
+ is
+ existing_version varchar2(4000);
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Setup';
+ existing_version := show_version;
+ wt_assert.isnotnull (
+ msg_in => 'Saved Original Version',
+ check_this_in => existing_version);
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 1';
+ insert into wt_versions (component, version, action)
+ values ('TESTING', 1.01, 'INSTALL');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => regexp_like(show_version, 'TESTING 1[.]010'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 2';
+ insert into wt_versions (component, version, action)
+ values ('TESTING', 1.02, 'UPDATE');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => regexp_like(show_version, 'TESTING 1[.]020'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Happy Path 3';
+ insert into wt_versions (component, version, action)
+ values ('TESTING', 1.02, 'REMOVE');
+ wt_assert.isnotnull (
+ msg_in => 'Show New Version',
+ check_this_in => show_version);
+ wt_assert.this (
+ msg_in => 'Test New Version',
+ check_this_in => not regexp_like(show_version, 'TESTING'));
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Show Version Teardown';
+ rollback;
+ delete from wt_versions where component = 'TESTING';
+ wt_assert.eq (
+ msg_in => 'Records Deleted',
+ check_this_in => SQL%ROWCOUNT,
+ against_this_in => 0);
+ commit;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.eq (
+ msg_in => 'Return to Existing Version',
+ check_this_in => show_version,
+ against_this_in => existing_version);
+ end t_show_version;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure test_run
+ (in_package_name in varchar2)
+is
+begin
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if wtplsql_skip_test then
+ test_all_aa(in_package_name) := 'X';
+ return; -- Avoid running the TEST_RUN procedure for some self-tests
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ -- Primary Initialize
+ core_data.init1(in_package_name);
+ g_DBOUT := '';
+ wt_assert.reset_globals;
+ -- Reset the Test Runs Record before checking anything
+ check_runner;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('before_test_run');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ -- Secondary Initialize
+ core_data.init2;
+ g_DBOUT := '';
+ --
+ hook.run('execute_test_runner');
+ --
+ -- Primary Finalize
+ wt_assert.g_testcase := '';
+ check_dbout;
+ core_data.final1;
+ g_DBOUT := '';
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_test_run');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end test_run;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_run
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Test Run Testing';
+ wt_assert.isnotnull (
+ msg_in => 'Not Testing Test Run',
+ check_this_in => 'Too complicated because testing occurs while the this procedure is actively running.');
+ end t_test_run;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+------------------------------------------------------------
+procedure test_all
+is
+ TYPE runners_nt_type is table of varchar2(128);
+ l_runners_nt runners_nt_type;
+begin
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('before_test_all');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ select object_name
+ bulk collect into l_runners_nt
+ from user_procedures t1
+ where procedure_name = C_RUNNER_ENTRY_POINT
+ and object_type = 'PACKAGE'
+ group by object_name
+ order by object_name;
+ for i in 1 .. l_runners_nt.COUNT
+ loop
+ test_run(l_runners_nt(i));
+ end loop;
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ -- This will avoid running the hook for some self-tests
+ if NOT wtplsql_skip_test then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_test_all');
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+end test_all;
+
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure t_test_all
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'TEST_ALL Happy Path';
+ test_all_aa.DELETE;
+ wtplsql_skip_test := TRUE;
+ -- TEST_ALL will populate the test_all_aa array
+ wtplsql.test_all;
+ wtplsql_skip_test := FALSE;
+ -- This package should be in the test_all_aa array
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.this (
+ msg_in => 'test_all_aa.EXISTS(''WTPLSQL'')',
+ check_this_in => test_all_aa.EXISTS( 'WTPLSQL' ));
+ end t_test_all;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+
+
+--==============================================================--
+$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
+$THEN
+ procedure WTPLSQL_RUN
+ is
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ -- Can't set wtplsql.g_DBOUT because it is used for Unit Testing
+ --wtplsql.g_DBOUT := 'WTPLSQL:PACKAGE BODY';
+ t_check_runner;
+ t_check_dbout;
+ t_show_version;
+ t_test_run;
+ t_test_all;
+ end;
+$END ----------------%WTPLSQL_end_ignore_lines%----------------
+--==============================================================--
+
+
+end wtplsql;
+/
+
+set define on
diff --git a/wtpsrc/WTP/WTPLSQL.pspec b/wtpsrc/WTP/WTPLSQL.pspec
new file mode 100644
index 0000000..948a87e
--- /dev/null
+++ b/wtpsrc/WTP/WTPLSQL.pspec
@@ -0,0 +1,71 @@
+
+--
+-- Create WTP.WTPLSQL Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WTPLSQL
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WTPLSQL"
+ authid definer
+as
+
+ C_RUNNER_ENTRY_POINT constant varchar2(30) := 'WTPLSQL_RUN';
+
+ function get_runner_entry_point
+ return varchar2 deterministic;
+
+ function show_version
+ return varchar2;
+
+ -- Database Object Under Test.
+ -- Modify as required
+ g_DBOUT varchar2(128);
+
+ -- Run a single test runner in the current schema
+ -- Returns after test runner is complete
+ procedure test_run
+ (in_package_name in varchar2);
+
+ -- Run all test runners in the current schema
+ -- Returns after all test runners are complete
+ procedure test_all;
+
+ -- WtPLSQL Self Test Procedures
+ --
+ -- alter system set PLSQL_CCFLAGS =
+ -- 'WTPLSQL_ENABLE:TRUE, WTPLSQL_SELFTEST:TRUE'
+ -- scope=BOTH;
+ --
+ -- begin
+ -- dbms_utility.compile_schema('WTP',TRUE,FALSE);
+ -- end;
+ -- /
+ --
+ $IF $$WTPLSQL_SELFTEST
+ $THEN
+ procedure WTPLSQL_RUN;
+ $END
+
+end wtplsql;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WTPLSQL" to "PUBLIC";
+
+
+-- Synonyms
+
+--DBMS_METADATA:PUBLIC.WTPLSQL
+
+ CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "WTPLSQL" FOR "WTP"."WTPLSQL";
+
+--DBMS_METADATA:PUBLIC.WT_WTPLSQL
+
+ CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "WT_WTPLSQL" FOR "WTP"."WTPLSQL";
+
+
+set define on
diff --git a/wtpsrc/WTP/WT_AD_HOC_REPORT.proc b/wtpsrc/WTP/WT_AD_HOC_REPORT.proc
new file mode 100644
index 0000000..8591fb4
--- /dev/null
+++ b/wtpsrc/WTP/WT_AD_HOC_REPORT.proc
@@ -0,0 +1,39 @@
+
+--
+-- Create WTP.WT_AD_HOC_REPORT Procedure
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_AD_HOC_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PROCEDURE "WTP"."WT_AD_HOC_REPORT"
+ authid current_user
+ -- AUTHID CURRENT_USER is required for assertions with
+ -- dynamic PL/SQL execution.
+is
+begin
+ dbms_output.put_line(wt_assert.g_rec.last_msg);
+ dbms_output.put_line(' Assertion ' || wt_assert.g_rec.last_assert ||
+ case wt_assert.last_pass
+ when TRUE then ' PASSED.'
+ else ' FAILED.'
+ end);
+ if wt_assert.g_testcase is not null
+ then
+ dbms_output.put_line(' Testcase: ' || wt_assert.g_testcase);
+ end if;
+ dbms_output.put_line( ' ' || wt_assert.g_rec.last_details);
+end wt_ad_hoc_report;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WT_AD_HOC_REPORT" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/src/core/wt_assert.pkb b/wtpsrc/WTP/WT_ASSERT.pbody
similarity index 94%
rename from src/core/wt_assert.pkb
rename to wtpsrc/WTP/WT_ASSERT.pbody
index 30db4ac..302cef9 100644
--- a/src/core/wt_assert.pkb
+++ b/wtpsrc/WTP/WT_ASSERT.pbody
@@ -1,13 +1,14 @@
-create or replace package body wt_assert is
- -- See (public) RESET_GLOBALS procedure for default global values
- TYPE g_rec_type is record
- (last_pass boolean
- ,raise_exception boolean
- ,last_assert wt_results.assertion%TYPE
- ,last_msg wt_results.message%TYPE
- ,last_details wt_results.details%TYPE);
- g_rec g_rec_type;
+--
+-- Create WTP.WT_ASSERT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_ASSERT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_ASSERT" is
$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
temp_rowid1 CONSTANT rowid := chartorowid('AAAFd1AAFAAAABSAA/');
@@ -94,54 +95,159 @@ $END ----------------%WTPLSQL_end_ignore_lines%----------------
procedure process_assertion
is
begin
-
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
- if not wtplsql_skip_save then
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
- wt_result.save
- (in_assertion => g_rec.last_assert
- ,in_status => case g_rec.last_pass
- when TRUE then C_PASS
- else C_FAIL
- end
- ,in_details => g_rec.last_details
- ,in_testcase => g_testcase
- ,in_message => g_rec.last_msg);
-$IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if core_data.g_run_rec.test_runner_name is null
+ then
+ hook.run('ad_hoc_report');
+ return;
end if;
-$END ----------------%WTPLSQL_end_ignore_lines%----------------
-
- if g_rec.raise_exception and not g_rec.last_pass
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ if not wtplsql_skip_save then
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ core_data.add
+ (in_testcase => g_testcase
+ ,in_assertion => g_rec.last_assert
+ ,in_pass => g_rec.last_pass
+ ,in_details => g_rec.last_details
+ ,in_message => g_rec.last_msg);
+ --
+ $IF $$WTPLSQL_SELFTEST $THEN ------%WTPLSQL_begin_ignore_lines%------
+ end if;
+ $END ----------------%WTPLSQL_end_ignore_lines%----------------
+ --
+ hook.run('after_assertion');
+ if g_rec.raise_exception
+ and not g_rec.last_pass
then
- raise_application_error(-20003, wt_text_report.format_test_result
- (in_assertion => g_rec.last_assert
- ,in_status => C_FAIL
- ,in_details => g_rec.last_details
- ,in_testcase => g_testcase
- ,in_message => g_rec.last_msg) );
+ raise_application_error(-20004, g_rec.last_msg || CHR(10) ||
+ ' Assertion ' || g_rec.last_assert || ' Failed.' || CHR(10) ||
+ ' Testcase: ' || g_testcase || CHR(10) ||
+ ' ' || g_rec.last_details );
end if;
-
end process_assertion;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
procedure t_process_assertion
is
+ l_test_runner_nameSAVE core_data.g_run_rec.test_runner_name%TYPE;
+ l_msg varchar2(100) := 'Check Exception Processing';
+ l_line varchar2(32767);
+ l_status pls_integer;
begin
-------------------------------------- WTPLSQL Testing --
- g_testcase := 'PROCESS_ASSERTION';
+ loop
+ dbms_output.get_line(l_line, l_status);
+ exit when l_status = 1;
+ wt_assert.isnull
+ (msg_in => 'Clear DBMS_OUTPUT Buffer'
+ ,check_this_in => l_line);
+ end loop;
+ -------------------------------------- WTPLSQL Testing --
+ wt_assert.g_testcase := 'Ad Hoc Report Happy Path';
+ g_rec.last_assert := 'THIS';
+ g_rec.last_pass := TRUE;
+ g_rec.last_details := 'Expected "PASS" and got "PASS"';
+ g_rec.last_msg := 'Ad Hoc Report Happy Path';
+ g_rec.raise_exception := FALSE;
+ l_test_runner_nameSAVE := core_data.g_run_rec.test_runner_name;
+ core_data.g_run_rec.test_runner_name := '';
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ process_assertion; -- Should not throw exception
+ core_data.g_run_rec.test_runner_name := l_test_runner_nameSAVE;
+ wt_assert.isnotnull
+ (msg_in => l_msg
+ ,check_this_in => 'Ad Hoc Report Exception Success');
+ exception
+ -------------------------------------- WTPLSQL Testing --
+ when OTHERS then
+ core_data.g_run_rec.test_runner_name := l_test_runner_nameSAVE;
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Ad Hoc Report Exception Failed');
+ end;
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 1 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 1 Line'
+ ,check_this_in => l_line
+ ,against_this_in => 'Ad Hoc Report Happy Path');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 2 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 2 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Assertion THIS PASSED.');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 3 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 3 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Testcase: Ad Hoc Report Happy Path');
+ -------------------------------------- WTPLSQL Testing --
+ dbms_output.get_line(l_line, l_status);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 4 Status'
+ ,check_this_in => l_status
+ ,against_this_in => 0);
+ wt_assert.eq
+ (msg_in => 'Ad Hoc Line 4 Line'
+ ,check_this_in => l_line
+ ,against_this_in => ' Expected "PASS" and got "PASS"');
+ -------------------------------------- WTPLSQL Testing --
+ g_testcase := 'PROCESS_ASSERTION';
g_rec.last_assert := 'THIS';
g_rec.last_pass := FALSE;
g_rec.last_details := 'Expected "PASS" and got "FAIL"';
g_rec.last_msg := 'Process Assertion Forced Failure';
g_rec.raise_exception := TRUE;
- wtplsql_skip_save := TRUE;
- process_assertion; -- Should throw exception
- wtplsql_skip_save := FALSE;
- -------------------------------------- WTPLSQL Testing --
- exception
- when ASSERT_FAILURE_EXCEPTION then
- wtplsql_skip_save := FALSE;
+ begin
+ -------------------------------------- WTPLSQL Testing --
+ wtplsql_skip_save := TRUE;
+ process_assertion; -- Should throw exception
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Exception missing, should not have arrived here');
+ exception
+ -------------------------------------- WTPLSQL Testing --
+ when ASSERT_FAILURE_EXCEPTION then
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.eq
+ (msg_in => l_msg
+ ,check_this_in => SQLERRM
+ ,against_this_in => 'ORA-20004: Process Assertion Forced Failure' || CHR(10) ||
+ ' Assertion THIS Failed.' || CHR(10) ||
+ ' Testcase: PROCESS_ASSERTION' || CHR(10) ||
+ ' Expected "PASS" and got "FAIL"');
+ -------------------------------------- WTPLSQL Testing --
+ when OTHERS then
+ wtplsql_skip_save := FALSE;
+ wt_assert.g_testcase := 'Test Process Assertion';
+ wt_assert.isnull
+ (msg_in => l_msg
+ ,check_this_in => 'Incorrect Exception Thrown: ' ||
+ substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack
+ ,1,3950) );
+ end;
end t_process_assertion;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
@@ -254,21 +360,21 @@ begin
end last_pass;
function last_assert
- return wt_results.assertion%TYPE
+ return varchar2
is
begin
return g_rec.last_assert;
end last_assert;
function last_msg
- return wt_results.message%TYPE
+ return varchar2
is
begin
return g_rec.last_msg;
end last_msg;
function last_details
- return wt_results.details%TYPE
+ return varchar2
is
begin
return g_rec.last_details;
@@ -313,10 +419,10 @@ is
begin
g_testcase := '';
g_rec.last_pass := NULL;
+ g_rec.raise_exception := FALSE;
g_rec.last_assert := '';
g_rec.last_msg := '';
g_rec.last_details := '';
- g_rec.raise_exception := FALSE;
end reset_globals;
$IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
@@ -469,7 +575,7 @@ procedure this (
is
begin
g_rec.last_assert := 'THIS';
- g_rec.last_msg := msg_in;
+ g_rec.last_msg := substr(msg_in,1,200);
g_rec.last_pass := nvl(check_this_in, FALSE);
g_rec.last_details := 'Expected "TRUE" and got "' ||
boolean_to_status(check_this_in) || '"';
@@ -608,8 +714,8 @@ is
begin
g_rec.last_assert := 'EQ';
g_rec.last_msg := msg_in;
- g_rec.last_pass := (xmltype.getclobval(check_this_in) =
- xmltype.getclobval(against_this_in) );
+ g_rec.last_pass := nvl(xmltype.getclobval(check_this_in) =
+ xmltype.getclobval(against_this_in), FALSE);
g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_this_in),1,1000) ||
'" and got "' || substr(xmltype.getclobval(check_this_in) ,1,1000) ||
'"';
@@ -921,14 +1027,14 @@ $THEN
check_this_in => (temp_rec.last_pass = FALSE));
-------------------------------------- WTPLSQL Testing --
-- VARCHAR2 includes Includes LONG RAW
- wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
+ wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
eq (
msg_in => 'Run Test',
check_this_in => temp_lraw1,
against_this_in => temp_lraw1);
-------------------------------------- WTPLSQL Testing --
-- VARCHAR2 includes Includes LONG RAW
- wt_assert.g_testcase := 'EQ LANG RAW Happy Path 1';
+ wt_assert.g_testcase := 'EQ LONG RAW Happy Path 1';
wtplsql_skip_save := TRUE;
eq (
msg_in => 'Not Used',
@@ -2326,8 +2432,9 @@ begin
execute immediate check_call_in;
exception when OTHERS then
l_sqlerrm := SQLERRM;
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace
+ l_errstack := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack
,1,4000);
end;
--
@@ -2337,14 +2444,14 @@ begin
then
-- Both are Null
g_rec.last_pass := TRUE;
- elsif against_exc_in is null OR l_sqlerrm is null
+ elsif l_sqlerrm is null OR against_exc_in is null
then
-- If both were Null, it would have been caught above.
-- So, only one can be Null
g_rec.last_pass := FALSE;
else
-- If either was Null, it would have been caught above.
- g_rec.last_pass := l_sqlerrm like '%' || against_exc_in || '%';
+ g_rec.last_pass := nvl(l_sqlerrm like '%' || against_exc_in || '%', FALSE);
end if;
if against_exc_in is null
then
@@ -2442,11 +2549,9 @@ $THEN
msg_in => 'temp_rec.last_details',
check_this_in => temp_rec.last_details,
against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
- 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Raises Tests Happy Path 2';
raises (
@@ -2457,13 +2562,10 @@ $THEN
wt_assert.eq (
msg_in => 'temp_rec.last_details value',
check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%-00302%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
+ against_this_in => 'Expected exception "%-00302%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
-------------------------------------- WTPLSQL Testing --
throws (
msg_in => 'THROWS Varchar2 Test',
@@ -2474,12 +2576,9 @@ $THEN
msg_in => 'temp_rec.last_details value',
check_this_in => temp_rec.last_details,
against_this_in => 'Expected exception "%PLS-00302: component ''BOGUS'' must be declared%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
-------------------------------------- WTPLSQL Testing --
throws (
msg_in => 'THROWS Number Test',
@@ -2489,13 +2588,10 @@ $THEN
wt_assert.eq (
msg_in => 'temp_rec.last_details value',
check_this_in => temp_rec.last_details,
- against_this_in => 'Expected exception "%-00302%". ' ||
- 'Actual exception raised was "' ||
- 'ORA-06550: line 1, column 17:' || CHR(10) ||
- 'PLS-00302: component ''BOGUS'' must be declared' || CHR(10) ||
- 'ORA-06550: line 1, column 7:' || CHR(10) ||
- 'PL/SQL: Statement ignored". ' ||
- 'Exception raised by: "begin wt_assert.bogus; end;".');
+ against_this_in => 'Expected exception "%-00302%". ' ||
+ 'Actual exception raised was "ORA-06550: line 1, column 17:' || CHR(10) ||
+ 'PLS-00302: component ''BOGUS'' must be declared". ' ||
+ 'Exception raised by: "begin wt_assert.bogus; end;".' );
-------------------------------------- WTPLSQL Testing --
wt_assert.g_testcase := 'Raises Tests Happy Path 3';
raises (
@@ -2586,7 +2682,7 @@ begin
open l_rc for check_query_in;
fetch l_rc into l_rc_buff;
close l_rc;
- g_rec.last_pass := ( l_rc_buff = against_value_in
+ g_rec.last_pass := ( nvl(l_rc_buff = against_value_in, FALSE)
or ( l_rc_buff is null
and against_value_in is null
and null_ok_in ) );
@@ -2596,8 +2692,9 @@ begin
g_rec.raise_exception := raise_exc_in;
process_assertion;
exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
+ l_errstack := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,2900);
g_rec.last_details := 'Exception raised for Query: ' ||
substr(check_query_in ,1,1000) ||
CHR(10) || l_errstack;
@@ -2624,16 +2721,17 @@ begin
open l_rc for check_query_in;
fetch l_rc into l_rc_buff;
close l_rc;
- g_rec.last_pass := (xmltype.getclobval(l_rc_buff) =
- xmltype.getclobval(against_value_in) );
+ g_rec.last_pass := nvl(xmltype.getclobval(l_rc_buff) =
+ xmltype.getclobval(against_value_in), FALSE);
g_rec.last_details := 'Expected "' || substr(xmltype.getclobval(against_value_in),1,1000) ||
'" and got "' || substr(xmltype.getclobval(l_rc_buff ),1,1000) ||
'" for Query: ' || substr( check_query_in ,1,1000) ;
g_rec.raise_exception := raise_exc_in;
process_assertion;
exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
+ l_errstack := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,2900);
g_rec.last_details := 'Exception raised for Query: ' ||
substr(check_query_in ,1,1000) ||
CHR(10) || l_errstack;
@@ -2660,7 +2758,7 @@ begin
open l_rc for check_query_in;
fetch l_rc into l_rc_buff;
close l_rc;
- g_rec.last_pass := ( l_rc_buff = against_value_in
+ g_rec.last_pass := ( nvl(l_rc_buff = against_value_in, FALSE)
or ( l_rc_buff is null
and against_value_in is null
and null_ok_in ) );
@@ -2670,8 +2768,9 @@ begin
g_rec.raise_exception := raise_exc_in;
process_assertion;
exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
+ l_errstack := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,2900);
g_rec.last_details := 'Exception raised for Query: ' ||
substr(check_query_in ,1,1000) ||
CHR(10) || l_errstack;
@@ -2700,7 +2799,7 @@ begin
fetch l_rc into l_rc_buff;
close l_rc;
compare_results := nvl(DBMS_LOB.COMPARE(l_rc_buff, against_value_in),-1);
- g_rec.last_pass := ( (compare_results = 0)
+ g_rec.last_pass := ( nvl(compare_results = 0, FALSE)
or ( l_rc_buff is null
and against_value_in is null
and null_ok_in ) );
@@ -2710,8 +2809,9 @@ begin
g_rec.raise_exception := raise_exc_in;
process_assertion;
exception when others then
- l_errstack := substr(dbms_utility.format_error_stack ||
- dbms_utility.format_error_backtrace,1,2900);
+ l_errstack := substr(SQLERRM || CHR(10) ||
+ dbms_utility.format_error_backtrace ||
+ dbms_utility.format_call_stack,1,2900);
g_rec.last_details := 'Exception raised for Query: ' ||
substr(check_query_in ,1,1000) ||
CHR(10) || l_errstack;
@@ -3413,7 +3513,7 @@ is
g_rec.last_details := SQLERRM || CHR(10) ||
'FAILURE of Compare Query: ' || l_query || ';';
g_rec.last_pass := FALSE;
- l_success := FALSE;
+ l_success := FALSE;
g_rec.raise_exception := raise_exc_in;
process_assertion;
end l_run_query;
@@ -3437,7 +3537,7 @@ begin
end if;
l_run_query;
if NOT l_success then return; end if;
- g_rec.last_pass := (l_check_cnt = l_cnt);
+ g_rec.last_pass := nvl(l_check_cnt = l_cnt, FALSE);
--
g_rec.last_details := 'Expected ' || l_cnt || ' rows from "' || against_this_in ||
'" and got ' || l_check_cnt || ' rows from "' || check_this_in ||
@@ -3870,9 +3970,11 @@ $IF $$WTPLSQL_SELFTEST ------%WTPLSQL_begin_ignore_lines%------
$THEN
-- Can't profile this package because all the "assert" tests
-- pause profiling before they execute.
- procedure WTPLSQL_RUN --% WTPLSQL SET DBOUT "WT_ASSERT:PACKAGE BODY" %--
+ procedure WTPLSQL_RUN
is
begin
+ wtplsql.g_DBOUT := 'WT_ASSERT:PACKAGE BODY';
+ hook.g_run_assert_hook := FALSE;
select temp_clob, temp_nclob, temp_xml, temp_blob
into temp_clob1, temp_nclob1, temp_xml1, temp_blob1
from wt_self_test where id = 1;
@@ -3885,9 +3987,9 @@ $THEN
t_reset_globals;
t_this;
t_eq;
+ -------------------------------------- WTPLSQL Testing --
t_isnotnull;
t_isnull;
- -------------------------------------- WTPLSQL Testing --
t_raises;
t_eqqueryvalue;
t_eqquery;
@@ -3895,6 +3997,8 @@ $THEN
t_eqtabcount;
t_object_exists;
t_object_not_exists;
+ -------------------------------------- WTPLSQL Testing --
+ hook.g_run_assert_hook := TRUE;
end WTPLSQL_RUN;
$END ----------------%WTPLSQL_end_ignore_lines%----------------
--==============================================================--
@@ -3902,3 +4006,5 @@ $END ----------------%WTPLSQL_end_ignore_lines%----------------
end wt_assert;
/
+
+set define on
diff --git a/src/core/wt_assert.pks b/wtpsrc/WTP/WT_ASSERT.pspec
similarity index 89%
rename from src/core/wt_assert.pks
rename to wtpsrc/WTP/WT_ASSERT.pspec
index 53bcf13..ec05422 100644
--- a/src/core/wt_assert.pks
+++ b/wtpsrc/WTP/WT_ASSERT.pspec
@@ -1,30 +1,47 @@
-create or replace package wt_assert authid current_user
+
+--
+-- Create WTP.WT_ASSERT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_ASSERT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_ASSERT"
+ authid current_user
is
-- AUTHID CURRENT_USER is required for dynamic PL/SQL execution.
ASSERT_FAILURE_EXCEPTION exception;
- PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20003);
-
- C_PASS CONSTANT varchar2(10) := 'PASS';
- C_FAIL CONSTANT varchar2(10) := 'FAIL';
+ PRAGMA EXCEPTION_INIT(ASSERT_FAILURE_EXCEPTION, -20004);
-- See RESET_GLOBALS procedure for default global values
-- Testcase name for a series of assertions.
-- Modify as required
- g_testcase wt_results.testcase%TYPE;
+ g_testcase core_data.long_name;
+
+ -- See RESET_GLOBALS procedure for default global values
+ TYPE g_rec_type is record
+ (last_pass boolean
+ ,raise_exception boolean
+ ,last_assert varchar2(15)
+ ,last_msg varchar2(200)
+ ,last_details varchar2(4000));
+ g_rec g_rec_type;
function last_pass
return boolean;
function last_assert
- return wt_results.assertion%TYPE;
+ return varchar2;
function last_msg
- return wt_results.message%TYPE;
+ return varchar2;
function last_details
- return wt_results.details%TYPE;
+ return varchar2;
procedure reset_globals;
@@ -267,3 +284,22 @@ is
$END
end wt_assert;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WT_ASSERT" to "PUBLIC";
+
+
+-- Synonyms
+
+--DBMS_METADATA:PUBLIC.UTASSERT
+
+ CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "UTASSERT" FOR "WTP"."WT_ASSERT";
+
+--DBMS_METADATA:PUBLIC.WT_ASSERT
+
+ CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "WT_ASSERT" FOR "WTP"."WT_ASSERT";
+
+
+set define on
diff --git a/wtpsrc/WTP/WT_CORE_REPORT.pbody b/wtpsrc/WTP/WT_CORE_REPORT.pbody
new file mode 100644
index 0000000..f677582
--- /dev/null
+++ b/wtpsrc/WTP/WT_CORE_REPORT.pbody
@@ -0,0 +1,269 @@
+
+--
+-- Create WTP.WT_CORE_REPORT Package Body
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_CORE_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE BODY "WTP"."WT_CORE_REPORT"
+as
+
+
+----------------------
+-- Private Procedures
+----------------------
+
+
+------------------------------------------------------------
+procedure p
+ (in_text in varchar2)
+is
+begin
+ if g_in_process
+ then
+ vc_aa(vc_aa.COUNT + 1) := in_text;
+ else
+ dbms_output.put_line(in_text);
+ end if;
+end p;
+
+------------------------------------------------------------
+procedure summary_out
+is
+ asrt_cnt number;
+ asrt_fail number;
+ run_sec number;
+ tc_cnt number;
+ tc_fail number;
+ tc_yield number;
+ min_msec number;
+ max_msec number;
+ tot_msec number;
+ avg_msec number;
+begin
+ p('');
+ --
+ p(' wtPLSQL ' || wtplsql.show_version);
+ p(' Start Date/Time: ' ||
+ to_char(core_data.g_run_rec.start_dtm, g_date_format));
+ p(' Test Results for ' || core_data.g_run_rec.test_runner_owner ||
+ '.' || core_data.g_run_rec.test_runner_name );
+ ----------------------------------------
+ if core_data.g_run_rec.dbout_name is not null
+ then
+ p(' Database Object Under Test is ' || core_data.g_run_rec.dbout_type ||
+ ' ' || core_data.g_run_rec.dbout_owner ||
+ '.' || core_data.g_run_rec.dbout_name );
+ end if;
+ p(' ------------------------------------------------------------------');
+ --
+ asrt_cnt := nvl(core_data.g_run_rec.asrt_cnt ,0);
+ asrt_fail := nvl(core_data.g_run_rec.asrt_fail ,0);
+ run_sec := nvl(core_data.g_run_rec.runner_sec ,0);
+ tc_cnt := nvl(core_data.g_run_rec.tc_cnt ,0);
+ tc_fail := nvl(core_data.g_run_rec.tc_fail ,0);
+ min_msec := nvl(core_data.g_run_rec.asrt_min_msec,0);
+ max_msec := nvl(core_data.g_run_rec.asrt_max_msec,0);
+ tot_msec := nvl(core_data.g_run_rec.asrt_tot_msec,0);
+ case nvl(asrt_cnt,0)
+ when 0 then avg_msec := 0;
+ else avg_msec := nvl(tot_msec/asrt_cnt,0);
+ end case;
+ case nvl(tc_cnt,0)
+ when 0 then tc_yield := 0;
+ else tc_yield := nvl(100*(1-(tc_fail/tc_cnt)),0);
+ end case;
+ --
+ p(' Minimum Elapsed msec: ' || to_char(min_msec ,'999999999') ||
+ ' Total Assertions: ' || to_char(asrt_cnt ,'999999999') );
+ p(' Average Elapsed msec: ' || to_char(avg_msec ,'999999999') ||
+ ' Failed Assertions: ' || to_char(asrt_fail,'999999999') );
+ p(' Maximum Elapsed msec: ' || to_char(max_msec ,'999999999') ||
+ ' Total Testcases: ' || to_char(tc_cnt ,'999999999') );
+ p(' Total Run Time (sec): ' || to_char(run_sec ,'9999990.9') ||
+ ' Failed Testcases: ' || to_char(tc_fail ,'999999999') );
+ p(' ' || ' ' ||
+ ' Testcase Yield: ' || to_char(tc_yield ,'999999999') || '%');
+ --
+ if core_data.g_run_rec.error_message is not null
+ then
+ p('');
+ p(' *** Test Runner Error ***');
+ p(core_data.g_run_rec.error_message);
+ end if;
+ --
+end summary_out;
+
+------------------------------------------------------------
+procedure results_out
+ (in_show_pass in boolean)
+is
+ l_rec core_data.results_rec_type;
+ old_testcase core_data.long_name;
+ show_header boolean := TRUE;
+begin
+ -- Check Test Results Array
+ if NOT core_data.g_results_nt.EXISTS(1)
+ then
+ p(' * NOTE: No Data in Test Results Array "core_data.g_results_nt"');
+ return;
+ end if;
+ -- Loop through all results
+ for i in 1 .. core_data.g_results_nt.COUNT
+ loop
+ -- Determine if this should be displayed
+ if core_data.g_results_nt.EXISTS(i)
+ AND ( in_show_pass
+ OR NOT core_data.g_results_nt(i).pass)
+ then
+ l_rec := core_data.g_results_nt(i);
+ -- Remove Consecutive Testcases
+ if l_rec.testcase = old_testcase
+ then
+ l_rec.testcase := '';
+ else
+ old_testcase := l_rec.testcase;
+ end if;
+ -- Display header if needed
+ if show_header
+ then
+ p('');
+ p(' ' || core_data.g_run_rec.test_runner_owner ||
+ '.' || core_data.g_run_rec.test_runner_name ||
+ ' Test Runner Details' );
+ p(' --------------------------------------------------------------');
+ show_header := FALSE;
+ end if;
+ -- Display the result
+ p(format_test_result(l_rec));
+ end if;
+ end loop;
+ --
+end results_out;
+
+
+---------------------
+-- Public Procedures
+---------------------
+
+
+------------------------------------------------------------
+procedure dbms_out
+ (in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE)
+is
+begin
+ -- Setup Display Order
+ if in_summary_last
+ then
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ end if;
+ summary_out;
+ else
+ summary_out;
+ if in_detail_level >= 10
+ then
+ results_out(in_detail_level >= 20);
+ end if;
+ end if;
+ p('');
+end dbms_out;
+
+
+------------------------------------------------------------
+procedure before_test_all
+is
+begin
+ vc_aa.DELETE;
+ g_in_process := TRUE;
+end before_test_all;
+
+
+------------------------------------------------------------
+procedure after_test_all
+is
+begin
+ for i in 1 .. vc_aa.COUNT
+ loop
+ dbms_output.put_line(vc_aa(i));
+ end loop;
+ g_in_process := FALSE;
+end after_test_all;
+
+
+------------------------------------------------------------
+function format_test_result
+ (in_rec in core_data.results_rec_type)
+ return varchar2
+is
+ l_out_str varchar2(32000) := '';
+begin
+ if in_rec.testcase is not null
+ then
+ l_out_str := rpad('---*** ' || in_rec.testcase ||
+ ' ***---'
+ ,80,'-') || CHR(10);
+ end if;
+ if in_rec.pass
+ then
+ l_out_str := l_out_str || ' PASS ';
+ else
+ l_out_str := l_out_str || '#FAIL#';
+ end if;
+ if in_rec.interval_msec is not null
+ then
+ l_out_str := l_out_str || lpad(in_rec.interval_msec,4) || 'ms ';
+ end if;
+ if in_rec.message is not null
+ then
+ l_out_str := l_out_str || in_rec.message || '. ';
+ end if;
+ l_out_str := l_out_str || in_rec.assertion || ' - ';
+ if g_single_line_output
+ then
+ l_out_str := l_out_str || replace(replace(in_rec.details
+ ,CHR(13),'\r')
+ ,CHR(10),'\n');
+ else
+ l_out_str := l_out_str || in_rec.details;
+ end if;
+ return l_out_str;
+end format_test_result;
+
+
+------------------------------------------------------------
+procedure insert_hooks
+is
+begin
+ delete_hooks;
+ insert into hooks (hook_name, seq, run_string)
+ values ('before_test_all', 20, 'begin wtp.wt_core_report.before_test_all; end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_run', 20, 'begin wtp.wt_core_report.dbms_out(in_detail_level => 10); end;');
+ insert into hooks (hook_name, seq, run_string)
+ values ('after_test_all', 20, 'begin wtp.wt_core_report.after_test_all; end;');
+ commit;
+ hook.init;
+end insert_hooks;
+
+
+------------------------------------------------------------
+procedure delete_hooks
+is
+begin
+ delete from hooks where run_string like '% wtp.wt_core_report.%';
+ dbms_output.put_line(SQL%ROWCOUNT || ' "wt_core_report" rows deleted from HOOKS table.');
+ hook.init;
+ commit;
+end delete_hooks;
+
+
+end wt_core_report;
+/
+
+set define on
diff --git a/wtpsrc/WTP/WT_CORE_REPORT.pspec b/wtpsrc/WTP/WT_CORE_REPORT.pspec
new file mode 100644
index 0000000..87c428f
--- /dev/null
+++ b/wtpsrc/WTP/WT_CORE_REPORT.pspec
@@ -0,0 +1,67 @@
+
+--
+-- Create WTP.WT_CORE_REPORT Package
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_CORE_REPORT
+
+ CREATE OR REPLACE EDITIONABLE PACKAGE "WTP"."WT_CORE_REPORT"
+ authid definer
+as
+
+ -- To report the latest Test Runner results:
+ -- begin
+ -- wt_core_report.dbms_out(30, TRUE);
+ -- end;
+ -- /
+
+ -- Turn this off to allow output across multiple lines of text
+ g_single_line_output boolean := TRUE;
+
+ -- DATE data type format for Report Header
+ g_date_format varchar2(100) := 'DD-Mon-YYYY HH:MI:SS PM';
+
+ -- True While Processing a TEST_ALL
+ g_in_process boolean := FALSE;
+ TYPE vc_aa_type is table of varchar2(4000) index by pls_integer;
+ vc_aa vc_aa_type;
+
+ procedure dbms_out
+ (in_detail_level in number default 0
+ ,in_summary_last in boolean default FALSE);
+ -- "in_detail_level" settings for DBMS_OUT procedure:
+ -- * Less than 10 (including null) - No Detail
+ -- * Assertion results summary.
+ -- * 10 to 19 - Minimal Detail
+ -- * Assertion results summary.
+ -- * Failed assertion result details.
+ -- * 20 or more - Full Detail
+ -- * Assertion results summary.
+ -- * All assertion result details.
+
+ procedure before_test_all;
+ procedure after_test_all;
+
+ function format_test_result
+ (in_rec in core_data.results_rec_type)
+ return varchar2;
+
+ procedure insert_hooks;
+
+ procedure delete_hooks;
+
+end wt_core_report;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WT_CORE_REPORT" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/WT_EXECUTE_TEST_RUNNER.proc b/wtpsrc/WTP/WT_EXECUTE_TEST_RUNNER.proc
new file mode 100644
index 0000000..2c90eb8
--- /dev/null
+++ b/wtpsrc/WTP/WT_EXECUTE_TEST_RUNNER.proc
@@ -0,0 +1,33 @@
+
+--
+-- Create WTP.WT_EXECUTE_TEST_RUNNER Procedure
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_EXECUTE_TEST_RUNNER
+
+ CREATE OR REPLACE EDITIONABLE PROCEDURE "WTP"."WT_EXECUTE_TEST_RUNNER"
+ authid current_user
+ -- AUTHID CURRENT_USER is required for assertions with dynamic PL/SQL execution.
+is
+ sql_txt varchar2(4000);
+begin
+ sql_txt := 'begin "' || wtp.core_data.g_run_rec.test_runner_owner ||
+ '"."' || wtp.core_data.g_run_rec.test_runner_name ||
+ '".' || wtplsql.C_RUNNER_ENTRY_POINT || '; end;';
+ --dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+end wt_execute_test_runner;
+/
+
+
+-- Grants
+grant EXECUTE on "WTP"."WT_EXECUTE_TEST_RUNNER" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/WT_QUAL_TEST_RUNNERS_VW.vw b/wtpsrc/WTP/WT_QUAL_TEST_RUNNERS_VW.vw
new file mode 100644
index 0000000..b94279d
--- /dev/null
+++ b/wtpsrc/WTP/WT_QUAL_TEST_RUNNERS_VW.vw
@@ -0,0 +1,49 @@
+
+--
+-- Create WTP.WT_QUAL_TEST_RUNNERS_VW view
+--
+-- NOTE: Foreign keys are in a difference script
+-- Triggers are in a difference script
+--
+
+set define off
+
+
+--
+-- Need to avoid errors granting permisions on a view that has errors
+-- Found this technique on Ask Tom
+-- https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:43253832697675#2653213300346351987
+create view "WTP"."WT_QUAL_TEST_RUNNERS_VW"
+ as select * from SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE;
+
+-- Grants
+grant SELECT on "WTP"."WT_QUAL_TEST_RUNNERS_VW" to "PUBLIC";
+
+
+
+--DBMS_METADATA:WTP.WT_QUAL_TEST_RUNNERS_VW
+
+ CREATE OR REPLACE FORCE EDITIONABLE VIEW "WTP"."WT_QUAL_TEST_RUNNERS_VW" ("OWNER", "PACKAGE_NAME") AS
+ select owner
+ ,object_name PACKAGE_NAME
+ from dba_procedures
+ where procedure_name = wtplsql.get_runner_entry_point
+ and object_type = 'PACKAGE';
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_QUAL_TEST_RUNNERS_VW
+
+ COMMENT ON COLUMN "WTP"."WT_QUAL_TEST_RUNNERS_VW"."OWNER" IS 'Owner of the Qualified Test Runner Package';
+ COMMENT ON COLUMN "WTP"."WT_QUAL_TEST_RUNNERS_VW"."PACKAGE_NAME" IS 'Name of the Qualified Test Runner Package';
+ COMMENT ON TABLE "WTP"."WT_QUAL_TEST_RUNNERS_VW" IS 'All PL/SQL Packages with the required Test Runner Entry Point.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_QUAL_TEST_RUNNERS_VW" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/WTP/WT_VERSIONS.tab b/wtpsrc/WTP/WT_VERSIONS.tab
new file mode 100644
index 0000000..aa59e3f
--- /dev/null
+++ b/wtpsrc/WTP/WT_VERSIONS.tab
@@ -0,0 +1,45 @@
+
+--
+-- Create WTP.WT_VERSIONS Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_VERSIONS
+
+ CREATE TABLE "WTP"."WT_VERSIONS"
+ ( "INSTALL_TSTMP" TIMESTAMP (6) WITH LOCAL TIME ZONE DEFAULT systimestamp,
+ "COMPONENT" VARCHAR2(15 BYTE) CONSTRAINT "WT_VESIONS_NN1" NOT NULL ENABLE,
+ "VERSION" NUMBER CONSTRAINT "WT_VESIONS_NN2" NOT NULL ENABLE,
+ "ACTION" VARCHAR2(15 BYTE) CONSTRAINT "WT_VESIONS_NN3" NOT NULL ENABLE,
+ "NOTES" VARCHAR2(4000 BYTE)
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_VERSIONS" ADD CONSTRAINT "WT_VERSIONS_CK1" CHECK (action in ('INSTALL','UPDATE','REMOVE')) ENABLE;
+ALTER TABLE "WTP"."WT_VERSIONS" ADD CONSTRAINT "WT_VERSIONS_PK" PRIMARY KEY ("INSTALL_TSTMP")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_VERSIONS
+
+ COMMENT ON COLUMN "WTP"."WT_VERSIONS"."INSTALL_TSTMP" IS '(Required) Date/Time the action was taken';
+ COMMENT ON COLUMN "WTP"."WT_VERSIONS"."COMPONENT" IS '(Required) Component or Add-on name';
+ COMMENT ON COLUMN "WTP"."WT_VERSIONS"."VERSION" IS '(Required) Version number of the Component or Add-on';
+ COMMENT ON COLUMN "WTP"."WT_VERSIONS"."ACTION" IS '(Required) One of INSTALL, UPDATE, or REMOVE';
+ COMMENT ON COLUMN "WTP"."WT_VERSIONS"."NOTES" IS 'Additional notes for the action taken';
+ COMMENT ON TABLE "WTP"."WT_VERSIONS" IS 'Records the installed and upgraded versions.';
+
+
+-- Grants
+grant SELECT on "WTP"."WT_VERSIONS" to "PUBLIC";
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtpsrc/alter_foreign_keys.sql b/wtpsrc/alter_foreign_keys.sql
new file mode 100644
index 0000000..bd398c9
--- /dev/null
+++ b/wtpsrc/alter_foreign_keys.sql
@@ -0,0 +1,88 @@
+
+--
+-- Alter "wtpsrc" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Foreign Keys for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/alter_queues.sql b/wtpsrc/alter_queues.sql
new file mode 100644
index 0000000..fe33f3c
--- /dev/null
+++ b/wtpsrc/alter_queues.sql
@@ -0,0 +1,36 @@
+
+--
+-- Alter "wtpsrc" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Queues for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/alter_scheduler_jobs.sql b/wtpsrc/alter_scheduler_jobs.sql
new file mode 100644
index 0000000..0cba96a
--- /dev/null
+++ b/wtpsrc/alter_scheduler_jobs.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpsrc" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Scheduler Jobs for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/alter_triggers.sql b/wtpsrc/alter_triggers.sql
new file mode 100644
index 0000000..f287b49
--- /dev/null
+++ b/wtpsrc/alter_triggers.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtpsrc" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Triggers for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/compile_all.sql b/wtpsrc/compile_all.sql
new file mode 100644
index 0000000..8f30f8c
--- /dev/null
+++ b/wtpsrc/compile_all.sql
@@ -0,0 +1,36 @@
+
+--
+-- Compile All "wtpsrc" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+ dbms_output.put_line('Compile All for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/db_build_junit_report.sql b/wtpsrc/db_build_junit_report.sql
new file mode 100644
index 0000000..d31eeca
--- /dev/null
+++ b/wtpsrc/db_build_junit_report.sql
@@ -0,0 +1,112 @@
+
+--
+-- Create JUnit XML Report of Database Build Status for "wtpsrc" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+ do_it('WTP');
+ ot('');
+end;
+/
diff --git a/wtpsrc/db_install.sql b/wtpsrc/db_install.sql
new file mode 100644
index 0000000..8fab835
--- /dev/null
+++ b/wtpsrc/db_install.sql
@@ -0,0 +1,57 @@
+
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+/
+
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+/
+
+set feedback on
diff --git a/wtpsrc/fix_invalid_public_synonyms.sql b/wtpsrc/fix_invalid_public_synonyms.sql
new file mode 100644
index 0000000..ef70282
--- /dev/null
+++ b/wtpsrc/fix_invalid_public_synonyms.sql
@@ -0,0 +1,49 @@
+
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+/
+
diff --git a/wtpsrc/install.sql b/wtpsrc/install.sql
new file mode 100644
index 0000000..ef51e19
--- /dev/null
+++ b/wtpsrc/install.sql
@@ -0,0 +1,76 @@
+
+--
+-- Master Installation Script
+-- All scripts created by "https://ODBCapture.org", Version V2.1
+--
+-- Must be run as SYS
+--
+-- Command Line Parameters:
+-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the pluggable database.
+-- The Data Load installation requires this connection information.
+--
+
+-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:
+-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv
+
+define TOP_PDB_SYSTEM="&1."
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt Identify this Module in V$SESSION
+set appinfo "wtpsrc Installation"
+
+----------------------------------------
+prompt Setup Abort on Error
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+----------------------------------------
+prompt
+prompt **************************
+prompt * Run SYS Installation *
+prompt **************************
+prompt
+@install_sys.sql "" "" ""
+
+----------------------------------------
+prompt Setup Continue on Error
+WHENEVER SQLERROR CONTINUE
+WHENEVER OSERROR CONTINUE
+
+----------------------------------------
+prompt
+prompt *****************************
+prompt * Run SYSTEM Installation *
+prompt *****************************
+prompt
+connect &TOP_PDB_SYSTEM.
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+@install_system.sql "" "" ""
+
+----------------------------------------
+prompt
+prompt *************************
+prompt * Install Application *
+prompt *************************
+prompt
+@install_wtpsrc.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+prompt
+prompt *****************
+prompt * Run Reports *
+prompt *****************
+prompt
+@report_status.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+set appinfo "Null"
+set appinfo off
+prompt
+prompt "wtpsrc" Installation is Done.
+
diff --git a/wtpsrc/install_sys.sql b/wtpsrc/install_sys.sql
new file mode 100644
index 0000000..070a641
--- /dev/null
+++ b/wtpsrc/install_sys.sql
@@ -0,0 +1,23 @@
+
+--
+-- SYS Installation Script
+--
+-- Must be run as SYS
+--
+
+spool install_sys.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+-- USER Install
+
+@db_install.sql "SYS/WTP.usr" "" ""
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpsrc/install_system.sql b/wtpsrc/install_system.sql
new file mode 100644
index 0000000..abd1be8
--- /dev/null
+++ b/wtpsrc/install_system.sql
@@ -0,0 +1,23 @@
+
+--
+-- SYSTEM Installation Script
+--
+-- Must be run as SYSTEM
+--
+
+spool install_system.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+-- GRANT Install
+
+@db_install.sql "SYSTEM/WTP_usr.grnt" "" ""
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtpsrc/install_wtpsrc.sql b/wtpsrc/install_wtpsrc.sql
new file mode 100644
index 0000000..57ae496
--- /dev/null
+++ b/wtpsrc/install_wtpsrc.sql
@@ -0,0 +1,76 @@
+
+--
+-- wtpsrc Installation Script
+--
+-- Must be run as a SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+spool install_wtpsrc.log
+
+define INSTALL_SYSTEM_CONNECT="&1."
+
+-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages
+set sqlprefix "~"
+
+-- Using "^P", CHR(16), DLE as an escape character
+set escape OFF
+set escape ""
+
+----------------------------------------
+-- Prepare for Install
+@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PROCEDURE Install
+
+@db_install.sql "WTP/WT_AD_HOC_REPORT.proc" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_EXECUTE_TEST_RUNNER.proc" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE Install
+
+@db_install.sql "WTP/CORE_DATA.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/HOOK.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/JUNIT_CORE_REPORT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WTPLSQL.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_ASSERT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_CORE_REPORT.pspec" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE Install
+
+@db_install.sql "WTP/HOOKS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_VERSIONS.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- DATA_LOAD Install
+
+@db_install.sql "WTP/HOOKS.cdl" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- VIEW Install
+
+@db_install.sql "WTP/WT_QUAL_TEST_RUNNERS_VW.vw" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- PACKAGE BODY Install
+
+@db_install.sql "WTP/CORE_DATA.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/HOOK.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/JUNIT_CORE_REPORT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WTPLSQL.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_ASSERT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+@db_install.sql "WTP/WT_CORE_REPORT.pbody" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- Finalize Installation
+@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+spool off
+
diff --git a/wtpsrc/installation_finalize.sql b/wtpsrc/installation_finalize.sql
new file mode 100644
index 0000000..7660714
--- /dev/null
+++ b/wtpsrc/installation_finalize.sql
@@ -0,0 +1,48 @@
+
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."
diff --git a/wtpsrc/installation_prepare.sql b/wtpsrc/installation_prepare.sql
new file mode 100644
index 0000000..265eb55
--- /dev/null
+++ b/wtpsrc/installation_prepare.sql
@@ -0,0 +1,9 @@
+
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;
diff --git a/wtpsrc/list_invalids.csv b/wtpsrc/list_invalids.csv
new file mode 100644
index 0000000..e2d4f25
--- /dev/null
+++ b/wtpsrc/list_invalids.csv
@@ -0,0 +1 @@
+"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"
diff --git a/wtpsrc/list_invalids.sql b/wtpsrc/list_invalids.sql
new file mode 100644
index 0000000..1e38a7d
--- /dev/null
+++ b/wtpsrc/list_invalids.sql
@@ -0,0 +1,47 @@
+
+--
+-- List Invalid Objects for "wtpsrc" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+ do_it('WTP');
+end;
+/
diff --git a/wtpsrc/log_files_junit_report.sql b/wtpsrc/log_files_junit_report.sql
new file mode 100644
index 0000000..e088eca
--- /dev/null
+++ b/wtpsrc/log_files_junit_report.sql
@@ -0,0 +1,282 @@
+
+--
+-- Create JUnit XML Report of Database Log Files for "wtpsrc" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_wtpsrc
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = 'wtpsrc'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+/
diff --git a/wtpsrc/odbcapture_installation_logs.cdl b/wtpsrc/odbcapture_installation_logs.cdl
new file mode 100644
index 0000000..efb09a6
--- /dev/null
+++ b/wtpsrc/odbcapture_installation_logs.cdl
@@ -0,0 +1,71 @@
+
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+/
+
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtpsrc/odbcapture_installation_logs.csv b/wtpsrc/odbcapture_installation_logs.csv
new file mode 100644
index 0000000..861a74e
--- /dev/null
+++ b/wtpsrc/odbcapture_installation_logs.csv
@@ -0,0 +1,4 @@
+"wtpsrc","install_sys.log"
+"wtpsrc","install_system.log"
+"wtpsrc","install_wtpsrc.log"
+"wtpsrc","WTP/HOOKS.log"
diff --git a/wtpsrc/odbcapture_installation_logs.ctl b/wtpsrc/odbcapture_installation_logs.ctl
new file mode 100644
index 0000000..3a1cf46
--- /dev/null
+++ b/wtpsrc/odbcapture_installation_logs.ctl
@@ -0,0 +1,8 @@
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )
diff --git a/wtpsrc/report_status.sql b/wtpsrc/report_status.sql
new file mode 100644
index 0000000..1e1b71e
--- /dev/null
+++ b/wtpsrc/report_status.sql
@@ -0,0 +1,114 @@
+
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = 'wtpsrc'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+/
+
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
diff --git a/wtpsrc/update_id_sequences.sql b/wtpsrc/update_id_sequences.sql
new file mode 100644
index 0000000..9f61105
--- /dev/null
+++ b/wtpsrc/update_id_sequences.sql
@@ -0,0 +1,59 @@
+
+--
+-- Update "wtpsrc" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Update ID Sequences for wtpsrc Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/WTP/WT_SELF_TEST.cdl b/wtptst/WTP/WT_SELF_TEST.cdl
new file mode 100644
index 0000000..780817f
--- /dev/null
+++ b/wtptst/WTP/WT_SELF_TEST.cdl
@@ -0,0 +1,134 @@
+
+--
+-- Consolidated Data Load script for WTP.WT_SELF_TEST data
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Disable Triggers and Foreign Keys
+declare
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ for buff in (select owner, trigger_name
+ from dba_triggers
+ where table_owner = 'WTP'
+ and table_name = 'WT_SELF_TEST'
+ order by owner, trigger_name)
+ loop
+ run_sql('alter trigger "' || buff.owner || '"' ||
+ '."' || buff.trigger_name || '" DISABLE');
+ end loop;
+ for buff in (select constraint_name
+ from dba_constraints
+ where constraint_type = 'R'
+ and owner = 'WTP'
+ and table_name = 'WT_SELF_TEST'
+ order by owner, constraint_name)
+ loop
+ run_sql('alter table "WTP"."WT_SELF_TEST"' ||
+ ' DISABLE constraint "' || buff.constraint_name || '"');
+ end loop;
+end;
+/
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=WTP/WT_SELF_TEST.ctl
+host sqlldr '&1.' control=WTP/WT_SELF_TEST.ctl data=WTP/WT_SELF_TEST.csv log=WTP/WT_SELF_TEST.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "WTP/WT_SELF_TEST.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
+declare
+ l_blob blob;
+ the_blob blob;
+ procedure b64_decode
+ (in_blob in BLOB)
+ is
+ B64_ENCODE_HEADER constant varchar2(30) := '(Base64 with Linefeeds)';
+ SPLIT_LEN constant pls_integer := 32764; -- Must be divisible by 4
+ header_txt varchar2(128);
+ len_blob pls_integer;
+ ptr pls_integer;
+ begin
+ dbms_lob.trim(l_blob, 0);
+ dbms_lob.trim(the_blob, 0);
+ ----------------------------------------
+ -- Check incoming BLOB sizes (and return if needed)
+ if in_blob is null then return; end if;
+ len_blob := length(in_blob);
+ if len_blob = 0 then return; end if;
+ ----------------------------------------
+ -- Check for B64_ENCODE_HEADER in in_BLOB
+ header_txt := to_char(dbms_lob.substr(in_blob
+ ,length(B64_ENCODE_HEADER)
+ ,1)
+ ,nls_charset_id('US7ASCII'));
+ if header_txt != B64_ENCODE_HEADER
+ then
+ raise_application_error(-20000, 'B64_ENCODE_HEADER missing from data: ' || header_txt);
+ end if;
+ ----------------------------------------
+ -- Create "L_BLOB" after removing B64_ENCODE_HEADER, Carriage Returns, and Line Feeds
+ ptr := 1 + length(B64_ENCODE_HEADER); -- Skip over the header
+ while ptr <= len_blob
+ loop
+ dbms_lob.append(l_blob
+ ,utl_raw.translate(dbms_lob.substr(in_blob
+ ,SPLIT_LEN
+ ,ptr)
+ ,hextoraw('000D0A') -- NULL, Carriage Return, Line Feed
+ ,hextoraw('00') ) ); -- NULL
+ ptr := ptr + SPLIT_LEN;
+ end loop;
+ len_blob := length(l_blob);
+ ----------------------------------------
+ -- Create "THE_BLOB" after Base64 Decoding
+ ptr := 1;
+ while ptr <= len_blob
+ loop
+ dbms_lob.append(the_blob
+ ,UTL_ENCODE.BASE64_DECODE(dbms_lob.substr(l_blob
+ ,SPLIT_LEN
+ ,ptr) ) );
+ ptr := ptr + SPLIT_LEN;
+ end loop;
+ end b64_decode;
+begin
+ dbms_lob.createtemporary(l_blob, true);
+ dbms_lob.createtemporary(the_blob, true);
+ for buff in (select ROWID RID, "TEMP_BLOB"
+ from "WTP"."WT_SELF_TEST"
+ for update of "TEMP_BLOB")
+ loop
+ b64_decode(buff."TEMP_BLOB");
+ -- This overwrites the Base64 Encoded String with the original binary data
+ update "WTP"."WT_SELF_TEST"
+ set "TEMP_BLOB" = the_blob
+ where rowid = buff.rid;
+ end loop;
+ dbms_lob.freetemporary(l_blob);
+ dbms_lob.freetemporary(the_blob);
+end;
+/
+
+commit;
+
diff --git a/wtptst/WTP/WT_SELF_TEST.csv b/wtptst/WTP/WT_SELF_TEST.csv
new file mode 100644
index 0000000..f0f6c77
--- /dev/null
+++ b/wtptst/WTP/WT_SELF_TEST.csv
@@ -0,0 +1,7134 @@
+"ID","TEMP_CLOB","TEMP_NCLOB","TEMP_XML","TEMP_BLOB"
+1,"
+
+ FPDS-NG search results for
+
+
+
+
+
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1625
+ DOLF072J11595
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2007-05-04 00:00:00
+ 2007-04-15 00:00:00
+ 2008-04-14 00:00:00
+ 2008-04-14 00:00:00
+
+ 12638.59
+ 12638.59
+ 12638.59
+
+ 0.00
+ 0.00
+ 0.00
+
+ 1625
+ BLSNO
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ XPERT FOR ORACLE ADMINISTRATION, PL/SQL DEVELOPMENT, TUNING MODULE, QUEST SQL OPTIMIZER.
+
+ N
+ X
+ N
+ X
+ N
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 541519
+ E
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 50000
+ DC
+ USA
+ 202120002
+ 00
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+ REYNOLDS.VANESSA@BLS.GOV
+ 2007-04-10 16:40:29
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+
+
+
+ 2016-02-16 13:10:16
+
+
+
+
+ 9100
+ EDCIO12O0009
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 107
+
+ 2012-05-11 00:00:00
+ 2012-05-11 00:00:00
+ 2012-09-30 00:00:00
+ 2013-06-30 00:00:00
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+ 9100
+ PO
+ 9100
+ EI
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ TOAD SOFTWARE SUPPORT RENEWAL. TOAD IS USED BY THE DEPARTMENT OF EDUCATION AS A PRIMARY SQL AND PL/SQL DEVELOPMENT TOOL. IT IS ALSO USED FOR PRODUCTION SUPPORT AND MANAGING ORACLE DATABASES.
+ N
+ X
+ N
+ X
+ N
+ X
+
+
+
+ 91
+ 0202
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 541519
+ C
+ E
+ USA
+ D
+
+
+ DLT SOLUTIONS, LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ VA
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 245
+ 775944576
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+ 786468199
+ DLT SOLUTIONS, LLC
+ 786468199
+ DLT SOLUTIONS LLC
+
+ O
+
+
+ DC
+ USA
+ 202020001
+ 00
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ N
+ X
+ N
+
+
+ KARL.L.FEHRMAN@ED.GOV
+ 2012-05-08 13:41:06
+ IDV_CORRECT
+ 2016-02-16 13:10:16
+ F
+ MICHAEL.HOLLOWAY@ED.GOV
+ 2012-05-11 10:13:31
+
+
+
+
+
+ 2016-09-15 10:37:14
+
+
+
+
+ 1549
+ DJF152600P0008877
+ 1
+ 0
+
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+
+ 0.00
+ 0.00
+ 0.00
+
+ 15000.00
+ 15000.00
+ 15000.00
+
+ 1549
+ PDS02
+ 1549
+ PDS02
+ X
+
+ 0.00
+
+ B
+ J
+ K
+ NONE
+ ""IGF::CL::IGF""
+
+
+
+
+THIS WILL BE AN ONLINE CLASS FOR 10 APPLICATION DEVELOPERS. EACH DEVELOPER WILL ACCESS THE TRAINING FROM EITHER A HOME COMPUTER OR ONE ON UNET. COURSE TOPICS INCLUDE SQL STATEMENT PROCESSING, PL/SQL TUNING, VIEWING THE EXECUTION PLAN, THE IMPORTANC
+ CL
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 15
+ 0200
+ 000
+ Y
+ 1
+
+ N
+ N
+ N
+ N
+
+ X
+
+ U012
+ D
+ 611420
+ C
+ A
+ USA
+ C
+
+
+ SKILLBUILDERS INC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+ false
+ RI
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 3
+ 800000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 213 ROBINSON ST
+ WAKEFIELD
+ RI
+ 028793590
+ USA
+ 4017836172
+ 4017830405
+ 02
+ 960084242
+ 02879
+
+ 960084242
+ SKILLBUILDERS INC
+ 960084242
+ SKILLBUILDERS INC
+
+ 2001-10-22 00:00:00
+ 2016-01-21 00:00:00
+ O
+
+
+ DC
+ USA
+ 205350001
+ 00
+
+ A
+ NP
+ NONE
+ NONE
+ 3
+ D
+ N
+ N
+ N
+ N
+
+ B
+
+ VLBANKS
+ 2015-10-30 13:34:40
+ VLBANKS
+ 2016-09-15 10:37:14
+ F
+ VLBANKS
+ 2016-09-15 10:37:14
+ VLBANKS
+ 2016-09-15 10:37:14
+ Y
+
+
+
+
+
+ 2015-06-11 17:40:38
+
+
+
+
+ 1344
+ DOC40PAPT1511219
+ 0
+ 0
+
+ 2015-06-09 00:00:00
+ 2015-06-09 00:00:00
+ 2016-06-08 00:00:00
+ 2016-06-08 00:00:00
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+ 1344
+ 000PA
+ 1344
+ 000PA
+ X
+
+ 0.00
+
+ B
+ J
+ NONE
+ LICENSE FOR SONARSOURCE PL/SQL
+ N
+ X
+ N
+ X
+ X
+
+
+
+ 13
+ 1006
+ 000
+ N
+ 1
+
+ Y
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 423430
+ C
+ A
+ E
+ USA
+ D
+
+
+ SHI INTERNATIONAL CORP.
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ NJ
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 2000
+ 6500000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 290 DAVIDSON AVE STE 101
+ SOMERSET
+ NJ
+ 088734179
+ USA
+ 8476031132
+ 12
+ 611429481
+ 08873
+
+ 611429481
+ SHI INTERNATIONAL CORP.
+ 611429481
+ SHI INTERNATIONAL CORP.
+
+ 2001-12-05 00:00:00
+ 2016-05-19 00:00:00
+ O
+
+
+ VA
+ USA
+ 223131450
+ 08
+
+ G
+ SP1
+ NONE
+ NONE
+ SP2
+ 1
+ D
+ N
+ N
+ X
+ N
+
+ B
+
+ PTOTBF
+ 2015-06-11 17:09:54
+ PTOTBF
+ 2015-06-11 17:40:38
+ F
+ PTOTBF
+ 2015-06-11 17:40:38
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD150147
+ 0
+ 0
+
+ 4732
+ GS06F0821Z
+ 0
+
+ 2015-06-03 00:00:00
+ 2015-06-03 00:00:00
+ 2019-07-05 00:00:00
+ 2019-07-05 00:00:00
+
+ 198000.00
+ 198000.00
+ 833580.00
+
+ 614790.00
+ 614790.00
+ 833580.00
+
+ 12H2
+ 32SB
+ 12H2
+ 31PE
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ THE PURPOSE OF THIS DELIVERY ORDER IS TO PURCHASE ORACLE PL/SQL PROGRAMMER (DATABASE ANALYST/PROGRAMMER-SENIOR) SERVICES IN ACCORDANCE WITH ATTACHED STATEMENT OF WORK DATED 6/1/2015.
+
+THIS AWARD IS AN OPTION YEAR CONTRACT. IT INCLUDES A BASE YEAR PLUS, THREE (3) ONE YEAR OPTION PERIODS. BASE YEAR PERIOD OF PERFORMANCE IS 7/6/2015 THROUGH 7/5/2016.
+
+IGF::CT::IGF
+ CT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 1400
+ N
+ 1
+
+ Y
+ X
+ N
+ X
+
+ X
+
+ D308
+ D
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+ APEXTECH LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 13
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 2200 WILSON BLVD
+ ARLINGTON
+ VA
+ 222013397
+ USA
+ 7032539722
+ 7035222037
+ 08
+ 126242150
+ 222013397
+
+ 126242150
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+ S
+
+
+ MD
+ USA
+ 207051003
+ 04
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+ B
+
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-05-21 14:03:35
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-06-03 13:17:36
+ N
+
+
+
+
+
+ 2017-11-29 23:36:42
+
+
+
+
+ 9700
+ M6738610P1027
+ 0
+ 0
+
+ 2010-05-18 00:00:00
+ 2010-05-18 00:00:00
+ 2010-06-17 00:00:00
+ 2010-06-17 00:00:00
+
+ 700.00
+ 700.00
+ 700.00
+
+ 700.00
+ 700.00
+ 700.00
+
+ 1700
+ M67386
+ 1700
+ M67386
+ X
+
+ 0.00
+
+ B
+ J
+ NONE
+ PL/SQL SOFTWARE DEVELOPER
+ N
+ N
+ X
+ N
+ X
+ Z
+ N
+ 1
+
+ Y
+ N
+ N
+ N
+
+ X
+
+ 7030
+ D
+ C9E
+ 423430
+ C
+ A
+ 000
+ A
+ A
+ USA
+ D
+
+
+ DILTEX INC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 4
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+ 14530 PACIFIC AVE
+ BALDWIN PARK
+ CA
+ 917065340
+ USA
+ 6269601314
+ 6269560615
+ 32
+ 969907914
+ 917065340
+
+ 969907914
+ DILTEX INC
+ 969907914
+ DILTEX INC
+
+ 2005-10-02 00:00:00
+ 2011-01-12 00:00:00
+ S
+
+
+ MO
+ USA
+ 641471208
+ 05
+
+ D
+ NP
+ SBA
+ NONE
+ 2
+ A
+ N
+ false
+ N
+ X
+ N
+ 0.00
+
+ B
+
+ JUDY.RUPARD.M67386@USMC.MIL
+ 2010-05-18 08:59:07
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ F
+ ANDREA.LEACH.M67386@USMC.MIL
+ 2010-05-18 10:04:12
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ Y
+
+
+
+
+
+ 2014-06-29 12:37:57
+
+
+
+
+ 1205
+ AG64WCP140083
+ 0
+ 0
+
+ 2014-06-29 00:00:00
+ 2014-06-27 00:00:00
+ 2015-06-30 00:00:00
+ 2015-06-30 00:00:00
+
+ 216.00
+ 216.00
+ 216.00
+
+ 216.00
+ 216.00
+ 216.00
+
+ 1205
+ 64WC
+ 12A7
+ 64WC
+ X
+
+ 0.00
+
+ B
+ J
+ PL SQL DEVELOPER SFTW RENEWAL
+ NONE
+ IGF::OT::IGF
+
+PL/SQL DEVELOPER LICENSES ANNUAL SERVICE CONTRACT - 6 USERS E-DOWNLOAD, PART RV1555 #5266.6
+
+WAIVER: FY14-RENEWAL R14318, CO-JADAMS, PURCHASE CARD, SOFTCHOICE
+ OT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 4609
+ Y
+ 1
+
+ N
+ N
+ N
+ N
+
+ X
+
+ D319
+ D
+ 541519
+ C
+ A
+ E
+ USA
+ C
+
+
+ SOFTCHOICE CORPORATION
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ NY
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 1200
+ 1000000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 314 W SUPERIOR ST STE 301
+ CHICAGO
+ IL
+ 606543538
+ USA
+ 7034801969
+ 7034801956
+ 07
+ 929022028
+ 606543538
+
+ 929022028
+ SOFTCHOICE CORPORATION
+ 248864415
+ SOFTCHOICE CORPORATION
+
+ 2003-02-06 00:00:00
+ 2015-02-03 00:00:00
+ O
+
+
+ MO
+ USA
+ 641143363
+ 05
+
+ F
+ SP1
+ NONE
+ NONE
+ 2
+ A
+ N
+ N
+ N
+ N
+
+ B
+
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:02:32
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+ F
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD170266
+ 0
+ 0
+
+ 4732
+ GS06F0821Z
+ PA0003ADDRESSCHG
+
+ 2017-09-22 00:00:00
+ 2017-09-22 00:00:00
+ 2019-09-28 00:00:00
+ 2019-09-28 00:00:00
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+ 12H2
+ 1232SB
+ 12H2
+ 12344P
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ IGF::OT::IGF
+ORACLE PL/SQL PROGRAMMERS
+ OT
+ N
+ X
+ D
+ N
+ X
+
+
+
+ 12
+ 1400
+ N
+ 1
+
+ Y
+ X
+ N
+ X
+
+ B
+ 40 U.S.C. 11302(E)
+
+ D308
+ H
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+ APEXTECH LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 13
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 2200 WILSON BLVD STE 810
+ ARLINGTON
+ VA
+ 222013361
+ USA
+ 7032539722
+ 7035222037
+ 08
+ 126242150
+ 222013397
+
+ 126242150
+ 3C7R1
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+ S
+
+
+ MD
+ USA
+ 207051003
+ 04
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-19 10:19:11
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-22 14:31:02
+ N
+
+
+
+
+
+ 2016-02-16 13:10:05
+
+
+
+
+ 9700
+ HQ042307F0009
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2006-10-01 00:00:00
+ 2006-10-01 00:00:00
+ 2007-09-30 00:00:00
+ 2007-09-30 00:00:00
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+ 97BZ
+ HQ0423
+ 97BZ
+ HQ0422
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ SQL NAVIGATOR FOR ORACLE SOFTWARE LICENSE MAINTENANCE RENEWAL; SQL NAVIGATOR FOR ORACLE XPERT TUNING MODULE SOFTWARE LICENSE MAINTENANCE RENEWAL; PL FORMAT OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; DEBUGGER OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; AND KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT SOFTWARE MAINTENANCE LICENSE RENEWAL
+ N
+ N
+ X
+ N
+ N
+ N
+ Z
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ D301
+ D
+ A7
+ 541519
+ 000
+ A
+ E
+ USA
+ C
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 16000
+ OH
+ USA
+ 441992055
+ 11
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ false
+ N
+ X
+ 0.00
+
+ B
+
+ LINDA.BARVINCHAK.HQ0423@DFAS.MIL
+ 2007-01-14 17:35:05
+ IDV_CORRECT
+ 2016-02-16 13:10:05
+ F
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1524
+ DJDEAEP070051D
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2007-04-25 00:00:00
+ 2007-04-25 00:00:00
+ 2007-09-30 00:00:00
+ 2008-09-29 00:00:00
+
+ 544.20
+ 544.20
+ 544.20
+
+ 544.20
+ 544.20
+ 544.20
+
+ 1524
+ DEAEP
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ RENEWAL OF SOFTWARE MAINTENANCE AND TECHNICAL SUPPORT FOR KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT. ESSENTIAL TO EIS SOFTWARE APPLICATION
+ N
+ X
+ N
+ N
+ N
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ D310
+ D
+ 541519
+ E
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 24000
+ TX
+ USA
+ 799088098
+ 16
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+ ELENA.A.BESAW@USDOJ.GOV
+ 2007-05-03 15:21:39
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+","
+
+ FPDS-NG search results for
+
+
+
+
+
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1625
+ DOLF072J11595
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2007-05-04 00:00:00
+ 2007-04-15 00:00:00
+ 2008-04-14 00:00:00
+ 2008-04-14 00:00:00
+
+ 12638.59
+ 12638.59
+ 12638.59
+
+ 0.00
+ 0.00
+ 0.00
+
+ 1625
+ BLSNO
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ XPERT FOR ORACLE ADMINISTRATION, PL/SQL DEVELOPMENT, TUNING MODULE, QUEST SQL OPTIMIZER.
+
+ N
+ X
+ N
+ X
+ N
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 541519
+ E
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 50000
+ DC
+ USA
+ 202120002
+ 00
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+ REYNOLDS.VANESSA@BLS.GOV
+ 2007-04-10 16:40:29
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+
+
+
+ 2016-02-16 13:10:16
+
+
+
+
+ 9100
+ EDCIO12O0009
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 107
+
+ 2012-05-11 00:00:00
+ 2012-05-11 00:00:00
+ 2012-09-30 00:00:00
+ 2013-06-30 00:00:00
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+ 9100
+ PO
+ 9100
+ EI
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ TOAD SOFTWARE SUPPORT RENEWAL. TOAD IS USED BY THE DEPARTMENT OF EDUCATION AS A PRIMARY SQL AND PL/SQL DEVELOPMENT TOOL. IT IS ALSO USED FOR PRODUCTION SUPPORT AND MANAGING ORACLE DATABASES.
+ N
+ X
+ N
+ X
+ N
+ X
+
+
+
+ 91
+ 0202
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 541519
+ C
+ E
+ USA
+ D
+
+
+ DLT SOLUTIONS, LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ VA
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 245
+ 775944576
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+ 786468199
+ DLT SOLUTIONS, LLC
+ 786468199
+ DLT SOLUTIONS LLC
+
+ O
+
+
+ DC
+ USA
+ 202020001
+ 00
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ N
+ X
+ N
+
+
+ KARL.L.FEHRMAN@ED.GOV
+ 2012-05-08 13:41:06
+ IDV_CORRECT
+ 2016-02-16 13:10:16
+ F
+ MICHAEL.HOLLOWAY@ED.GOV
+ 2012-05-11 10:13:31
+
+
+
+
+
+ 2016-09-15 10:37:14
+
+
+
+
+ 1549
+ DJF152600P0008877
+ 1
+ 0
+
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+
+ 0.00
+ 0.00
+ 0.00
+
+ 15000.00
+ 15000.00
+ 15000.00
+
+ 1549
+ PDS02
+ 1549
+ PDS02
+ X
+
+ 0.00
+
+ B
+ J
+ K
+ NONE
+ ""IGF::CL::IGF""
+
+
+
+
+THIS WILL BE AN ONLINE CLASS FOR 10 APPLICATION DEVELOPERS. EACH DEVELOPER WILL ACCESS THE TRAINING FROM EITHER A HOME COMPUTER OR ONE ON UNET. COURSE TOPICS INCLUDE SQL STATEMENT PROCESSING, PL/SQL TUNING, VIEWING THE EXECUTION PLAN, THE IMPORTANC
+ CL
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 15
+ 0200
+ 000
+ Y
+ 1
+
+ N
+ N
+ N
+ N
+
+ X
+
+ U012
+ D
+ 611420
+ C
+ A
+ USA
+ C
+
+
+ SKILLBUILDERS INC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+ false
+ RI
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 3
+ 800000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 213 ROBINSON ST
+ WAKEFIELD
+ RI
+ 028793590
+ USA
+ 4017836172
+ 4017830405
+ 02
+ 960084242
+ 02879
+
+ 960084242
+ SKILLBUILDERS INC
+ 960084242
+ SKILLBUILDERS INC
+
+ 2001-10-22 00:00:00
+ 2016-01-21 00:00:00
+ O
+
+
+ DC
+ USA
+ 205350001
+ 00
+
+ A
+ NP
+ NONE
+ NONE
+ 3
+ D
+ N
+ N
+ N
+ N
+
+ B
+
+ VLBANKS
+ 2015-10-30 13:34:40
+ VLBANKS
+ 2016-09-15 10:37:14
+ F
+ VLBANKS
+ 2016-09-15 10:37:14
+ VLBANKS
+ 2016-09-15 10:37:14
+ Y
+
+
+
+
+
+ 2015-06-11 17:40:38
+
+
+
+
+ 1344
+ DOC40PAPT1511219
+ 0
+ 0
+
+ 2015-06-09 00:00:00
+ 2015-06-09 00:00:00
+ 2016-06-08 00:00:00
+ 2016-06-08 00:00:00
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+ 1344
+ 000PA
+ 1344
+ 000PA
+ X
+
+ 0.00
+
+ B
+ J
+ NONE
+ LICENSE FOR SONARSOURCE PL/SQL
+ N
+ X
+ N
+ X
+ X
+
+
+
+ 13
+ 1006
+ 000
+ N
+ 1
+
+ Y
+ X
+ X
+ X
+
+ X
+
+ 7030
+ D
+ 423430
+ C
+ A
+ E
+ USA
+ D
+
+
+ SHI INTERNATIONAL CORP.
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ NJ
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 2000
+ 6500000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 290 DAVIDSON AVE STE 101
+ SOMERSET
+ NJ
+ 088734179
+ USA
+ 8476031132
+ 12
+ 611429481
+ 08873
+
+ 611429481
+ SHI INTERNATIONAL CORP.
+ 611429481
+ SHI INTERNATIONAL CORP.
+
+ 2001-12-05 00:00:00
+ 2016-05-19 00:00:00
+ O
+
+
+ VA
+ USA
+ 223131450
+ 08
+
+ G
+ SP1
+ NONE
+ NONE
+ SP2
+ 1
+ D
+ N
+ N
+ X
+ N
+
+ B
+
+ PTOTBF
+ 2015-06-11 17:09:54
+ PTOTBF
+ 2015-06-11 17:40:38
+ F
+ PTOTBF
+ 2015-06-11 17:40:38
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD150147
+ 0
+ 0
+
+ 4732
+ GS06F0821Z
+ 0
+
+ 2015-06-03 00:00:00
+ 2015-06-03 00:00:00
+ 2019-07-05 00:00:00
+ 2019-07-05 00:00:00
+
+ 198000.00
+ 198000.00
+ 833580.00
+
+ 614790.00
+ 614790.00
+ 833580.00
+
+ 12H2
+ 32SB
+ 12H2
+ 31PE
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ THE PURPOSE OF THIS DELIVERY ORDER IS TO PURCHASE ORACLE PL/SQL PROGRAMMER (DATABASE ANALYST/PROGRAMMER-SENIOR) SERVICES IN ACCORDANCE WITH ATTACHED STATEMENT OF WORK DATED 6/1/2015.
+
+THIS AWARD IS AN OPTION YEAR CONTRACT. IT INCLUDES A BASE YEAR PLUS, THREE (3) ONE YEAR OPTION PERIODS. BASE YEAR PERIOD OF PERFORMANCE IS 7/6/2015 THROUGH 7/5/2016.
+
+IGF::CT::IGF
+ CT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 1400
+ N
+ 1
+
+ Y
+ X
+ N
+ X
+
+ X
+
+ D308
+ D
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+ APEXTECH LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 13
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 2200 WILSON BLVD
+ ARLINGTON
+ VA
+ 222013397
+ USA
+ 7032539722
+ 7035222037
+ 08
+ 126242150
+ 222013397
+
+ 126242150
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+ S
+
+
+ MD
+ USA
+ 207051003
+ 04
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+ B
+
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-05-21 14:03:35
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-06-03 13:17:36
+ N
+
+
+
+
+
+ 2017-11-29 23:36:42
+
+
+
+
+ 9700
+ M6738610P1027
+ 0
+ 0
+
+ 2010-05-18 00:00:00
+ 2010-05-18 00:00:00
+ 2010-06-17 00:00:00
+ 2010-06-17 00:00:00
+
+ 700.00
+ 700.00
+ 700.00
+
+ 700.00
+ 700.00
+ 700.00
+
+ 1700
+ M67386
+ 1700
+ M67386
+ X
+
+ 0.00
+
+ B
+ J
+ NONE
+ PL/SQL SOFTWARE DEVELOPER
+ N
+ N
+ X
+ N
+ X
+ Z
+ N
+ 1
+
+ Y
+ N
+ N
+ N
+
+ X
+
+ 7030
+ D
+ C9E
+ 423430
+ C
+ A
+ 000
+ A
+ A
+ USA
+ D
+
+
+ DILTEX INC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 4
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+ 14530 PACIFIC AVE
+ BALDWIN PARK
+ CA
+ 917065340
+ USA
+ 6269601314
+ 6269560615
+ 32
+ 969907914
+ 917065340
+
+ 969907914
+ DILTEX INC
+ 969907914
+ DILTEX INC
+
+ 2005-10-02 00:00:00
+ 2011-01-12 00:00:00
+ S
+
+
+ MO
+ USA
+ 641471208
+ 05
+
+ D
+ NP
+ SBA
+ NONE
+ 2
+ A
+ N
+ false
+ N
+ X
+ N
+ 0.00
+
+ B
+
+ JUDY.RUPARD.M67386@USMC.MIL
+ 2010-05-18 08:59:07
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ F
+ ANDREA.LEACH.M67386@USMC.MIL
+ 2010-05-18 10:04:12
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ Y
+
+
+
+
+
+ 2014-06-29 12:37:57
+
+
+
+
+ 1205
+ AG64WCP140083
+ 0
+ 0
+
+ 2014-06-29 00:00:00
+ 2014-06-27 00:00:00
+ 2015-06-30 00:00:00
+ 2015-06-30 00:00:00
+
+ 216.00
+ 216.00
+ 216.00
+
+ 216.00
+ 216.00
+ 216.00
+
+ 1205
+ 64WC
+ 12A7
+ 64WC
+ X
+
+ 0.00
+
+ B
+ J
+ PL SQL DEVELOPER SFTW RENEWAL
+ NONE
+ IGF::OT::IGF
+
+PL/SQL DEVELOPER LICENSES ANNUAL SERVICE CONTRACT - 6 USERS E-DOWNLOAD, PART RV1555 #5266.6
+
+WAIVER: FY14-RENEWAL R14318, CO-JADAMS, PURCHASE CARD, SOFTCHOICE
+ OT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 4609
+ Y
+ 1
+
+ N
+ N
+ N
+ N
+
+ X
+
+ D319
+ D
+ 541519
+ C
+ A
+ E
+ USA
+ C
+
+
+ SOFTCHOICE CORPORATION
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ NY
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 1200
+ 1000000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 314 W SUPERIOR ST STE 301
+ CHICAGO
+ IL
+ 606543538
+ USA
+ 7034801969
+ 7034801956
+ 07
+ 929022028
+ 606543538
+
+ 929022028
+ SOFTCHOICE CORPORATION
+ 248864415
+ SOFTCHOICE CORPORATION
+
+ 2003-02-06 00:00:00
+ 2015-02-03 00:00:00
+ O
+
+
+ MO
+ USA
+ 641143363
+ 05
+
+ F
+ SP1
+ NONE
+ NONE
+ 2
+ A
+ N
+ N
+ N
+ N
+
+ B
+
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:02:32
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+ F
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD170266
+ 0
+ 0
+
+ 4732
+ GS06F0821Z
+ PA0003ADDRESSCHG
+
+ 2017-09-22 00:00:00
+ 2017-09-22 00:00:00
+ 2019-09-28 00:00:00
+ 2019-09-28 00:00:00
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+ 12H2
+ 1232SB
+ 12H2
+ 12344P
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ IGF::OT::IGF
+ORACLE PL/SQL PROGRAMMERS
+ OT
+ N
+ X
+ D
+ N
+ X
+
+
+
+ 12
+ 1400
+ N
+ 1
+
+ Y
+ X
+ N
+ X
+
+ B
+ 40 U.S.C. 11302(E)
+
+ D308
+ H
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+ APEXTECH LLC
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+ false
+ OTHER
+ 13
+ 2000000
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+ 2200 WILSON BLVD STE 810
+ ARLINGTON
+ VA
+ 222013361
+ USA
+ 7032539722
+ 7035222037
+ 08
+ 126242150
+ 222013397
+
+ 126242150
+ 3C7R1
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+ S
+
+
+ MD
+ USA
+ 207051003
+ 04
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-19 10:19:11
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-22 14:31:02
+ N
+
+
+
+
+
+ 2016-02-16 13:10:05
+
+
+
+
+ 9700
+ HQ042307F0009
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2006-10-01 00:00:00
+ 2006-10-01 00:00:00
+ 2007-09-30 00:00:00
+ 2007-09-30 00:00:00
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+ 97BZ
+ HQ0423
+ 97BZ
+ HQ0422
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ SQL NAVIGATOR FOR ORACLE SOFTWARE LICENSE MAINTENANCE RENEWAL; SQL NAVIGATOR FOR ORACLE XPERT TUNING MODULE SOFTWARE LICENSE MAINTENANCE RENEWAL; PL FORMAT OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; DEBUGGER OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; AND KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT SOFTWARE MAINTENANCE LICENSE RENEWAL
+ N
+ N
+ X
+ N
+ N
+ N
+ Z
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ D301
+ D
+ A7
+ 541519
+ 000
+ A
+ E
+ USA
+ C
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 16000
+ OH
+ USA
+ 441992055
+ 11
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ false
+ N
+ X
+ 0.00
+
+ B
+
+ LINDA.BARVINCHAK.HQ0423@DFAS.MIL
+ 2007-01-14 17:35:05
+ IDV_CORRECT
+ 2016-02-16 13:10:05
+ F
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1524
+ DJDEAEP070051D
+ 0
+ 0
+
+ 4730
+ GS35F4543G
+ 0
+
+ 2007-04-25 00:00:00
+ 2007-04-25 00:00:00
+ 2007-09-30 00:00:00
+ 2008-09-29 00:00:00
+
+ 544.20
+ 544.20
+ 544.20
+
+ 544.20
+ 544.20
+ 544.20
+
+ 1524
+ DEAEP
+ X
+
+ 0.00
+
+ C
+ J
+ NONE
+ X
+ RENEWAL OF SOFTWARE MAINTENANCE AND TECHNICAL SUPPORT FOR KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT. ESSENTIAL TO EIS SOFTWARE APPLICATION
+ N
+ X
+ N
+ N
+ N
+ N
+ 1
+
+ N
+ X
+ X
+ X
+
+ X
+
+ D310
+ D
+ 541519
+ E
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ 173
+ 26
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+ S
+
+
+ 24000
+ TX
+ USA
+ 799088098
+ 16
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+ ELENA.A.BESAW@USDOJ.GOV
+ 2007-05-03 15:21:39
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+","
+
+ FPDS-NG search results for
+
+
+
+
+
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1625
+ DOLF072J11595
+ 0
+ 0
+
+
+ 4730
+ GS35F4543G
+ 0
+
+
+
+ 2007-05-04 00:00:00
+ 2007-04-15 00:00:00
+ 2008-04-14 00:00:00
+ 2008-04-14 00:00:00
+
+
+ 12638.59
+ 12638.59
+ 12638.59
+
+
+ 0.00
+ 0.00
+ 0.00
+
+
+ 1625
+ BLSNO
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ X
+ XPERT FOR ORACLE ADMINISTRATION, PL/SQL DEVELOPMENT, TUNING MODULE, QUEST SQL OPTIMIZER.
+
+ N
+ X
+ N
+ X
+ N
+ N
+ 1
+
+
+ N
+ X
+ X
+ X
+
+ X
+
+
+ 7030
+ D
+ 541519
+ E
+
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ 173
+ 26
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+
+
+ S
+
+
+
+ 50000
+ DC
+ USA
+
+ 202120002
+ 00
+
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+
+ REYNOLDS.VANESSA@BLS.GOV
+ 2007-04-10 16:40:29
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+
+
+
+
+
+ 2016-02-16 13:10:16
+
+
+
+
+ 9100
+ EDCIO12O0009
+ 0
+ 0
+
+
+ 4730
+ GS35F4543G
+ 107
+
+
+
+ 2012-05-11 00:00:00
+ 2012-05-11 00:00:00
+ 2012-09-30 00:00:00
+ 2013-06-30 00:00:00
+
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+
+ 14168.16
+ 14168.16
+ 14168.16
+
+
+ 9100
+ PO
+ 9100
+ EI
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ TOAD SOFTWARE SUPPORT RENEWAL. TOAD IS USED BY THE DEPARTMENT OF EDUCATION AS A PRIMARY SQL AND PL/SQL DEVELOPMENT TOOL. IT IS ALSO USED FOR PRODUCTION SUPPORT AND MANAGING ORACLE DATABASES.
+ N
+ X
+ N
+ X
+ N
+ X
+
+
+
+ 91
+ 0202
+
+
+
+ N
+ 1
+
+
+ N
+ X
+ X
+ X
+
+ X
+
+
+ 7030
+ D
+ 541519
+ C
+ E
+ USA
+ D
+
+
+
+ DLT SOLUTIONS, LLC
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ true
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+
+ false
+ VA
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 245
+ 775944576
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+
+ 786468199
+ DLT SOLUTIONS, LLC
+ 786468199
+ DLT SOLUTIONS LLC
+
+
+
+ O
+
+
+
+ DC
+ USA
+
+ 202020001
+ 00
+
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ N
+ X
+ N
+
+
+
+ KARL.L.FEHRMAN@ED.GOV
+ 2012-05-08 13:41:06
+ IDV_CORRECT
+ 2016-02-16 13:10:16
+ F
+ MICHAEL.HOLLOWAY@ED.GOV
+ 2012-05-11 10:13:31
+
+
+
+
+
+
+
+ 2016-09-15 10:37:14
+
+
+
+
+ 1549
+ DJF152600P0008877
+ 1
+ 0
+
+
+
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+ 2015-10-30 00:00:00
+
+
+ 0.00
+ 0.00
+ 0.00
+
+
+ 15000.00
+ 15000.00
+ 15000.00
+
+
+ 1549
+ PDS02
+ 1549
+ PDS02
+ X
+
+
+ 0.00
+
+
+ B
+ J
+ K
+ NONE
+ "IGF::CL::IGF"
+
+
+
+
+THIS WILL BE AN ONLINE CLASS FOR 10 APPLICATION DEVELOPERS. EACH DEVELOPER WILL ACCESS THE TRAINING FROM EITHER A HOME COMPUTER OR ONE ON UNET. COURSE TOPICS INCLUDE SQL STATEMENT PROCESSING, PL/SQL TUNING, VIEWING THE EXECUTION PLAN, THE IMPORTANC
+ CL
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 15
+ 0200
+ 000
+
+
+
+ Y
+ 1
+
+
+ N
+ N
+ N
+ N
+
+ X
+
+
+ U012
+ D
+ 611420
+ C
+ A
+ USA
+ C
+
+
+
+ SKILLBUILDERS INC
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ true
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ RI
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 3
+ 800000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 213 ROBINSON ST
+ WAKEFIELD
+ RI
+ 028793590
+ USA
+ 4017836172
+ 4017830405
+ 02
+
+ 960084242
+ 02879
+
+ 960084242
+ SKILLBUILDERS INC
+ 960084242
+ SKILLBUILDERS INC
+
+
+ 2001-10-22 00:00:00
+ 2016-01-21 00:00:00
+
+
+ O
+
+
+
+ DC
+ USA
+
+ 205350001
+ 00
+
+
+ A
+ NP
+ NONE
+ NONE
+ 3
+ D
+ N
+ N
+ N
+ N
+
+
+ B
+
+
+ VLBANKS
+ 2015-10-30 13:34:40
+ VLBANKS
+ 2016-09-15 10:37:14
+ F
+ VLBANKS
+ 2016-09-15 10:37:14
+ VLBANKS
+ 2016-09-15 10:37:14
+ Y
+
+
+
+
+
+
+
+ 2015-06-11 17:40:38
+
+
+
+
+ 1344
+ DOC40PAPT1511219
+ 0
+ 0
+
+
+
+ 2015-06-09 00:00:00
+ 2015-06-09 00:00:00
+ 2016-06-08 00:00:00
+ 2016-06-08 00:00:00
+
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+
+ 4000.00
+ 4000.00
+ 4000.00
+
+
+ 1344
+ 000PA
+ 1344
+ 000PA
+ X
+
+
+ 0.00
+
+
+ B
+ J
+ NONE
+ LICENSE FOR SONARSOURCE PL/SQL
+ N
+ X
+ N
+ X
+ X
+
+
+
+ 13
+ 1006
+ 000
+
+
+
+ N
+ 1
+
+
+ Y
+ X
+ X
+ X
+
+ X
+
+
+ 7030
+ D
+ 423430
+ C
+ A
+ E
+ USA
+ D
+
+
+
+ SHI INTERNATIONAL CORP.
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ true
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ NJ
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 2000
+ 6500000000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 290 DAVIDSON AVE STE 101
+ SOMERSET
+ NJ
+ 088734179
+ USA
+ 8476031132
+ 12
+
+ 611429481
+ 08873
+
+ 611429481
+ SHI INTERNATIONAL CORP.
+ 611429481
+ SHI INTERNATIONAL CORP.
+
+
+ 2001-12-05 00:00:00
+ 2016-05-19 00:00:00
+
+
+ O
+
+
+
+ VA
+ USA
+
+ 223131450
+ 08
+
+
+ G
+ SP1
+ NONE
+ NONE
+ SP2
+ 1
+ D
+ N
+ N
+ X
+ N
+
+
+ B
+
+
+ PTOTBF
+ 2015-06-11 17:09:54
+ PTOTBF
+ 2015-06-11 17:40:38
+ F
+ PTOTBF
+ 2015-06-11 17:40:38
+
+
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD150147
+ 0
+ 0
+
+
+ 4732
+ GS06F0821Z
+ 0
+
+
+
+ 2015-06-03 00:00:00
+ 2015-06-03 00:00:00
+ 2019-07-05 00:00:00
+ 2019-07-05 00:00:00
+
+
+ 198000.00
+ 198000.00
+ 833580.00
+
+
+ 614790.00
+ 614790.00
+ 833580.00
+
+
+ 12H2
+ 32SB
+ 12H2
+ 31PE
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ THE PURPOSE OF THIS DELIVERY ORDER IS TO PURCHASE ORACLE PL/SQL PROGRAMMER (DATABASE ANALYST/PROGRAMMER-SENIOR) SERVICES IN ACCORDANCE WITH ATTACHED STATEMENT OF WORK DATED 6/1/2015.
+
+THIS AWARD IS AN OPTION YEAR CONTRACT. IT INCLUDES A BASE YEAR PLUS, THREE (3) ONE YEAR OPTION PERIODS. BASE YEAR PERIOD OF PERFORMANCE IS 7/6/2015 THROUGH 7/5/2016.
+
+IGF::CT::IGF
+ CT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 1400
+
+
+
+ N
+ 1
+
+
+ Y
+ X
+ N
+ X
+
+ X
+
+
+ D308
+ D
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+
+ APEXTECH LLC
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+
+ false
+ OTHER
+ 13
+ 2000000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+
+ 2200 WILSON BLVD
+ ARLINGTON
+ VA
+ 222013397
+ USA
+ 7032539722
+ 7035222037
+ 08
+
+ 126242150
+ 222013397
+
+ 126242150
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+
+
+ S
+
+
+
+ MD
+ USA
+
+ 207051003
+ 04
+
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+
+ B
+
+
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-05-21 14:03:35
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ JESSICA.MASSEY@ARS.USDA.GOV
+ 2015-06-03 13:17:36
+ N
+
+
+
+
+
+
+
+ 2017-11-29 23:36:42
+
+
+
+
+ 9700
+ M6738610P1027
+ 0
+ 0
+
+
+
+ 2010-05-18 00:00:00
+ 2010-05-18 00:00:00
+ 2010-06-17 00:00:00
+ 2010-06-17 00:00:00
+
+
+ 700.00
+ 700.00
+ 700.00
+
+
+ 700.00
+ 700.00
+ 700.00
+
+
+ 1700
+ M67386
+ 1700
+ M67386
+ X
+
+
+ 0.00
+
+
+ B
+ J
+ NONE
+ PL/SQL SOFTWARE DEVELOPER
+ N
+ N
+ X
+ N
+ X
+ Z
+ N
+ 1
+
+
+ Y
+ N
+ N
+ N
+
+ X
+
+
+ 7030
+ D
+ C9E
+ 423430
+ C
+ A
+ 000
+ A
+ A
+ USA
+ D
+
+
+
+ DILTEX INC
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ OTHER
+ 4
+ 2000000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+
+ 14530 PACIFIC AVE
+ BALDWIN PARK
+ CA
+ 917065340
+ USA
+ 6269601314
+ 6269560615
+ 32
+
+ 969907914
+ 917065340
+
+ 969907914
+ DILTEX INC
+ 969907914
+ DILTEX INC
+
+
+ 2005-10-02 00:00:00
+ 2011-01-12 00:00:00
+
+
+ S
+
+
+
+ MO
+ USA
+
+ 641471208
+ 05
+
+
+ D
+ NP
+ SBA
+ NONE
+ 2
+ A
+ N
+ false
+ N
+ X
+ N
+ 0.00
+
+
+ B
+
+
+ JUDY.RUPARD.M67386@USMC.MIL
+ 2010-05-18 08:59:07
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ F
+ ANDREA.LEACH.M67386@USMC.MIL
+ 2010-05-18 10:04:12
+ DOD_CLOSEOUT
+ 2017-11-29 23:36:42
+ Y
+
+
+
+
+
+
+
+ 2014-06-29 12:37:57
+
+
+
+
+ 1205
+ AG64WCP140083
+ 0
+ 0
+
+
+
+ 2014-06-29 00:00:00
+ 2014-06-27 00:00:00
+ 2015-06-30 00:00:00
+ 2015-06-30 00:00:00
+
+
+ 216.00
+ 216.00
+ 216.00
+
+
+ 216.00
+ 216.00
+ 216.00
+
+
+ 1205
+ 64WC
+ 12A7
+ 64WC
+ X
+
+
+ 0.00
+
+
+ B
+ J
+ PL SQL DEVELOPER SFTW RENEWAL
+ NONE
+ IGF::OT::IGF
+
+PL/SQL DEVELOPER LICENSES ANNUAL SERVICE CONTRACT - 6 USERS E-DOWNLOAD, PART RV1555 #5266.6
+
+WAIVER: FY14-RENEWAL R14318, CO-JADAMS, PURCHASE CARD, SOFTCHOICE
+ OT
+ N
+ X
+ N
+ N
+ X
+
+
+
+ 12
+ 4609
+
+
+
+ Y
+ 1
+
+
+ N
+ N
+ N
+ N
+
+ X
+
+
+ D319
+ D
+ 541519
+ C
+ A
+ E
+ USA
+ C
+
+
+
+ SOFTCHOICE CORPORATION
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ true
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+ true
+ false
+ false
+
+ false
+ NY
+ USA
+ CORPORATE NOT TAX EXEMPT
+ 1200
+ 1000000000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 314 W SUPERIOR ST STE 301
+ CHICAGO
+ IL
+ 606543538
+ USA
+ 7034801969
+ 7034801956
+ 07
+
+ 929022028
+ 606543538
+
+ 929022028
+ SOFTCHOICE CORPORATION
+ 248864415
+ SOFTCHOICE CORPORATION
+
+
+ 2003-02-06 00:00:00
+ 2015-02-03 00:00:00
+
+
+ O
+
+
+
+ MO
+ USA
+
+ 641143363
+ 05
+
+
+ F
+ SP1
+ NONE
+ NONE
+ 2
+ A
+ N
+ N
+ N
+ N
+
+
+ B
+
+
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:02:32
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+ F
+ JENNIFER.ADAMS@USDA.GOV
+ 2014-06-29 12:37:57
+
+
+
+
+
+
+
+ 2017-10-04 14:20:48
+
+
+
+
+ 12H2
+ AG32SBD170266
+ 0
+ 0
+
+
+ 4732
+ GS06F0821Z
+ PA0003ADDRESSCHG
+
+
+
+ 2017-09-22 00:00:00
+ 2017-09-22 00:00:00
+ 2019-09-28 00:00:00
+ 2019-09-28 00:00:00
+
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+
+ 211860.00
+ 211860.00
+ 430650.00
+
+
+ 12H2
+ 1232SB
+ 12H2
+ 12344P
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ IGF::OT::IGF
+ORACLE PL/SQL PROGRAMMERS
+ OT
+ N
+ X
+ D
+ N
+ X
+
+
+
+ 12
+ 1400
+
+
+
+ N
+ 1
+
+
+ Y
+ X
+ N
+ X
+
+ B
+ 40 U.S.C. 11302(E)
+
+
+ D308
+ H
+ 541512
+ C
+ A
+ E
+ USA
+ C
+
+
+
+ APEXTECH LLC
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ true
+ false
+
+ true
+ false
+ false
+
+ false
+ OTHER
+ 13
+ 2000000
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+
+
+ 2200 WILSON BLVD STE 810
+ ARLINGTON
+ VA
+ 222013361
+ USA
+ 7032539722
+ 7035222037
+ 08
+
+ 126242150
+ 222013397
+
+ 126242150
+ 3C7R1
+ APEXTECH LLC
+ 126242150
+ APEXTECH LLC
+
+
+ 2003-01-15 00:00:00
+ 2014-07-31 00:00:00
+
+
+ S
+
+
+
+ MD
+ USA
+
+ 207051003
+ 04
+
+
+ D
+ MAFO
+ 8A
+ NONE
+ OSA
+ A
+ N
+ N
+ Y
+ N
+
+
+
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-19 10:19:11
+ IDV_CORRECT
+ 2017-10-04 14:20:48
+ F
+ PAUL.MERRITT@ARS.USDA.GOV
+ 2017-09-22 14:31:02
+ N
+
+
+
+
+
+
+
+ 2016-02-16 13:10:05
+
+
+
+
+ 9700
+ HQ042307F0009
+ 0
+ 0
+
+
+ 4730
+ GS35F4543G
+ 0
+
+
+
+ 2006-10-01 00:00:00
+ 2006-10-01 00:00:00
+ 2007-09-30 00:00:00
+ 2007-09-30 00:00:00
+
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+
+ 3199.00
+ 3199.00
+ 3199.00
+
+
+ 97BZ
+ HQ0423
+ 97BZ
+ HQ0422
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ X
+ SQL NAVIGATOR FOR ORACLE SOFTWARE LICENSE MAINTENANCE RENEWAL; SQL NAVIGATOR FOR ORACLE XPERT TUNING MODULE SOFTWARE LICENSE MAINTENANCE RENEWAL; PL FORMAT OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; DEBUGGER OPTION FOR SQL NAVIGATOR SOFTWARE LICENSE MAINTENANCE RENEWAL; AND KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT SOFTWARE MAINTENANCE LICENSE RENEWAL
+ N
+ N
+ X
+ N
+ N
+ N
+ Z
+ N
+ 1
+
+
+ N
+ X
+ X
+ X
+
+ X
+
+
+ D301
+ D
+ A7
+ 541519
+ 000
+ A
+ E
+ USA
+ C
+
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ 173
+ 26
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+
+
+ S
+
+
+
+ 16000
+ OH
+ USA
+
+ 441992055
+ 11
+
+
+ A
+ MAFO
+ NONE
+ NONE
+ FAIR
+ 1
+ A
+ N
+ false
+ N
+ X
+ 0.00
+
+
+ B
+
+
+ LINDA.BARVINCHAK.HQ0423@DFAS.MIL
+ 2007-01-14 17:35:05
+ IDV_CORRECT
+ 2016-02-16 13:10:05
+ F
+
+
+
+
+
+
+
+ 2016-02-16 13:10:02
+
+
+
+
+ 1524
+ DJDEAEP070051D
+ 0
+ 0
+
+
+ 4730
+ GS35F4543G
+ 0
+
+
+
+ 2007-04-25 00:00:00
+ 2007-04-25 00:00:00
+ 2007-09-30 00:00:00
+ 2008-09-29 00:00:00
+
+
+ 544.20
+ 544.20
+ 544.20
+
+
+ 544.20
+ 544.20
+ 544.20
+
+
+ 1524
+ DEAEP
+ X
+
+
+ 0.00
+
+
+ C
+ J
+ NONE
+ X
+ RENEWAL OF SOFTWARE MAINTENANCE AND TECHNICAL SUPPORT FOR KNOWLEDGE XPERT FOR PL/SQL DEVELOPMENT. ESSENTIAL TO EIS SOFTWARE APPLICATION
+ N
+ X
+ N
+ N
+ N
+ N
+ 1
+
+
+ N
+ X
+ X
+ X
+
+ X
+
+
+ D310
+ D
+ 541519
+ E
+
+
+
+ DLT SOLUTIONS INCORPORATED
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+ false
+ false
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+
+ false
+ false
+ false
+
+ false
+ 173
+ 26
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+ 13861 SUNRISE VALLEY DR STE 400
+ HERNDON
+ VA
+ 201716126
+ USA
+ 10
+
+ 7864681990000PR
+ 201716126
+
+ 786468199
+ DLT SOLUTIONS INCORPORATED
+ 786468199
+ DLT SOLUTIONS LLC
+
+
+ 2002-03-14 00:00:00
+ 2008-11-16 00:00:00
+
+
+ S
+
+
+
+ 24000
+ TX
+ USA
+
+ 799088098
+ 16
+
+
+ SP1
+ NONE
+ NONE
+ 1
+ A
+ N
+ false
+ N
+ X
+
+
+
+ ELENA.A.BESAW@USDOJ.GOV
+ 2007-05-03 15:21:39
+ IDV_CORRECT
+ 2016-02-16 13:10:02
+ F
+
+
+
+
+
+","(Base64 with Linefeeds)
+PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGZlZWQgeG1s
bnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSI+CiAgPHRpdGxlPkZQRFMt
Tkcgc2VhcmNoIHJlc3VsdHMgZm9yPCFbQ0RBVEFbOiBwbC9zcWxdXT48L3RpdGxl
PgogIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiIGhyZWY9
Imh0dHBzOi8vd3d3LmZwZHMuZ292L2V6c2VhcmNoL3NlYXJjaC5kbz9zPUZQRFMm
YW1wO2luZGV4TmFtZT1hd2FyZGZ1bGwmYW1wO3RlbXBsYXRlTmFtZT0xLjUuMSZh
bXA7cT1wbCUyRnNxbCZhbXA7c3RhcnQ9MCI+PC9saW5rPgogIDxsaW5rIHJlbD0i
bGFzdCIgdHlwZT0idGV4dC9odG1sIiBocmVmPSJodHRwczovL3d3dy5mcGRzLmdv
di9lenNlYXJjaC9GRUVEUy9BVE9NP3M9RlBEUyZhbXA7RkVFRE5BTUU9UFVCTElD
JmFtcDtWRVJTSU9OPTEuNS4xJmFtcDtxPXBsJTJGc3FsJmFtcDtzdGFydD0yMCI+
PC9saW5rPgogIDxsaW5rIHJlbD0ibmV4dCIgdHlwZT0idGV4dC9odG1sIiBocmVm
PSJodHRwczovL3d3dy5mcGRzLmdvdi9lenNlYXJjaC9GRUVEUy9BVE9NP3M9RlBE
UyZhbXA7RkVFRE5BTUU9UFVCTElDJmFtcDtWRVJTSU9OPTEuNS4xJmFtcDtxPXBs
JTJGc3FsJmFtcDtzdGFydD0xMCI+PC9saW5rPgogIDxtb2RpZmllZC8+CiAgPGF1
dGhvcj4KICAgIDxuYW1lLz4KICA8L2F1dGhvcj4KICA8ZW50cnk+CiAgICA8dGl0
bGU+PCFbQ0RBVEFbTmV3IERFTElWRVJZIE9SREVSIERPTEYwNzJKMTE1OTUgYXdh
cmRlZCB0byBETFQgU09MVVRJT05TIElOQ09SUE9SQVRFRCBmb3IgdGhlIGFtb3Vu
dCBvZiAkMTIsNjM4LjU5XV0+PC90aXRsZT4KICAgIDxsaW5rIHJlbD0iYWx0ZXJu
YXRlIiB0eXBlPSJ0ZXh0L2h0bWwiIGhyZWY9Imh0dHBzOi8vd3d3LmZwZHMuZ292
L2V6c2VhcmNoL3NlYXJjaC5kbz9zPUZQRFMmYW1wO2luZGV4TmFtZT1hd2FyZGZ1
bGwmYW1wO3RlbXBsYXRlTmFtZT0xLjUuMSZhbXA7cT1ET0xGMDcySjExNTk1KzE2
MjUrIj48L2xpbms+CiAgICA8bW9kaWZpZWQ+MjAxNi0wMi0xNiAxMzoxMDowMjwv
bW9kaWZpZWQ+CiAgICA8Y29udGVudCB4bWxuczpuczE9Imh0dHBzOi8vd3d3LmZw
ZHMuZ292L0ZQRFMiIHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+CiAgICAgIDxuczE6
YXdhcmQgeG1sbnM6bnMxPSJodHRwOi8vd3d3LmZwZHNuZy5jb20vRlBEUyIgdmVy
c2lvbj0iMS4yIj4KICAgICAgICA8bnMxOmF3YXJkSUQ+CiAgICAgICAgICA8bnMx
OmF3YXJkQ29udHJhY3RJRD4KICAgICAgICAgICAgPG5zMTphZ2VuY3lJRCBuYW1l
PSJCVVJFQVUgT0YgTEFCT1IgU1RBVElTVElDUyI+MTYyNTwvbnMxOmFnZW5jeUlE
PgogICAgICAgICAgICA8bnMxOlBJSUQ+RE9MRjA3MkoxMTU5NTwvbnMxOlBJSUQ+
CiAgICAgICAgICAgIDxuczE6bW9kTnVtYmVyPjA8L25zMTptb2ROdW1iZXI+CiAg
ICAgICAgICAgIDxuczE6dHJhbnNhY3Rpb25OdW1iZXI+MDwvbnMxOnRyYW5zYWN0
aW9uTnVtYmVyPjwvbnMxOmF3YXJkQ29udHJhY3RJRD4KICAgICAgICAgIDxuczE6
cmVmZXJlbmNlZElEVklEPgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9
IkZFREVSQUwgQUNRVUlTSVRJT04gU0VSVklDRSI+NDczMDwvbnMxOmFnZW5jeUlE
PgogICAgICAgICAgICA8bnMxOlBJSUQ+R1MzNUY0NTQzRzwvbnMxOlBJSUQ+CiAg
ICAgICAgICAgIDxuczE6bW9kTnVtYmVyPjA8L25zMTptb2ROdW1iZXI+PC9uczE6
cmVmZXJlbmNlZElEVklEPjwvbnMxOmF3YXJkSUQ+CiAgICAgICAgPG5zMTpyZWxl
dmFudENvbnRyYWN0RGF0ZXM+CiAgICAgICAgICA8bnMxOnNpZ25lZERhdGU+MjAw
Ny0wNS0wNCAwMDowMDowMDwvbnMxOnNpZ25lZERhdGU+CiAgICAgICAgICA8bnMx
OmVmZmVjdGl2ZURhdGU+MjAwNy0wNC0xNSAwMDowMDowMDwvbnMxOmVmZmVjdGl2
ZURhdGU+CiAgICAgICAgICA8bnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4yMDA4
LTA0LTE0IDAwOjAwOjAwPC9uczE6Y3VycmVudENvbXBsZXRpb25EYXRlPgogICAg
ICAgICAgPG5zMTp1bHRpbWF0ZUNvbXBsZXRpb25EYXRlPjIwMDgtMDQtMTQgMDA6
MDA6MDA8L25zMTp1bHRpbWF0ZUNvbXBsZXRpb25EYXRlPjwvbnMxOnJlbGV2YW50
Q29udHJhY3REYXRlcz4KICAgICAgICA8bnMxOmRvbGxhclZhbHVlcz4KICAgICAg
ICAgIDxuczE6b2JsaWdhdGVkQW1vdW50PjEyNjM4LjU5PC9uczE6b2JsaWdhdGVk
QW1vdW50PgogICAgICAgICAgPG5zMTpiYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1Zh
bHVlPjEyNjM4LjU5PC9uczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4K
ICAgICAgICAgIDxuczE6YmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT4xMjYzOC41OTwv
bnMxOmJhc2VBbmRBbGxPcHRpb25zVmFsdWU+PC9uczE6ZG9sbGFyVmFsdWVzPgog
ICAgICAgIDxuczE6dG90YWxEb2xsYXJWYWx1ZXM+CiAgICAgICAgICA8bnMxOnRv
dGFsT2JsaWdhdGVkQW1vdW50PjAuMDA8L25zMTp0b3RhbE9ibGlnYXRlZEFtb3Vu
dD4KICAgICAgICAgIDxuczE6dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1Zh
bHVlPjAuMDA8L25zMTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+
CiAgICAgICAgICA8bnMxOnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT4wLjAw
PC9uczE6dG90YWxCYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjwvbnMxOnRvdGFsRG9s
bGFyVmFsdWVzPgogICAgICAgIDxuczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAg
ICAgICAgICA8bnMxOmNvbnRyYWN0aW5nT2ZmaWNlQWdlbmN5SUQgbmFtZT0iQlVS
RUFVIE9GIExBQk9SIFNUQVRJU1RJQ1MiIGRlcGFydG1lbnRJRD0iMTYwMCIgZGVw
YXJ0bWVudE5hbWU9IkxBQk9SLCBERVBBUlRNRU5UIE9GIj4xNjI1PC9uczE6Y29u
dHJhY3RpbmdPZmZpY2VBZ2VuY3lJRD4KICAgICAgICAgIDxuczE6Y29udHJhY3Rp
bmdPZmZpY2VJRCBuYW1lPSJCVVJFQVUgT0YgTEFCT1IgU1RBVElTVElDUyBQVVJD
SEFTSU5HIiBjb3VudHJ5PSJVU0EiPkJMU05PPC9uczE6Y29udHJhY3RpbmdPZmZp
Y2VJRD4KICAgICAgICAgIDxuczE6Zm9yZWlnbkZ1bmRpbmcgZGVzY3JpcHRpb249
Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6Zm9yZWlnbkZ1bmRpbmc+PC9uczE6cHVy
Y2hhc2VySW5mb3JtYXRpb24+CiAgICAgICAgPG5zMTpjb250cmFjdE1hcmtldGlu
Z0RhdGE+CiAgICAgICAgICA8bnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZpY2U+MC4w
MDwvbnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZpY2U+PC9uczE6Y29udHJhY3RNYXJr
ZXRpbmdEYXRhPgogICAgICAgIDxuczE6Y29udHJhY3REYXRhPgogICAgICAgICAg
PG5zMTpjb250cmFjdEFjdGlvblR5cGUgZGVzY3JpcHRpb249IkRFTElWRVJZIE9S
REVSIj5DPC9uczE6Y29udHJhY3RBY3Rpb25UeXBlPgogICAgICAgICAgPG5zMTp0
eXBlT2ZDb250cmFjdFByaWNpbmcgZGVzY3JpcHRpb249IkZJWEVEIFBSSUNFIj5K
PC9uczE6dHlwZU9mQ29udHJhY3RQcmljaW5nPgogICAgICAgICAgPG5zMTpuYXRp
b25hbEludGVyZXN0QWN0aW9uQ29kZSBkZXNjcmlwdGlvbj0iTk9ORSI+Tk9ORTwv
bnMxOm5hdGlvbmFsSW50ZXJlc3RBY3Rpb25Db2RlPgogICAgICAgICAgPG5zMTpj
b3N0QWNjb3VudGluZ1N0YW5kYXJkc0NsYXVzZSBkZXNjcmlwdGlvbj0iTk9UIEFQ
UExJQ0FCTEUgRVhFTVBUIEZST00gQ0FTIj5YPC9uczE6Y29zdEFjY291bnRpbmdT
dGFuZGFyZHNDbGF1c2U+CiAgICAgICAgICA8bnMxOmRlc2NyaXB0aW9uT2ZDb250
cmFjdFJlcXVpcmVtZW50PlhQRVJUIEZPUiBPUkFDTEUgQURNSU5JU1RSQVRJT04s
IFBML1NRTCBERVZFTE9QTUVOVCwgVFVOSU5HIE1PRFVMRSwgUVVFU1QgU1FMIE9Q
VElNSVpFUi4KPC9uczE6ZGVzY3JpcHRpb25PZkNvbnRyYWN0UmVxdWlyZW1lbnQ+
CiAgICAgICAgICA8bnMxOkdGRS1HRlAgZGVzY3JpcHRpb249IlRyYW5zYWN0aW9u
IGRvZXMgbm90IHVzZSBHRkUvR0ZQIj5OPC9uczE6R0ZFLUdGUD4KICAgICAgICAg
IDxuczE6dW5kZWZpbml0aXplZEFjdGlvbiBkZXNjcmlwdGlvbj0iTk8iPlg8L25z
MTp1bmRlZmluaXRpemVkQWN0aW9uPgogICAgICAgICAgPG5zMTpjb25zb2xpZGF0
ZWRDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb25zb2xpZGF0ZWRD
b250cmFjdD4KICAgICAgICAgIDxuczE6cGVyZm9ybWFuY2VCYXNlZFNlcnZpY2VD
b250cmFjdCBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8L25zMTpwZXJm
b3JtYW5jZUJhc2VkU2VydmljZUNvbnRyYWN0PgogICAgICAgICAgPG5zMTptdWx0
aVllYXJDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTptdWx0aVllYXJD
b250cmFjdD4KICAgICAgICAgIDxuczE6cHVyY2hhc2VDYXJkQXNQYXltZW50TWV0
aG9kIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOnB1cmNoYXNlQ2FyZEFzUGF5bWVu
dE1ldGhvZD4KICAgICAgICAgIDxuczE6bnVtYmVyT2ZBY3Rpb25zPjE8L25zMTpu
dW1iZXJPZkFjdGlvbnM+PC9uczE6Y29udHJhY3REYXRhPgogICAgICAgIDxuczE6
bGVnaXNsYXRpdmVNYW5kYXRlcz4KICAgICAgICAgIDxuczE6Q2xpbmdlckNvaGVu
QWN0IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOkNsaW5nZXJDb2hlbkFjdD4KICAg
ICAgICAgIDxuczE6bWF0ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudCBk
ZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8L25zMTptYXRlcmlhbHNTdXBw
bGllc0FydGljbGVzRXF1aXBtZW50PgogICAgICAgICAgPG5zMTpsYWJvclN0YW5k
YXJkcyBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8L25zMTpsYWJvclN0
YW5kYXJkcz4KICAgICAgICAgIDxuczE6Y29uc3RydWN0aW9uV2FnZVJhdGVSZXF1
aXJlbWVudHMgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6Y29u
c3RydWN0aW9uV2FnZVJhdGVSZXF1aXJlbWVudHM+CiAgICAgICAgICA8bnMxOmxp
c3RPZkFkZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+PC9uczE6bGlzdE9mQWRkaXRp
b25hbFJlcG9ydGluZ1ZhbHVlcz4KICAgICAgICAgIDxuczE6aW50ZXJhZ2VuY3lD
b250cmFjdGluZ0F1dGhvcml0eSBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUi
Plg8L25zMTppbnRlcmFnZW5jeUNvbnRyYWN0aW5nQXV0aG9yaXR5PjwvbnMxOmxl
Z2lzbGF0aXZlTWFuZGF0ZXM+CiAgICAgICAgPG5zMTpwcm9kdWN0T3JTZXJ2aWNl
SW5mb3JtYXRpb24+CiAgICAgICAgICA8bnMxOnByb2R1Y3RPclNlcnZpY2VDb2Rl
IGRlc2NyaXB0aW9uPSJBRFAgU09GVFdBUkUiIHByb2R1Y3RPclNlcnZpY2VUeXBl
PSJQUk9EVUNUIj43MDMwPC9uczE6cHJvZHVjdE9yU2VydmljZUNvZGU+CiAgICAg
ICAgICA8bnMxOmNvbnRyYWN0QnVuZGxpbmcgZGVzY3JpcHRpb249Ik5PVCBBIEJV
TkRMRUQgUkVRVUlSRU1FTlQiPkQ8L25zMTpjb250cmFjdEJ1bmRsaW5nPgogICAg
ICAgICAgPG5zMTpwcmluY2lwYWxOQUlDU0NvZGUgZGVzY3JpcHRpb249Ik9USEVS
IENPTVBVVEVSIFJFTEFURUQgU0VSVklDRVMiPjU0MTUxOTwvbnMxOnByaW5jaXBh
bE5BSUNTQ29kZT4KICAgICAgICAgIDxuczE6dXNlT2ZFUEFEZXNpZ25hdGVkUHJv
ZHVjdHMgZGVzY3JpcHRpb249Ik5PVCBSRVFVSVJFRCI+RTwvbnMxOnVzZU9mRVBB
RGVzaWduYXRlZFByb2R1Y3RzPjwvbnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1h
dGlvbj4KICAgICAgICA8bnMxOnZlbmRvcj4KICAgICAgICAgIDxuczE6dmVuZG9y
SGVhZGVyPgogICAgICAgICAgICA8bnMxOnZlbmRvck5hbWU+RExUIFNPTFVUSU9O
UyBJTkNPUlBPUkFURUQ8L25zMTp2ZW5kb3JOYW1lPjwvbnMxOnZlbmRvckhlYWRl
cj4KICAgICAgICAgIDxuczE6dmVuZG9yU2l0ZURldGFpbHM+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yU29jaW9FY29ub21pY0luZGljYXRvcnM+CiAgICAgICAgICAg
ICAgPG5zMTppc0FsYXNrYW5OYXRpdmVPd25lZENvcnBvcmF0aW9uT3JGaXJtPmZh
bHNlPC9uczE6aXNBbGFza2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT4K
ICAgICAgICAgICAgICA8bnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD5mYWxzZTwv
bnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOmlz
SW5kaWFuVHJpYmU+ZmFsc2U8L25zMTppc0luZGlhblRyaWJlPgogICAgICAgICAg
ICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JGaXJt
PmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JG
aXJtPgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxseU93bmVkRmlybT5mYWxz
ZTwvbnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+CiAgICAgICAgICAgICAgPG5zMTpp
c1ZldGVyYW5Pd25lZD5mYWxzZTwvbnMxOmlzVmV0ZXJhbk93bmVkPgogICAgICAg
ICAgICAgIDxuczE6aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVk
QnVzaW5lc3M+ZmFsc2U8L25zMTppc1NlcnZpY2VSZWxhdGVkRGlzYWJsZWRWZXRl
cmFuT3duZWRCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzV29tZW5Pd25l
ZD5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOm1p
bm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTWlub3JpdHlPd25l
ZD5mYWxzZTwvbnMxOmlzTWlub3JpdHlPd25lZD4KICAgICAgICAgICAgICAgIDxu
czE6aXNTdWJDb250aW5lbnRBc2lhbkFtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzU3ViQ29udGluZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+
CiAgICAgICAgICAgICAgICA8bnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNBc2lhblBhY2lmaWNBbWVyaWNhbk93bmVk
QnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzQmxhY2tBbWVyaWNhbk93
bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2lu
ZXNzPgogICAgICAgICAgICAgICAgPG5zMTppc0hpc3BhbmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVBbWVyaWNhbk93bmVk
QnVzaW5lc3M+ZmFsc2U8L25zMTppc05hdGl2ZUFtZXJpY2FuT3duZWRCdXNpbmVz
cz4KICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+ZmFs
c2U8L25zMTppc090aGVyTWlub3JpdHlPd25lZD48L25zMTptaW5vcml0eU93bmVk
PgogICAgICAgICAgICAgIDxuczE6aXNWZXJ5U21hbGxCdXNpbmVzcz5mYWxzZTwv
bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dv
bWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzRWNvbm9taWNhbGx5RGlz
YWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNF
Y29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+
CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZVdvbWVuT3duZWRTbWFs
bEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzSm9pbnRWZW50dXJlRWNv
bm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZh
bHNlPC9uczE6aXNKb2ludFZlbnR1cmVFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2Vk
V29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+PC9uczE6dmVuZG9yU29jaW9FY29ub21p
Y0luZGljYXRvcnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQnVzaW5lc3NUeXBl
cz4KICAgICAgICAgICAgICA8bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcGVkQ29ycG9y
YXRpb25Pd25lZEZpcm0+ZmFsc2U8L25zMTppc0NvbW11bml0eURldmVsb3BlZENv
cnBvcmF0aW9uT3duZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNMYWJvclN1
cnBsdXNBcmVhRmlybT5mYWxzZTwvbnMxOmlzTGFib3JTdXJwbHVzQXJlYUZpcm0+
CiAgICAgICAgICAgICAgPG5zMTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAg
ICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzRmVk
ZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzRmVkZXJhbGx5
RnVuZGVkUmVzZWFyY2hBbmREZXZlbG9wbWVudENvcnA+ZmFsc2U8L25zMTppc0Zl
ZGVyYWxseUZ1bmRlZFJlc2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPgogICAgICAg
ICAgICAgICAgPG5zMTppc0ZlZGVyYWxHb3Zlcm5tZW50QWdlbmN5PmZhbHNlPC9u
czE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT48L25zMTpmZWRlcmFsR292ZXJu
bWVudD4KICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVHb3Zlcm5tZW50PmZhbHNl
PC9uczE6aXNTdGF0ZUdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpsb2Nh
bEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5t
ZW50PmZhbHNlPC9uczE6aXNMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzQ2l0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzQ2l0eUxv
Y2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3VudHlMb2Nh
bEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NvdW50eUxvY2FsR292ZXJubWVudD4K
ICAgICAgICAgICAgICAgIDxuczE6aXNJbnRlck11bmljaXBhbExvY2FsR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+
CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5tZW50T3duZWQ+ZmFs
c2U8L25zMTppc0xvY2FsR292ZXJubWVudE93bmVkPgogICAgICAgICAgICAgICAg
PG5zMTppc011bmljaXBhbGl0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
TXVuaWNpcGFsaXR5TG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5z
MTppc1NjaG9vbERpc3RyaWN0TG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNT
Y2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxu
czE6aXNUb3duc2hpcExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVG93bnNo
aXBMb2NhbEdvdmVybm1lbnQ+PC9uczE6bG9jYWxHb3Zlcm5tZW50PgogICAgICAg
ICAgICAgIDxuczE6aXNUcmliYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNUcmli
YWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6aXNGb3JlaWduR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzRm9yZWlnbkdvdmVybm1lbnQ+CiAgICAgICAgICAg
ICAgPG5zMTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT4KICAgICAgICAgICAg
ICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlOb3RUYXhFeGVtcHQ+ZmFsc2U8L25z
MTppc0NvcnBvcmF0ZUVudGl0eU5vdFRheEV4ZW1wdD4KICAgICAgICAgICAgICAg
IDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlUYXhFeGVtcHQ+ZmFsc2U8L25zMTppc0Nv
cnBvcmF0ZUVudGl0eVRheEV4ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6aXNQ
YXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPmZhbHNlPC9u
czE6aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPgog
ICAgICAgICAgICAgICAgPG5zMTppc1NvbGVQcm9wcmVpdG9yc2hpcD5mYWxzZTwv
bnMxOmlzU29sZVByb3ByZWl0b3JzaGlwPgogICAgICAgICAgICAgICAgPG5zMTpp
c1NtYWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+ZmFsc2U8L25zMTppc1NtYWxs
QWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+CiAgICAgICAgICAgICAgICA8bnMxOmlz
SW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzSW50ZXJuYXRp
b25hbE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNVU0dvdmVy
bm1lbnRFbnRpdHk+ZmFsc2U8L25zMTppc1VTR292ZXJubWVudEVudGl0eT48L25z
MTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT48L25zMTp2ZW5kb3JCdXNpbmVz
c1R5cGVzPgogICAgICAgICAgICA8bnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgog
ICAgICAgICAgICAgIDxuczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0
aW9uPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0aW9u
PgogICAgICAgICAgICAgIDxuczE6aXNEb21lc3RpY1NoZWx0ZXI+ZmFsc2U8L25z
MTppc0RvbWVzdGljU2hlbHRlcj4KICAgICAgICAgICAgICA8bnMxOmlzRWR1Y2F0
aW9uYWxJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzRWR1Y2F0aW9uYWxJbnN0aXR1
dGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzRm91bmRhdGlvbj5mYWxzZTwvbnMx
OmlzRm91bmRhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzSG9zcGl0YWw+ZmFs
c2U8L25zMTppc0hvc3BpdGFsPgogICAgICAgICAgICAgIDxuczE6aXNNYW51ZmFj
dHVyZXJPZkdvb2RzPmZhbHNlPC9uczE6aXNNYW51ZmFjdHVyZXJPZkdvb2RzPgog
ICAgICAgICAgICAgIDxuczE6aXNWZXRlcmluYXJ5SG9zcGl0YWw+ZmFsc2U8L25z
MTppc1ZldGVyaW5hcnlIb3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzSGlz
cGFuaWNTZXJ2aWNpbmdJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzSGlzcGFuaWNT
ZXJ2aWNpbmdJbnN0aXR1dGlvbj48L25zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JSZWxhdGlvbnNoaXBXaXRoRmVkZXJhbEdv
dmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpyZWNlaXZlc0NvbnRyYWN0cz5m
YWxzZTwvbnMxOnJlY2VpdmVzQ29udHJhY3RzPgogICAgICAgICAgICAgIDxuczE6
cmVjZWl2ZXNHcmFudHM+ZmFsc2U8L25zMTpyZWNlaXZlc0dyYW50cz4KICAgICAg
ICAgICAgICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzQW5kR3JhbnRzPmZhbHNlPC9u
czE6cmVjZWl2ZXNDb250cmFjdHNBbmRHcmFudHM+PC9uczE6dmVuZG9yUmVsYXRp
b25zaGlwV2l0aEZlZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICA8bnMxOnR5
cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAgICAgICAgICAgPG5zMTppc0FpcnBv
cnRBdXRob3JpdHk+ZmFsc2U8L25zMTppc0FpcnBvcnRBdXRob3JpdHk+CiAgICAg
ICAgICAgICAgPG5zMTppc0NvdW5jaWxPZkdvdmVybm1lbnRzPmZhbHNlPC9uczE6
aXNDb3VuY2lsT2ZHb3Zlcm5tZW50cz4KICAgICAgICAgICAgICA8bnMxOmlzSG91
c2luZ0F1dGhvcml0aWVzUHVibGljT3JUcmliYWw+ZmFsc2U8L25zMTppc0hvdXNp
bmdBdXRob3JpdGllc1B1YmxpY09yVHJpYmFsPgogICAgICAgICAgICAgIDxuczE6
aXNJbnRlcnN0YXRlRW50aXR5PmZhbHNlPC9uczE6aXNJbnRlcnN0YXRlRW50aXR5
PgogICAgICAgICAgICAgIDxuczE6aXNQbGFubmluZ0NvbW1pc3Npb24+ZmFsc2U8
L25zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj4KICAgICAgICAgICAgICA8bnMxOmlz
UG9ydEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzUG9ydEF1dGhvcml0eT4KICAgICAg
ICAgICAgICA8bnMxOmlzVHJhbnNpdEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzVHJh
bnNpdEF1dGhvcml0eT48L25zMTp0eXBlT2ZHb3Zlcm5tZW50RW50aXR5PgogICAg
ICAgICAgICA8bnMxOnZlbmRvck9yZ2FuaXphdGlvbkZhY3RvcnM+CiAgICAgICAg
ICAgICAgPG5zMTppc1N1YmNoYXB0ZXJTQ29ycG9yYXRpb24+ZmFsc2U8L25zMTpp
c1N1YmNoYXB0ZXJTQ29ycG9yYXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc0xp
bWl0ZWRMaWFiaWxpdHlDb3Jwb3JhdGlvbj5mYWxzZTwvbnMxOmlzTGltaXRlZExp
YWJpbGl0eUNvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNGb3JlaWdu
T3duZWRBbmRMb2NhdGVkPmZhbHNlPC9uczE6aXNGb3JlaWduT3duZWRBbmRMb2Nh
dGVkPgogICAgICAgICAgICAgIDxuczE6cHJvZml0U3RydWN0dXJlPgogICAgICAg
ICAgICAgICAgPG5zMTppc0ZvclByb2ZpdE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMx
OmlzRm9yUHJvZml0T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPG5zMTpp
c05vbnByb2ZpdE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzTm9ucHJvZml0T3Jn
YW5pemF0aW9uPgogICAgICAgICAgICAgICAgPG5zMTppc090aGVyTm90Rm9yUHJv
Zml0T3JnYW5pemF0aW9uPmZhbHNlPC9uczE6aXNPdGhlck5vdEZvclByb2ZpdE9y
Z2FuaXphdGlvbj48L25zMTpwcm9maXRTdHJ1Y3R1cmU+CiAgICAgICAgICAgICAg
PG5zMTppc1NoZWx0ZXJlZFdvcmtzaG9wPmZhbHNlPC9uczE6aXNTaGVsdGVyZWRX
b3Jrc2hvcD4KICAgICAgICAgICAgICA8bnMxOm51bWJlck9mRW1wbG95ZWVzPjE3
MzwvbnMxOm51bWJlck9mRW1wbG95ZWVzPgogICAgICAgICAgICAgIDxuczE6YW5u
dWFsUmV2ZW51ZT4yNjwvbnMxOmFubnVhbFJldmVudWU+PC9uczE6dmVuZG9yT3Jn
YW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZFZHVjYXRp
b25hbEVudGl0eT4KICAgICAgICAgICAgICA8bnMxOmlzMTg2MkxhbmRHcmFudENv
bGxlZ2U+ZmFsc2U8L25zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPgogICAgICAg
ICAgICAgIDxuczE6aXMxODkwTGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMxOmlz
MTg5MExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppczE5OTRM
YW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6aXMxOTk0TGFuZEdyYW50Q29sbGVn
ZT4KICAgICAgICAgICAgICA8bnMxOmlzSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdl
T3JVbml2ZXJzaXR5PmZhbHNlPC9uczE6aXNIaXN0b3JpY2FsbHlCbGFja0NvbGxl
Z2VPclVuaXZlcnNpdHk+CiAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5SW5z
dGl0dXRpb24+ZmFsc2U8L25zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTppc1ByaXZhdGVVbml2ZXJzaXR5T3JDb2xsZWdlPmZhbHNl
PC9uczE6aXNQcml2YXRlVW5pdmVyc2l0eU9yQ29sbGVnZT4KICAgICAgICAgICAg
ICA8bnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT5mYWxzZTwvbnMxOmlzU2Nob29sT2ZG
b3Jlc3RyeT4KICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVDb250cm9sbGVkSW5z
dGl0dXRpb25vZkhpZ2hlckxlYXJuaW5nPmZhbHNlPC9uczE6aXNTdGF0ZUNvbnRy
b2xsZWRJbnN0aXR1dGlvbm9mSGlnaGVyTGVhcm5pbmc+CiAgICAgICAgICAgICAg
PG5zMTppc1RyaWJhbENvbGxlZ2U+ZmFsc2U8L25zMTppc1RyaWJhbENvbGxlZ2U+
CiAgICAgICAgICAgICAgPG5zMTppc1ZldGVyaW5hcnlDb2xsZWdlPmZhbHNlPC9u
czE6aXNWZXRlcmluYXJ5Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzQWxh
c2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNBbGFz
a2FuTmF0aXZlU2VydmljaW5nSW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5z
MTppc05hdGl2ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+ZmFsc2U8L25z
MTppc05hdGl2ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+PC9uczE6dHlw
ZU9mRWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQ2Vy
dGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgPG5zMTppc0RPVENlcnRpZmllZERp
c2FkdmFudGFnZWRCdXNpbmVzc0VudGVycHJpc2U+ZmFsc2U8L25zMTppc0RPVENl
cnRpZmllZERpc2FkdmFudGFnZWRCdXNpbmVzc0VudGVycHJpc2U+CiAgICAgICAg
ICAgICAgPG5zMTppc1NlbGZDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNp
bmVzcz5mYWxzZTwvbnMxOmlzU2VsZkNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdl
ZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRTbWFs
bERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVk
U21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTpp
c1NCQUNlcnRpZmllZDhBUHJvZ3JhbVBhcnRpY2lwYW50PmZhbHNlPC9uczE6aXNT
QkFDZXJ0aWZpZWQ4QVByb2dyYW1QYXJ0aWNpcGFudD4KICAgICAgICAgICAgICA8
bnMxOmlzU2VsZkNlcnRpZmllZEhVQlpvbmVKb2ludFZlbnR1cmU+ZmFsc2U8L25z
MTppc1NlbGZDZXJ0aWZpZWRIVUJab25lSm9pbnRWZW50dXJlPgogICAgICAgICAg
ICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRIVUJab25lPmZhbHNlPC9uczE6aXNTQkFD
ZXJ0aWZpZWRIVUJab25lPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZp
ZWQ4QUpvaW50VmVudHVyZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFKb2lu
dFZlbnR1cmU+PC9uczE6dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yTG9jYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpzdHJlZXRB
ZGRyZXNzPjEzODYxIFNVTlJJU0UgVkFMTEVZIERSIFNURSA0MDA8L25zMTpzdHJl
ZXRBZGRyZXNzPgogICAgICAgICAgICAgIDxuczE6Y2l0eT5IRVJORE9OPC9uczE6
Y2l0eT4KICAgICAgICAgICAgICA8bnMxOnN0YXRlIG5hbWU9IlZJUkdJTklBIj5W
QTwvbnMxOnN0YXRlPgogICAgICAgICAgICAgIDxuczE6WklQQ29kZT4yMDE3MTYx
MjY8L25zMTpaSVBDb2RlPgogICAgICAgICAgICAgIDxuczE6Y291bnRyeUNvZGUg
bmFtZT0iVU5JVEVEIFNUQVRFUyI+VVNBPC9uczE6Y291bnRyeUNvZGU+CiAgICAg
ICAgICAgICAgPG5zMTpjb25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjEwPC9uczE6
Y29uZ3Jlc3Npb25hbERpc3RyaWN0Q29kZT48L25zMTp2ZW5kb3JMb2NhdGlvbj4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JTaXRlQ29kZT43ODY0NjgxOTkwMDAwUFI8
L25zMTp2ZW5kb3JTaXRlQ29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JBbHRl
cm5hdGVTaXRlQ29kZT4yMDE3MTYxMjY8L25zMTp2ZW5kb3JBbHRlcm5hdGVTaXRl
Q29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JEVU5TSW5mb3JtYXRpb24+CiAg
ICAgICAgICAgICAgPG5zMTpEVU5TTnVtYmVyPjc4NjQ2ODE5OTwvbnMxOkRVTlNO
dW1iZXI+CiAgICAgICAgICAgICAgPG5zMTp2ZW5kb3JOYW1lPkRMVCBTT0xVVElP
TlMgSU5DT1JQT1JBVEVEPC9uczE6dmVuZG9yTmFtZT4KICAgICAgICAgICAgICA8
bnMxOmdsb2JhbFBhcmVudERVTlNOdW1iZXI+Nzg2NDY4MTk5PC9uczE6Z2xvYmFs
UGFyZW50RFVOU051bWJlcj4KICAgICAgICAgICAgICA8bnMxOmdsb2JhbFBhcmVu
dERVTlNOYW1lPkRMVCBTT0xVVElPTlMgIExMQzwvbnMxOmdsb2JhbFBhcmVudERV
TlNOYW1lPjwvbnMxOnZlbmRvckRVTlNJbmZvcm1hdGlvbj4KICAgICAgICAgICAg
PG5zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxzPgogICAgICAgICAgICAgIDxuczE6
cmVnaXN0cmF0aW9uRGF0ZT4yMDAyLTAzLTE0IDAwOjAwOjAwPC9uczE6cmVnaXN0
cmF0aW9uRGF0ZT4KICAgICAgICAgICAgICA8bnMxOnJlbmV3YWxEYXRlPjIwMDgt
MTEtMTYgMDA6MDA6MDA8L25zMTpyZW5ld2FsRGF0ZT48L25zMTpjY3JSZWdpc3Ry
YXRpb25EZXRhaWxzPjwvbnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAgICAg
PG5zMTpjb250cmFjdGluZ09mZmljZXJCdXNpbmVzc1NpemVEZXRlcm1pbmF0aW9u
IGRlc2NyaXB0aW9uPSJTTUFMTCBCVVNJTkVTUyI+UzwvbnMxOmNvbnRyYWN0aW5n
T2ZmaWNlckJ1c2luZXNzU2l6ZURldGVybWluYXRpb24+PC9uczE6dmVuZG9yPgog
ICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpw
cmluY2lwYWxQbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICAgIDxuczE6bG9j
YXRpb25Db2RlPjUwMDAwPC9uczE6bG9jYXRpb25Db2RlPgogICAgICAgICAgICA8
bnMxOnN0YXRlQ29kZSBuYW1lPSJESVNUUklDVCBPRiBDT0xVTUJJQSI+REM8L25z
MTpzdGF0ZUNvZGU+CiAgICAgICAgICAgIDxuczE6Y291bnRyeUNvZGUgbmFtZT0i
VU5JVEVEIFNUQVRFUyI+VVNBPC9uczE6Y291bnRyeUNvZGU+PC9uczE6cHJpbmNp
cGFsUGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpwbGFjZU9mUGVy
Zm9ybWFuY2VaSVBDb2RlIGNvdW50eT0iRElTVFJJQ1QgT0YgQ09MVU1CSUEiIGNp
dHk9IldBU0hJTkdUT04iPjIwMjEyMDAwMjwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5j
ZVpJUENvZGU+CiAgICAgICAgICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdy
ZXNzaW9uYWxEaXN0cmljdD4wMDwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdy
ZXNzaW9uYWxEaXN0cmljdD48L25zMTpwbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAg
ICAgPG5zMTpjb21wZXRpdGlvbj4KICAgICAgICAgIDxuczE6c29saWNpdGF0aW9u
UHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iU0lNUExJRklFRCBBQ1FVSVNJVElPTiI+
U1AxPC9uczE6c29saWNpdGF0aW9uUHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6
dHlwZU9mU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIFNFVCBBU0lERSBVU0VELiI+
Tk9ORTwvbnMxOnR5cGVPZlNldEFzaWRlPgogICAgICAgICAgPG5zMTpldmFsdWF0
ZWRQcmVmZXJlbmNlIGRlc2NyaXB0aW9uPSJOTyBQUkVGRVJFTkNFIFVTRUQiPk5P
TkU8L25zMTpldmFsdWF0ZWRQcmVmZXJlbmNlPgogICAgICAgICAgPG5zMTpudW1i
ZXJPZk9mZmVyc1JlY2VpdmVkPjE8L25zMTpudW1iZXJPZk9mZmVyc1JlY2VpdmVk
PgogICAgICAgICAgPG5zMTpjb21tZXJjaWFsSXRlbUFjcXVpc2l0aW9uUHJvY2Vk
dXJlcyBkZXNjcmlwdGlvbj0iQ09NTUVSQ0lBTCBJVEVNIj5BPC9uczE6Y29tbWVy
Y2lhbEl0ZW1BY3F1aXNpdGlvblByb2NlZHVyZXM+CiAgICAgICAgICA8bnMxOmNv
bW1lcmNpYWxJdGVtVGVzdFByb2dyYW0gZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6
Y29tbWVyY2lhbEl0ZW1UZXN0UHJvZ3JhbT4KICAgICAgICAgIDxuczE6c21hbGxC
dXNpbmVzc0NvbXBldGl0aXZlbmVzc0RlbW9uc3RyYXRpb25Qcm9ncmFtPmZhbHNl
PC9uczE6c21hbGxCdXNpbmVzc0NvbXBldGl0aXZlbmVzc0RlbW9uc3RyYXRpb25Q
cm9ncmFtPgogICAgICAgICAgPG5zMTpBNzZBY3Rpb24gZGVzY3JpcHRpb249Ik5P
Ij5OPC9uczE6QTc2QWN0aW9uPgogICAgICAgICAgPG5zMTpmZWRCaXpPcHBzIGRl
c2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmZlZEJpek9wcHM+PC9u
czE6Y29tcGV0aXRpb24+CiAgICAgICAgPG5zMTpwcmVmZXJlbmNlUHJvZ3JhbXM+
PC9uczE6cHJlZmVyZW5jZVByb2dyYW1zPgogICAgICAgIDxuczE6dHJhbnNhY3Rp
b25JbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6Y3JlYXRlZEJ5PlJFWU5PTERT
LlZBTkVTU0FAQkxTLkdPVjwvbnMxOmNyZWF0ZWRCeT4KICAgICAgICAgIDxuczE6
Y3JlYXRlZERhdGU+MjAwNy0wNC0xMCAxNjo0MDoyOTwvbnMxOmNyZWF0ZWREYXRl
PgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZpZWRCeT5JRFZfQ09SUkVDVDwvbnMx
Omxhc3RNb2RpZmllZEJ5PgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZpZWREYXRl
PjIwMTYtMDItMTYgMTM6MTA6MDI8L25zMTpsYXN0TW9kaWZpZWREYXRlPgogICAg
ICAgICAgPG5zMTpzdGF0dXMgZGVzY3JpcHRpb249IkZJTkFMIj5GPC9uczE6c3Rh
dHVzPjwvbnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+PC9uczE6YXdhcmQ+CiAg
ICA8L2NvbnRlbnQ+CiAgPC9lbnRyeT4KICA8ZW50cnk+CiAgICA8dGl0bGU+PCFb
Q0RBVEFbTmV3IERFTElWRVJZIE9SREVSIEVEQ0lPMTJPMDAwOSBhd2FyZGVkIHRv
IERMVCBTT0xVVElPTlMsIExMQyBmb3IgdGhlIGFtb3VudCBvZiAkMTQsMTY4LjE2
XV0+PC90aXRsZT4KICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0ZXh0
L2h0bWwiIGhyZWY9Imh0dHBzOi8vd3d3LmZwZHMuZ292L2V6c2VhcmNoL3NlYXJj
aC5kbz9zPUZQRFMmYW1wO2luZGV4TmFtZT1hd2FyZGZ1bGwmYW1wO3RlbXBsYXRl
TmFtZT0xLjUuMSZhbXA7cT1FRENJTzEyTzAwMDkrOTEwMCsiPjwvbGluaz4KICAg
IDxtb2RpZmllZD4yMDE2LTAyLTE2IDEzOjEwOjE2PC9tb2RpZmllZD4KICAgIDxj
b250ZW50IHhtbG5zOm5zMT0iaHR0cHM6Ly93d3cuZnBkcy5nb3YvRlBEUyIgdHlw
ZT0iYXBwbGljYXRpb24veG1sIj4KICAgICAgPG5zMTphd2FyZCB4bWxuczpuczE9
Imh0dHA6Ly93d3cuZnBkc25nLmNvbS9GUERTIiB2ZXJzaW9uPSIxLjQiPgogICAg
ICAgIDxuczE6YXdhcmRJRD4KICAgICAgICAgIDxuczE6YXdhcmRDb250cmFjdElE
PgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9IkVEVUNBVElPTiwgREVQ
QVJUTUVOVCBPRiI+OTEwMDwvbnMxOmFnZW5jeUlEPgogICAgICAgICAgICA8bnMx
OlBJSUQ+RURDSU8xMk8wMDA5PC9uczE6UElJRD4KICAgICAgICAgICAgPG5zMTpt
b2ROdW1iZXI+MDwvbnMxOm1vZE51bWJlcj4KICAgICAgICAgICAgPG5zMTp0cmFu
c2FjdGlvbk51bWJlcj4wPC9uczE6dHJhbnNhY3Rpb25OdW1iZXI+PC9uczE6YXdh
cmRDb250cmFjdElEPgogICAgICAgICAgPG5zMTpyZWZlcmVuY2VkSURWSUQ+CiAg
ICAgICAgICAgIDxuczE6YWdlbmN5SUQgbmFtZT0iRkVERVJBTCBBQ1FVSVNJVElP
TiBTRVJWSUNFIj40NzMwPC9uczE6YWdlbmN5SUQ+CiAgICAgICAgICAgIDxuczE6
UElJRD5HUzM1RjQ1NDNHPC9uczE6UElJRD4KICAgICAgICAgICAgPG5zMTptb2RO
dW1iZXI+MTA3PC9uczE6bW9kTnVtYmVyPjwvbnMxOnJlZmVyZW5jZWRJRFZJRD48
L25zMTphd2FyZElEPgogICAgICAgIDxuczE6cmVsZXZhbnRDb250cmFjdERhdGVz
PgogICAgICAgICAgPG5zMTpzaWduZWREYXRlPjIwMTItMDUtMTEgMDA6MDA6MDA8
L25zMTpzaWduZWREYXRlPgogICAgICAgICAgPG5zMTplZmZlY3RpdmVEYXRlPjIw
MTItMDUtMTEgMDA6MDA6MDA8L25zMTplZmZlY3RpdmVEYXRlPgogICAgICAgICAg
PG5zMTpjdXJyZW50Q29tcGxldGlvbkRhdGU+MjAxMi0wOS0zMCAwMDowMDowMDwv
bnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4KICAgICAgICAgIDxuczE6dWx0aW1h
dGVDb21wbGV0aW9uRGF0ZT4yMDEzLTA2LTMwIDAwOjAwOjAwPC9uczE6dWx0aW1h
dGVDb21wbGV0aW9uRGF0ZT48L25zMTpyZWxldmFudENvbnRyYWN0RGF0ZXM+CiAg
ICAgICAgPG5zMTpkb2xsYXJWYWx1ZXM+CiAgICAgICAgICA8bnMxOm9ibGlnYXRl
ZEFtb3VudD4xNDE2OC4xNjwvbnMxOm9ibGlnYXRlZEFtb3VudD4KICAgICAgICAg
IDxuczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4xNDE2OC4xNjwvbnMx
OmJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAgICA8bnMxOmJh
c2VBbmRBbGxPcHRpb25zVmFsdWU+MTQxNjguMTY8L25zMTpiYXNlQW5kQWxsT3B0
aW9uc1ZhbHVlPjwvbnMxOmRvbGxhclZhbHVlcz4KICAgICAgICA8bnMxOnRvdGFs
RG9sbGFyVmFsdWVzPgogICAgICAgICAgPG5zMTp0b3RhbE9ibGlnYXRlZEFtb3Vu
dD4xNDE2OC4xNjwvbnMxOnRvdGFsT2JsaWdhdGVkQW1vdW50PgogICAgICAgICAg
PG5zMTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+MTQxNjguMTY8
L25zMTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAg
ICA8bnMxOnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT4xNDE2OC4xNjwvbnMx
OnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT48L25zMTp0b3RhbERvbGxhclZh
bHVlcz4KICAgICAgICA8bnMxOnB1cmNoYXNlckluZm9ybWF0aW9uPgogICAgICAg
ICAgPG5zMTpjb250cmFjdGluZ09mZmljZUFnZW5jeUlEIG5hbWU9IkVEVUNBVElP
TiwgREVQQVJUTUVOVCBPRiIgZGVwYXJ0bWVudElEPSI5MTAwIiBkZXBhcnRtZW50
TmFtZT0iRURVQ0FUSU9OLCBERVBBUlRNRU5UIE9GIj45MTAwPC9uczE6Y29udHJh
Y3RpbmdPZmZpY2VBZ2VuY3lJRD4KICAgICAgICAgIDxuczE6Y29udHJhY3RpbmdP
ZmZpY2VJRCBuYW1lPSJQUklOQ0lQQUwgT0ZGSUNFUyIgY291bnRyeT0iVVNBIj5Q
TzwvbnMxOmNvbnRyYWN0aW5nT2ZmaWNlSUQ+CiAgICAgICAgICA8bnMxOmZ1bmRp
bmdSZXF1ZXN0aW5nQWdlbmN5SUQgbmFtZT0iRURVQ0FUSU9OLCBERVBBUlRNRU5U
IE9GIiBkZXBhcnRtZW50SUQ9IjkxMDAiIGRlcGFydG1lbnROYW1lPSJFRFVDQVRJ
T04sIERFUEFSVE1FTlQgT0YiPjkxMDA8L25zMTpmdW5kaW5nUmVxdWVzdGluZ0Fn
ZW5jeUlEPgogICAgICAgICAgPG5zMTpmdW5kaW5nUmVxdWVzdGluZ09mZmljZUlE
IG5hbWU9Ik9DSU8gLSBPRkZJQ0UgT0YgQ0hJRUYgSU5GT1JNQVRJT04gT0ZGSUNF
UiI+RUk8L25zMTpmdW5kaW5nUmVxdWVzdGluZ09mZmljZUlEPgogICAgICAgICAg
PG5zMTpmb3JlaWduRnVuZGluZyBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUi
Plg8L25zMTpmb3JlaWduRnVuZGluZz48L25zMTpwdXJjaGFzZXJJbmZvcm1hdGlv
bj4KICAgICAgICA8bnMxOmNvbnRyYWN0TWFya2V0aW5nRGF0YT4KICAgICAgICAg
IDxuczE6ZmVlUGFpZEZvclVzZU9mU2VydmljZT4wLjAwPC9uczE6ZmVlUGFpZEZv
clVzZU9mU2VydmljZT48L25zMTpjb250cmFjdE1hcmtldGluZ0RhdGE+CiAgICAg
ICAgPG5zMTpjb250cmFjdERhdGE+CiAgICAgICAgICA8bnMxOmNvbnRyYWN0QWN0
aW9uVHlwZSBkZXNjcmlwdGlvbj0iREVMSVZFUlkgT1JERVIiPkM8L25zMTpjb250
cmFjdEFjdGlvblR5cGU+CiAgICAgICAgICA8bnMxOnR5cGVPZkNvbnRyYWN0UHJp
Y2luZyBkZXNjcmlwdGlvbj0iRklSTSBGSVhFRCBQUklDRSI+SjwvbnMxOnR5cGVP
ZkNvbnRyYWN0UHJpY2luZz4KICAgICAgICAgIDxuczE6bmF0aW9uYWxJbnRlcmVz
dEFjdGlvbkNvZGUgZGVzY3JpcHRpb249Ik5PTkUiPk5PTkU8L25zMTpuYXRpb25h
bEludGVyZXN0QWN0aW9uQ29kZT4KICAgICAgICAgIDxuczE6ZGVzY3JpcHRpb25P
ZkNvbnRyYWN0UmVxdWlyZW1lbnQ+VE9BRCBTT0ZUV0FSRSBTVVBQT1JUIFJFTkVX
QUwuICBUT0FEIElTIFVTRUQgQlkgVEhFIERFUEFSVE1FTlQgT0YgRURVQ0FUSU9O
IEFTIEEgUFJJTUFSWSBTUUwgQU5EIFBML1NRTCBERVZFTE9QTUVOVCBUT09MLiAg
SVQgSVMgQUxTTyBVU0VEIEZPUiBQUk9EVUNUSU9OIFNVUFBPUlQgQU5EIE1BTkFH
SU5HIE9SQUNMRSBEQVRBQkFTRVMuPC9uczE6ZGVzY3JpcHRpb25PZkNvbnRyYWN0
UmVxdWlyZW1lbnQ+CiAgICAgICAgICA8bnMxOkdGRS1HRlAgZGVzY3JpcHRpb249
IlRyYW5zYWN0aW9uIGRvZXMgbm90IHVzZSBHRkUvR0ZQIj5OPC9uczE6R0ZFLUdG
UD4KICAgICAgICAgIDxuczE6dW5kZWZpbml0aXplZEFjdGlvbiBkZXNjcmlwdGlv
bj0iTk8iPlg8L25zMTp1bmRlZmluaXRpemVkQWN0aW9uPgogICAgICAgICAgPG5z
MTpjb25zb2xpZGF0ZWRDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpj
b25zb2xpZGF0ZWRDb250cmFjdD4KICAgICAgICAgIDxuczE6cGVyZm9ybWFuY2VC
YXNlZFNlcnZpY2VDb250cmFjdCBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUi
Plg8L25zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNvbnRyYWN0PgogICAgICAg
ICAgPG5zMTptdWx0aVllYXJDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25z
MTptdWx0aVllYXJDb250cmFjdD4KICAgICAgICAgIDxuczE6Y29udGluZ2VuY3lI
dW1hbml0YXJpYW5QZWFjZWtlZXBpbmdPcGVyYXRpb24gZGVzY3JpcHRpb249Ik5P
VCBBUFBMSUNBQkxFIj5YPC9uczE6Y29udGluZ2VuY3lIdW1hbml0YXJpYW5QZWFj
ZWtlZXBpbmdPcGVyYXRpb24+CiAgICAgICAgICA8bnMxOmxpc3RPZlRyZWFzdXJ5
QWNjb3VudHM+CiAgICAgICAgICAgIDxuczE6dHJlYXN1cnlBY2NvdW50PgogICAg
ICAgICAgICAgIDxuczE6dHJlYXN1cnlBY2NvdW50U3ltYm9sPgogICAgICAgICAg
ICAgICAgPG5zMTphZ2VuY3lJZGVudGlmaWVyPjkxPC9uczE6YWdlbmN5SWRlbnRpZmll
cj4KICAgICAgICAgICAgICAgIDxuczE6bWFpbkFjY291bnRDb2RlPjAyMDI8L25z
MTptYWluQWNjb3VudENvZGU+PC9uczE6dHJlYXN1cnlBY2NvdW50U3ltYm9sPjwv
bnMxOnRyZWFzdXJ5QWNjb3VudD48L25zMTpsaXN0T2ZUcmVhc3VyeUFjY291bnRz
PgogICAgICAgICAgPG5zMTpwdXJjaGFzZUNhcmRBc1BheW1lbnRNZXRob2QgZGVz
Y3JpcHRpb249Ik5PIj5OPC9uczE6cHVyY2hhc2VDYXJkQXNQYXltZW50TWV0aG9k
PgogICAgICAgICAgPG5zMTpudW1iZXJPZkFjdGlvbnM+MTwvbnMxOm51bWJlck9m
QWN0aW9ucz48L25zMTpjb250cmFjdERhdGE+CiAgICAgICAgPG5zMTpsZWdpc2xh
dGl2ZU1hbmRhdGVzPgogICAgICAgICAgPG5zMTpDbGluZ2VyQ29oZW5BY3QgZGVz
Y3JpcHRpb249Ik5PIj5OPC9uczE6Q2xpbmdlckNvaGVuQWN0PgogICAgICAgICAg
PG5zMTptYXRlcmlhbHNTdXBwbGllc0FydGljbGVzRXF1aXBtZW50IGRlc2NyaXB0
aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOm1hdGVyaWFsc1N1cHBsaWVzQXJ0
aWNsZXNFcXVpcG1lbnQ+CiAgICAgICAgICA8bnMxOmxhYm9yU3RhbmRhcmRzIGRl
c2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmxhYm9yU3RhbmRhcmRz
PgogICAgICAgICAgPG5zMTpjb25zdHJ1Y3Rpb25XYWdlUmF0ZVJlcXVpcmVtZW50
cyBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8L25zMTpjb25zdHJ1Y3Rp
b25XYWdlUmF0ZVJlcXVpcmVtZW50cz4KICAgICAgICAgIDxuczE6bGlzdE9mQWRk
aXRpb25hbFJlcG9ydGluZ1ZhbHVlcz48L25zMTpsaXN0T2ZBZGRpdGlvbmFsUmVw
b3J0aW5nVmFsdWVzPgogICAgICAgICAgPG5zMTppbnRlcmFnZW5jeUNvbnRyYWN0
aW5nQXV0aG9yaXR5IGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMx
OmludGVyYWdlbmN5Q29udHJhY3RpbmdBdXRob3JpdHk+PC9uczE6bGVnaXNsYXRp
dmVNYW5kYXRlcz4KICAgICAgICA8bnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1h
dGlvbj4KICAgICAgICAgIDxuczE6cHJvZHVjdE9yU2VydmljZUNvZGUgZGVzY3Jp
cHRpb249IkFEUCBTT0ZUV0FSRSIgcHJvZHVjdE9yU2VydmljZVR5cGU9IlBST0RV
Q1QiPjcwMzA8L25zMTpwcm9kdWN0T3JTZXJ2aWNlQ29kZT4KICAgICAgICAgIDxu
czE6Y29udHJhY3RCdW5kbGluZyBkZXNjcmlwdGlvbj0iTk9UIEEgQlVORExFRCBS
RVFVSVJFTUVOVCI+RDwvbnMxOmNvbnRyYWN0QnVuZGxpbmc+CiAgICAgICAgICA8
bnMxOnByaW5jaXBhbE5BSUNTQ29kZSBkZXNjcmlwdGlvbj0iT1RIRVIgQ09NUFVU
RVIgUkVMQVRFRCBTRVJWSUNFUyI+NTQxNTE5PC9uczE6cHJpbmNpcGFsTkFJQ1ND
b2RlPgogICAgICAgICAgPG5zMTpyZWNvdmVyZWRNYXRlcmlhbENsYXVzZXMgZGVz
Y3JpcHRpb249Ik5PIENMQVVTRVMgSU5DTFVERUQgQU5EIE5PIFNVU1RBSU5BQklM
SVRZIElOQ0xVREVEIj5DPC9uczE6cmVjb3ZlcmVkTWF0ZXJpYWxDbGF1c2VzPgog
ICAgICAgICAgPG5zMTp1c2VPZkVQQURlc2lnbmF0ZWRQcm9kdWN0cyBkZXNjcmlw
dGlvbj0iTk9UIFJFUVVJUkVEIj5FPC9uczE6dXNlT2ZFUEFEZXNpZ25hdGVkUHJv
ZHVjdHM+CiAgICAgICAgICA8bnMxOmNvdW50cnlPZk9yaWdpbiBuYW1lPSJVTklU
RUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZPcmlnaW4+CiAgICAgICAgICA8
bnMxOnBsYWNlT2ZNYW51ZmFjdHVyZSBkZXNjcmlwdGlvbj0iTUZHIElOIFUuUy4i
PkQ8L25zMTpwbGFjZU9mTWFudWZhY3R1cmU+PC9uczE6cHJvZHVjdE9yU2Vydmlj
ZUluZm9ybWF0aW9uPgogICAgICAgIDxuczE6dmVuZG9yPgogICAgICAgICAgPG5z
MTp2ZW5kb3JIZWFkZXI+CiAgICAgICAgICAgIDxuczE6dmVuZG9yTmFtZT5ETFQg
U09MVVRJT05TLCBMTEM8L25zMTp2ZW5kb3JOYW1lPjwvbnMxOnZlbmRvckhlYWRl
cj4KICAgICAgICAgIDxuczE6dmVuZG9yU2l0ZURldGFpbHM+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yU29jaW9FY29ub21pY0luZGljYXRvcnM+CiAgICAgICAgICAg
ICAgPG5zMTppc0FsYXNrYW5OYXRpdmVPd25lZENvcnBvcmF0aW9uT3JGaXJtPmZh
bHNlPC9uczE6aXNBbGFza2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT4K
ICAgICAgICAgICAgICA8bnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD5mYWxzZTwv
bnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOmlz
SW5kaWFuVHJpYmU+ZmFsc2U8L25zMTppc0luZGlhblRyaWJlPgogICAgICAgICAg
ICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JGaXJt
PmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JG
aXJtPgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxseU93bmVkRmlybT5mYWxz
ZTwvbnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+CiAgICAgICAgICAgICAgPG5zMTpp
c1ZldGVyYW5Pd25lZD5mYWxzZTwvbnMxOmlzVmV0ZXJhbk93bmVkPgogICAgICAg
ICAgICAgIDxuczE6aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVk
QnVzaW5lc3M+ZmFsc2U8L25zMTppc1NlcnZpY2VSZWxhdGVkRGlzYWJsZWRWZXRl
cmFuT3duZWRCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzV29tZW5Pd25l
ZD5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOm1p
bm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTWlub3JpdHlPd25l
ZD5mYWxzZTwvbnMxOmlzTWlub3JpdHlPd25lZD4KICAgICAgICAgICAgICAgIDxu
czE6aXNTdWJDb250aW5lbnRBc2lhbkFtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzU3ViQ29udGluZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+
CiAgICAgICAgICAgICAgICA8bnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNBc2lhblBhY2lmaWNBbWVyaWNhbk93bmVk
QnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzQmxhY2tBbWVyaWNhbk93
bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2lu
ZXNzPgogICAgICAgICAgICAgICAgPG5zMTppc0hpc3BhbmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVBbWVyaWNhbk93bmVk
QnVzaW5lc3M+ZmFsc2U8L25zMTppc05hdGl2ZUFtZXJpY2FuT3duZWRCdXNpbmVz
cz4KICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+ZmFs
c2U8L25zMTppc090aGVyTWlub3JpdHlPd25lZD48L25zMTptaW5vcml0eU93bmVk
PgogICAgICAgICAgICAgIDxuczE6aXNWZXJ5U21hbGxCdXNpbmVzcz5mYWxzZTwv
bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dv
bWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzRWNvbm9taWNhbGx5RGlz
YWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNF
Y29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+
CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZVdvbWVuT3duZWRTbWFs
bEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzSm9pbnRWZW50dXJlRWNv
bm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZh
bHNlPC9uczE6aXNKb2ludFZlbnR1cmVFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2Vk
V29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+PC9uczE6dmVuZG9yU29jaW9FY29ub21p
Y0luZGljYXRvcnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQnVzaW5lc3NUeXBl
cz4KICAgICAgICAgICAgICA8bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcGVkQ29ycG9y
YXRpb25Pd25lZEZpcm0+ZmFsc2U8L25zMTppc0NvbW11bml0eURldmVsb3BlZENv
cnBvcmF0aW9uT3duZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNMYWJvclN1
cnBsdXNBcmVhRmlybT5mYWxzZTwvbnMxOmlzTGFib3JTdXJwbHVzQXJlYUZpcm0+
CiAgICAgICAgICAgICAgPG5zMTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAg
ICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzRmVk
ZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzRmVkZXJhbGx5
RnVuZGVkUmVzZWFyY2hBbmREZXZlbG9wbWVudENvcnA+ZmFsc2U8L25zMTppc0Zl
ZGVyYWxseUZ1bmRlZFJlc2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPgogICAgICAg
ICAgICAgICAgPG5zMTppc0ZlZGVyYWxHb3Zlcm5tZW50QWdlbmN5PmZhbHNlPC9u
czE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT48L25zMTpmZWRlcmFsR292ZXJu
bWVudD4KICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVHb3Zlcm5tZW50PmZhbHNl
PC9uczE6aXNTdGF0ZUdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpsb2Nh
bEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5t
ZW50PmZhbHNlPC9uczE6aXNMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzQ2l0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzQ2l0eUxv
Y2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3VudHlMb2Nh
bEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NvdW50eUxvY2FsR292ZXJubWVudD4K
ICAgICAgICAgICAgICAgIDxuczE6aXNJbnRlck11bmljaXBhbExvY2FsR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+
CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5tZW50T3duZWQ+ZmFs
c2U8L25zMTppc0xvY2FsR292ZXJubWVudE93bmVkPgogICAgICAgICAgICAgICAg
PG5zMTppc011bmljaXBhbGl0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
TXVuaWNpcGFsaXR5TG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5z
MTppc1NjaG9vbERpc3RyaWN0TG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNT
Y2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxu
czE6aXNUb3duc2hpcExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVG93bnNo
aXBMb2NhbEdvdmVybm1lbnQ+PC9uczE6bG9jYWxHb3Zlcm5tZW50PgogICAgICAg
ICAgICAgIDxuczE6aXNUcmliYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNUcmli
YWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6aXNGb3JlaWduR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzRm9yZWlnbkdvdmVybm1lbnQ+CiAgICAgICAgICAg
ICAgPG5zMTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT4KICAgICAgICAgICAg
ICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlOb3RUYXhFeGVtcHQ+dHJ1ZTwvbnMx
OmlzQ29ycG9yYXRlRW50aXR5Tm90VGF4RXhlbXB0PgogICAgICAgICAgICAgICAg
PG5zMTppc0NvcnBvcmF0ZUVudGl0eVRheEV4ZW1wdD5mYWxzZTwvbnMxOmlzQ29y
cG9yYXRlRW50aXR5VGF4RXhlbXB0PgogICAgICAgICAgICAgICAgPG5zMTppc1Bh
cnRuZXJzaGlwT3JMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXA+ZmFsc2U8L25z
MTppc1BhcnRuZXJzaGlwT3JMaW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXA+CiAg
ICAgICAgICAgICAgICA8bnMxOmlzU29sZVByb3ByZWl0b3JzaGlwPmZhbHNlPC9u
czE6aXNTb2xlUHJvcHJlaXRvcnNoaXA+CiAgICAgICAgICAgICAgICA8bnMxOmlz
U21hbGxBZ3JpY3VsdHVyYWxDb29wZXJhdGl2ZT5mYWxzZTwvbnMxOmlzU21hbGxB
Z3JpY3VsdHVyYWxDb29wZXJhdGl2ZT4KICAgICAgICAgICAgICAgIDxuczE6aXNJ
bnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uPmZhbHNlPC9uczE6aXNJbnRlcm5hdGlv
bmFsT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPG5zMTppc1VTR292ZXJu
bWVudEVudGl0eT5mYWxzZTwvbnMxOmlzVVNHb3Zlcm5tZW50RW50aXR5PjwvbnMx
OmJ1c2luZXNzT3JPcmdhbml6YXRpb25UeXBlPjwvbnMxOnZlbmRvckJ1c2luZXNz
VHlwZXM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yTGluZU9mQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgPG5zMTppc0NvbW11bml0eURldmVsb3BtZW50Q29ycG9yYXRp
b24+ZmFsc2U8L25zMTppc0NvbW11bml0eURldmVsb3BtZW50Q29ycG9yYXRpb24+
CiAgICAgICAgICAgICAgPG5zMTppc0RvbWVzdGljU2hlbHRlcj5mYWxzZTwvbnMx
OmlzRG9tZXN0aWNTaGVsdGVyPgogICAgICAgICAgICAgIDxuczE6aXNFZHVjYXRp
b25hbEluc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNFZHVjYXRpb25hbEluc3RpdHV0
aW9uPgogICAgICAgICAgICAgIDxuczE6aXNGb3VuZGF0aW9uPmZhbHNlPC9uczE6
aXNGb3VuZGF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNIb3NwaXRhbD5mYWxz
ZTwvbnMxOmlzSG9zcGl0YWw+CiAgICAgICAgICAgICAgPG5zMTppc01hbnVmYWN0
dXJlck9mR29vZHM+ZmFsc2U8L25zMTppc01hbnVmYWN0dXJlck9mR29vZHM+CiAg
ICAgICAgICAgICAgPG5zMTppc1ZldGVyaW5hcnlIb3NwaXRhbD5mYWxzZTwvbnMx
OmlzVmV0ZXJpbmFyeUhvc3BpdGFsPgogICAgICAgICAgICAgIDxuczE6aXNIaXNw
YW5pY1NlcnZpY2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNIaXNwYW5pY1Nl
cnZpY2luZ0luc3RpdHV0aW9uPjwvbnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgog
ICAgICAgICAgICA8bnMxOnZlbmRvclJlbGF0aW9uc2hpcFdpdGhGZWRlcmFsR292
ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzPmZh
bHNlPC9uczE6cmVjZWl2ZXNDb250cmFjdHM+CiAgICAgICAgICAgICAgPG5zMTpy
ZWNlaXZlc0dyYW50cz5mYWxzZTwvbnMxOnJlY2VpdmVzR3JhbnRzPgogICAgICAg
ICAgICAgIDxuczE6cmVjZWl2ZXNDb250cmFjdHNBbmRHcmFudHM+dHJ1ZTwvbnMx
OnJlY2VpdmVzQ29udHJhY3RzQW5kR3JhbnRzPjwvbnMxOnZlbmRvclJlbGF0aW9u
c2hpcFdpdGhGZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAgPG5zMTp0eXBl
T2ZHb3Zlcm5tZW50RW50aXR5PgogICAgICAgICAgICAgIDxuczE6aXNBaXJwb3J0
QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNBaXJwb3J0QXV0aG9yaXR5PgogICAgICAg
ICAgICAgIDxuczE6aXNDb3VuY2lsT2ZHb3Zlcm5tZW50cz5mYWxzZTwvbnMxOmlz
Q291bmNpbE9mR292ZXJubWVudHM+CiAgICAgICAgICAgICAgPG5zMTppc0hvdXNp
bmdBdXRob3JpdGllc1B1YmxpY09yVHJpYmFsPmZhbHNlPC9uczE6aXNIb3VzaW5n
QXV0aG9yaXRpZXNQdWJsaWNPclRyaWJhbD4KICAgICAgICAgICAgICA8bnMxOmlz
SW50ZXJzdGF0ZUVudGl0eT5mYWxzZTwvbnMxOmlzSW50ZXJzdGF0ZUVudGl0eT4K
ICAgICAgICAgICAgICA8bnMxOmlzUGxhbm5pbmdDb21taXNzaW9uPmZhbHNlPC9u
czE6aXNQbGFubmluZ0NvbW1pc3Npb24+CiAgICAgICAgICAgICAgPG5zMTppc1Bv
cnRBdXRob3JpdHk+ZmFsc2U8L25zMTppc1BvcnRBdXRob3JpdHk+CiAgICAgICAg
ICAgICAgPG5zMTppc1RyYW5zaXRBdXRob3JpdHk+ZmFsc2U8L25zMTppc1RyYW5z
aXRBdXRob3JpdHk+PC9uczE6dHlwZU9mR292ZXJubWVudEVudGl0eT4KICAgICAg
ICAgICAgPG5zMTp2ZW5kb3JPcmdhbml6YXRpb25GYWN0b3JzPgogICAgICAgICAg
ICAgIDxuczE6aXNTdWJjaGFwdGVyU0NvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNT
dWJjaGFwdGVyU0NvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNMaW1p
dGVkTGlhYmlsaXR5Q29ycG9yYXRpb24+dHJ1ZTwvbnMxOmlzTGltaXRlZExpYWJp
bGl0eUNvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNGb3JlaWduT3du
ZWRBbmRMb2NhdGVkPmZhbHNlPC9uczE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVk
PgogICAgICAgICAgICAgIDxuczE6cHJvZml0U3RydWN0dXJlPgogICAgICAgICAg
ICAgICAgPG5zMTppc0ZvclByb2ZpdE9yZ2FuaXphdGlvbj50cnVlPC9uczE6aXNG
b3JQcm9maXRPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8bnMxOmlzTm9u
cHJvZml0T3JnYW5pemF0aW9uPmZhbHNlPC9uczE6aXNOb25wcm9maXRPcmdhbml6
YXRpb24+CiAgICAgICAgICAgICAgICA8bnMxOmlzT3RoZXJOb3RGb3JQcm9maXRP
cmdhbml6YXRpb24+ZmFsc2U8L25zMTppc090aGVyTm90Rm9yUHJvZml0T3JnYW5p
emF0aW9uPjwvbnMxOnByb2ZpdFN0cnVjdHVyZT4KICAgICAgICAgICAgICA8bnMx
OmlzU2hlbHRlcmVkV29ya3Nob3A+ZmFsc2U8L25zMTppc1NoZWx0ZXJlZFdvcmtz
aG9wPgogICAgICAgICAgICAgIDxuczE6c3RhdGVPZkluY29ycG9yYXRpb24gbmFt
ZT0iVklSR0lOSUEiPlZBPC9uczE6c3RhdGVPZkluY29ycG9yYXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTpjb3VudHJ5T2ZJbmNvcnBvcmF0aW9uIG5hbWU9IlVOSVRF
RCBTVEFURVMiPlVTQTwvbnMxOmNvdW50cnlPZkluY29ycG9yYXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTpvcmdhbml6YXRpb25hbFR5cGU+Q09SUE9SQVRFIE5PVCBU
QVggRVhFTVBUPC9uczE6b3JnYW5pemF0aW9uYWxUeXBlPgogICAgICAgICAgICAg
IDxuczE6bnVtYmVyT2ZFbXBsb3llZXM+MjQ1PC9uczE6bnVtYmVyT2ZFbXBsb3ll
ZXM+CiAgICAgICAgICAgICAgPG5zMTphbm51YWxSZXZlbnVlPjc3NTk0NDU3Njwv
bnMxOmFubnVhbFJldmVudWU+PC9uczE6dmVuZG9yT3JnYW5pemF0aW9uRmFjdG9y
cz4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZFZHVjYXRpb25hbEVudGl0eT4KICAg
ICAgICAgICAgICA8bnMxOmlzMTg2MkxhbmRHcmFudENvbGxlZ2U+ZmFsc2U8L25z
MTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXMx
ODkwTGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMxOmlzMTg5MExhbmRHcmFudENv
bGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppczE5OTRMYW5kR3JhbnRDb2xsZWdl
PmZhbHNlPC9uczE6aXMxOTk0TGFuZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAg
ICA8bnMxOmlzSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5PmZh
bHNlPC9uczE6aXNIaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHk+
CiAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+ZmFsc2U8
L25zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5zMTpp
c1ByaXZhdGVVbml2ZXJzaXR5T3JDb2xsZWdlPmZhbHNlPC9uczE6aXNQcml2YXRl
VW5pdmVyc2l0eU9yQ29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzU2Nob29s
T2ZGb3Jlc3RyeT5mYWxzZTwvbnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT4KICAgICAg
ICAgICAgICA8bnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25vZkhpZ2hl
ckxlYXJuaW5nPmZhbHNlPC9uczE6aXNTdGF0ZUNvbnRyb2xsZWRJbnN0aXR1dGlv
bm9mSGlnaGVyTGVhcm5pbmc+CiAgICAgICAgICAgICAgPG5zMTppc1RyaWJhbENv
bGxlZ2U+ZmFsc2U8L25zMTppc1RyaWJhbENvbGxlZ2U+CiAgICAgICAgICAgICAg
PG5zMTppc1ZldGVyaW5hcnlDb2xsZWdlPmZhbHNlPC9uczE6aXNWZXRlcmluYXJ5
Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzQWxhc2thbk5hdGl2ZVNlcnZp
Y2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNBbGFza2FuTmF0aXZlU2Vydmlj
aW5nSW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc05hdGl2ZUhhd2Fp
aWFuU2VydmljaW5nSW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc05hdGl2ZUhhd2Fp
aWFuU2VydmljaW5nSW5zdGl0dXRpb24+PC9uczE6dHlwZU9mRWR1Y2F0aW9uYWxF
bnRpdHk+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAg
ICAgICAgICAgICAgPG5zMTppc0RPVENlcnRpZmllZERpc2FkdmFudGFnZWRCdXNp
bmVzc0VudGVycHJpc2U+ZmFsc2U8L25zMTppc0RPVENlcnRpZmllZERpc2FkdmFu
dGFnZWRCdXNpbmVzc0VudGVycHJpc2U+CiAgICAgICAgICAgICAgPG5zMTppc1Nl
bGZDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxzZTwvbnMx
OmlzU2VsZkNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzPgogICAg
ICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRC
dXNpbmVzcz5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRh
Z2VkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRpZmllZDhB
UHJvZ3JhbVBhcnRpY2lwYW50PmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWQ4QVBy
b2dyYW1QYXJ0aWNpcGFudD4KICAgICAgICAgICAgICA8bnMxOmlzU2VsZkNlcnRp
ZmllZEhVQlpvbmVKb2ludFZlbnR1cmU+ZmFsc2U8L25zMTppc1NlbGZDZXJ0aWZp
ZWRIVUJab25lSm9pbnRWZW50dXJlPgogICAgICAgICAgICAgIDxuczE6aXNTQkFD
ZXJ0aWZpZWRIVUJab25lPmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWRIVUJab25l
PgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QUpvaW50VmVudHVy
ZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+PC9uczE6
dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yTG9j
YXRpb24+CiAgICAgICAgICAgICAgPG5zMTpzdHJlZXRBZGRyZXNzPjEzODYxIFNV
TlJJU0UgVkFMTEVZIERSIFNURSA0MDA8L25zMTpzdHJlZXRBZGRyZXNzPgogICAg
ICAgICAgICAgIDxuczE6Y2l0eT5IRVJORE9OPC9uczE6Y2l0eT4KICAgICAgICAg
ICAgICA8bnMxOnN0YXRlIG5hbWU9IlZJUkdJTklBIj5WQTwvbnMxOnN0YXRlPgog
ICAgICAgICAgICAgIDxuczE6WklQQ29kZT4yMDE3MTYxMjY8L25zMTpaSVBDb2Rl
PgogICAgICAgICAgICAgIDxuczE6Y291bnRyeUNvZGUgbmFtZT0iVU5JVEVEIFNU
QVRFUyI+VVNBPC9uczE6Y291bnRyeUNvZGU+CiAgICAgICAgICAgICAgPG5zMTpj
b25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjEwPC9uczE6Y29uZ3Jlc3Npb25hbERp
c3RyaWN0Q29kZT48L25zMTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JEVU5TSW5mb3JtYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpEVU5T
TnVtYmVyPjc4NjQ2ODE5OTwvbnMxOkRVTlNOdW1iZXI+CiAgICAgICAgICAgICAg
PG5zMTp2ZW5kb3JOYW1lPkRMVCBTT0xVVElPTlMsIExMQzwvbnMxOnZlbmRvck5h
bWU+CiAgICAgICAgICAgICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTnVtYmVyPjc4
NjQ2ODE5OTwvbnMxOmdsb2JhbFBhcmVudERVTlNOdW1iZXI+CiAgICAgICAgICAg
ICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT5ETFQgU09MVVRJT05TICBMTEM8
L25zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT48L25zMTp2ZW5kb3JEVU5TSW5mb3Jt
YXRpb24+CiAgICAgICAgICAgIDxuczE6Y2NyUmVnaXN0cmF0aW9uRGV0YWlscz48
L25zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxzPjwvbnMxOnZlbmRvclNpdGVEZXRh
aWxzPgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZXJCdXNpbmVzc1Np
emVEZXRlcm1pbmF0aW9uIGRlc2NyaXB0aW9uPSJPVEhFUiBUSEFOIFNNQUxMIEJV
U0lORVNTIj5PPC9uczE6Y29udHJhY3RpbmdPZmZpY2VyQnVzaW5lc3NTaXplRGV0
ZXJtaW5hdGlvbj48L25zMTp2ZW5kb3I+CiAgICAgICAgPG5zMTpwbGFjZU9mUGVy
Zm9ybWFuY2U+CiAgICAgICAgICA8bnMxOnByaW5jaXBhbFBsYWNlT2ZQZXJmb3Jt
YW5jZT4KICAgICAgICAgICAgPG5zMTpzdGF0ZUNvZGUgbmFtZT0iRElTVFJJQ1Qg
T0YgQ09MVU1CSUEiPkRDPC9uczE6c3RhdGVDb2RlPgogICAgICAgICAgICA8bnMx
OmNvdW50cnlDb2RlIG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNvdW50
cnlDb2RlPjwvbnMxOnByaW5jaXBhbFBsYWNlT2ZQZXJmb3JtYW5jZT4KICAgICAg
ICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNlWklQQ29kZSBjb3VudHk9IkRJU1RS
SUNUIE9GIENPTFVNQklBIiBjaXR5PSJXQVNISU5HVE9OIj4yMDIwMjAwMDE8L25z
MTpwbGFjZU9mUGVyZm9ybWFuY2VaSVBDb2RlPgogICAgICAgICAgPG5zMTpwbGFj
ZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFsRGlzdHJpY3Q+MDA8L25zMTpwbGFj
ZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFsRGlzdHJpY3Q+PC9uczE6cGxhY2VP
ZlBlcmZvcm1hbmNlPgogICAgICAgIDxuczE6Y29tcGV0aXRpb24+CiAgICAgICAg
ICA8bnMxOmV4dGVudENvbXBldGVkIGRlc2NyaXB0aW9uPSJGVUxMIEFORCBPUEVO
IENPTVBFVElUSU9OIj5BPC9uczE6ZXh0ZW50Q29tcGV0ZWQ+CiAgICAgICAgICA8
bnMxOnNvbGljaXRhdGlvblByb2NlZHVyZXMgZGVzY3JpcHRpb249IlNVQkpFQ1Qg
VE8gTVVMVElQTEUgQVdBUkQgRkFJUiBPUFBPUlRVTklUWSI+TUFGTzwvbnMxOnNv
bGljaXRhdGlvblByb2NlZHVyZXM+CiAgICAgICAgICA8bnMxOnR5cGVPZlNldEFz
aWRlIGRlc2NyaXB0aW9uPSJOTyBTRVQgQVNJREUgVVNFRC4iPk5PTkU8L25zMTp0
eXBlT2ZTZXRBc2lkZT4KICAgICAgICAgIDxuczE6ZXZhbHVhdGVkUHJlZmVyZW5j
ZSBkZXNjcmlwdGlvbj0iTk8gUFJFRkVSRU5DRSBVU0VEIj5OT05FPC9uczE6ZXZh
bHVhdGVkUHJlZmVyZW5jZT4KICAgICAgICAgIDxuczE6c3RhdHV0b3J5RXhjZXB0
aW9uVG9GYWlyT3Bwb3J0dW5pdHkgZGVzY3JpcHRpb249IkZBSVIgT1BQT1JUVU5J
VFkgR0lWRU4iPkZBSVI8L25zMTpzdGF0dXRvcnlFeGNlcHRpb25Ub0ZhaXJPcHBv
cnR1bml0eT4KICAgICAgICAgIDxuczE6bnVtYmVyT2ZPZmZlcnNSZWNlaXZlZD4x
PC9uczE6bnVtYmVyT2ZPZmZlcnNSZWNlaXZlZD4KICAgICAgICAgIDxuczE6Y29t
bWVyY2lhbEl0ZW1BY3F1aXNpdGlvblByb2NlZHVyZXMgZGVzY3JpcHRpb249IkNP
TU1FUkNJQUwgSVRFTSI+QTwvbnMxOmNvbW1lcmNpYWxJdGVtQWNxdWlzaXRpb25Q
cm9jZWR1cmVzPgogICAgICAgICAgPG5zMTpjb21tZXJjaWFsSXRlbVRlc3RQcm9n
cmFtIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbW1lcmNpYWxJdGVtVGVzdFBy
b2dyYW0+CiAgICAgICAgICA8bnMxOkE3NkFjdGlvbiBkZXNjcmlwdGlvbj0iTk8i
Pk48L25zMTpBNzZBY3Rpb24+CiAgICAgICAgICA8bnMxOmZlZEJpek9wcHMgZGVz
Y3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6ZmVkQml6T3Bwcz4KICAg
ICAgICAgIDxuczE6bG9jYWxBcmVhU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIj5O
PC9uczE6bG9jYWxBcmVhU2V0QXNpZGU+PC9uczE6Y29tcGV0aXRpb24+CiAgICAg
ICAgPG5zMTpwcmVmZXJlbmNlUHJvZ3JhbXM+PC9uczE6cHJlZmVyZW5jZVByb2dy
YW1zPgogICAgICAgIDxuczE6dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj4KICAgICAg
ICAgIDxuczE6Y3JlYXRlZEJ5PktBUkwuTC5GRUhSTUFOQEVELkdPVjwvbnMxOmNy
ZWF0ZWRCeT4KICAgICAgICAgIDxuczE6Y3JlYXRlZERhdGU+MjAxMi0wNS0wOCAx
Mzo0MTowNjwvbnMxOmNyZWF0ZWREYXRlPgogICAgICAgICAgPG5zMTpsYXN0TW9k
aWZpZWRCeT5JRFZfQ09SUkVDVDwvbnMxOmxhc3RNb2RpZmllZEJ5PgogICAgICAg
ICAgPG5zMTpsYXN0TW9kaWZpZWREYXRlPjIwMTYtMDItMTYgMTM6MTA6MTY8L25z
MTpsYXN0TW9kaWZpZWREYXRlPgogICAgICAgICAgPG5zMTpzdGF0dXMgZGVzY3Jp
cHRpb249IkZJTkFMIj5GPC9uczE6c3RhdHVzPgogICAgICAgICAgPG5zMTphcHBy
b3ZlZEJ5Pk1JQ0hBRUwuSE9MTE9XQVlARUQuR09WPC9uczE6YXBwcm92ZWRCeT4K
ICAgICAgICAgIDxuczE6YXBwcm92ZWREYXRlPjIwMTItMDUtMTEgMTA6MTM6MzE8
L25zMTphcHByb3ZlZERhdGU+PC9uczE6dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj48
L25zMTphd2FyZD4KICAgIDwvY29udGVudD4KICA8L2VudHJ5PgogIDxlbnRyeT4K
ICAgIDx0aXRsZT48IVtDREFUQVtQVVJDSEFTRSBPUkRFUiBESkYxNTI2MDBQMDAw
ODg3NyAoMSkgYXdhcmRlZCB0byBTS0lMTEJVSUxERVJTIElOQywgd2FzIG1vZGlm
aWVkIGZvciB0aGUgYW1vdW50IG9mICQwXV0+PC90aXRsZT4KICAgIDxsaW5rIHJl
bD0iYWx0ZXJuYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiIGhyZWY9Imh0dHBzOi8vd3d3
LmZwZHMuZ292L2V6c2VhcmNoL3NlYXJjaC5kbz9zPUZQRFMmYW1wO2luZGV4TmFt
ZT1hd2FyZGZ1bGwmYW1wO3RlbXBsYXRlTmFtZT0xLjUuMSZhbXA7cT1ESkYxNTI2
MDBQMDAwODg3NysxNTQ5KyI+PC9saW5rPgogICAgPG1vZGlmaWVkPjIwMTYtMDkt
MTUgMTA6Mzc6MTQ8L21vZGlmaWVkPgogICAgPGNvbnRlbnQgeG1sbnM6bnMxPSJo
dHRwczovL3d3dy5mcGRzLmdvdi9GUERTIiB0eXBlPSJhcHBsaWNhdGlvbi94bWwi
PgogICAgICA8bnMxOmF3YXJkIHhtbG5zOm5zMT0iaHR0cDovL3d3dy5mcGRzbmcu
Y29tL0ZQRFMiIHZlcnNpb249IjEuNCI+CiAgICAgICAgPG5zMTphd2FyZElEPgog
ICAgICAgICAgPG5zMTphd2FyZENvbnRyYWN0SUQ+CiAgICAgICAgICAgIDxuczE6
YWdlbmN5SUQgbmFtZT0iRkVERVJBTCBCVVJFQVUgT0YgSU5WRVNUSUdBVElPTiI+
MTU0OTwvbnMxOmFnZW5jeUlEPgogICAgICAgICAgICA8bnMxOlBJSUQ+REpGMTUy
NjAwUDAwMDg4Nzc8L25zMTpQSUlEPgogICAgICAgICAgICA8bnMxOm1vZE51bWJl
cj4xPC9uczE6bW9kTnVtYmVyPgogICAgICAgICAgICA8bnMxOnRyYW5zYWN0aW9u
TnVtYmVyPjA8L25zMTp0cmFuc2FjdGlvbk51bWJlcj48L25zMTphd2FyZENvbnRy
YWN0SUQ+PC9uczE6YXdhcmRJRD4KICAgICAgICA8bnMxOnJlbGV2YW50Q29udHJh
Y3REYXRlcz4KICAgICAgICAgIDxuczE6c2lnbmVkRGF0ZT4yMDE1LTEwLTMwIDAw
OjAwOjAwPC9uczE6c2lnbmVkRGF0ZT4KICAgICAgICAgIDxuczE6ZWZmZWN0aXZl
RGF0ZT4yMDE1LTEwLTMwIDAwOjAwOjAwPC9uczE6ZWZmZWN0aXZlRGF0ZT4KICAg
ICAgICAgIDxuczE6Y3VycmVudENvbXBsZXRpb25EYXRlPjIwMTUtMTAtMzAgMDA6
MDA6MDA8L25zMTpjdXJyZW50Q29tcGxldGlvbkRhdGU+CiAgICAgICAgICA8bnMx
OnVsdGltYXRlQ29tcGxldGlvbkRhdGU+MjAxNS0xMC0zMCAwMDowMDowMDwvbnMx
OnVsdGltYXRlQ29tcGxldGlvbkRhdGU+PC9uczE6cmVsZXZhbnRDb250cmFjdERh
dGVzPgogICAgICAgIDxuczE6ZG9sbGFyVmFsdWVzPgogICAgICAgICAgPG5zMTpv
YmxpZ2F0ZWRBbW91bnQ+MC4wMDwvbnMxOm9ibGlnYXRlZEFtb3VudD4KICAgICAg
ICAgIDxuczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4wLjAwPC9uczE6
YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4KICAgICAgICAgIDxuczE6YmFz
ZUFuZEFsbE9wdGlvbnNWYWx1ZT4wLjAwPC9uczE6YmFzZUFuZEFsbE9wdGlvbnNW
YWx1ZT48L25zMTpkb2xsYXJWYWx1ZXM+CiAgICAgICAgPG5zMTp0b3RhbERvbGxh
clZhbHVlcz4KICAgICAgICAgIDxuczE6dG90YWxPYmxpZ2F0ZWRBbW91bnQ+MTUw
MDAuMDA8L25zMTp0b3RhbE9ibGlnYXRlZEFtb3VudD4KICAgICAgICAgIDxuczE6
dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPjE1MDAwLjAwPC9uczE6
dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPgogICAgICAgICAgPG5z
MTp0b3RhbEJhc2VBbmRBbGxPcHRpb25zVmFsdWU+MTUwMDAuMDA8L25zMTp0b3Rh
bEJhc2VBbmRBbGxPcHRpb25zVmFsdWU+PC9uczE6dG90YWxEb2xsYXJWYWx1ZXM+
CiAgICAgICAgPG5zMTpwdXJjaGFzZXJJbmZvcm1hdGlvbj4KICAgICAgICAgIDxu
czE6Y29udHJhY3RpbmdPZmZpY2VBZ2VuY3lJRCBuYW1lPSJGRURFUkFMIEJVUkVB
VSBPRiBJTlZFU1RJR0FUSU9OIiBkZXBhcnRtZW50SUQ9IjE1MDAiIGRlcGFydG1l
bnROYW1lPSJKVVNUSUNFLCBERVBBUlRNRU5UIE9GIj4xNTQ5PC9uczE6Y29udHJh
Y3RpbmdPZmZpY2VBZ2VuY3lJRD4KICAgICAgICAgIDxuczE6Y29udHJhY3RpbmdP
ZmZpY2VJRCBuYW1lPSJERVBUIE9GIEpVU1QvRkVERVJBTCBCVVJFQVUgT0YgSU5W
RVNUSUdBVElPTiIgY291bnRyeT0iVVNBIj5QRFMwMjwvbnMxOmNvbnRyYWN0aW5n
T2ZmaWNlSUQ+CiAgICAgICAgICA8bnMxOmZ1bmRpbmdSZXF1ZXN0aW5nQWdlbmN5
SUQgbmFtZT0iRkVERVJBTCBCVVJFQVUgT0YgSU5WRVNUSUdBVElPTiIgZGVwYXJ0
bWVudElEPSIxNTAwIiBkZXBhcnRtZW50TmFtZT0iSlVTVElDRSwgREVQQVJUTUVO
VCBPRiI+MTU0OTwvbnMxOmZ1bmRpbmdSZXF1ZXN0aW5nQWdlbmN5SUQ+CiAgICAg
ICAgICA8bnMxOmZ1bmRpbmdSZXF1ZXN0aW5nT2ZmaWNlSUQgbmFtZT0iREVQVCBP
RiBKVVNUL0ZFREVSQUwgQlVSRUFVIE9GIElOVkVTVElHQVRJT04iPlBEUzAyPC9u
czE6ZnVuZGluZ1JlcXVlc3RpbmdPZmZpY2VJRD4KICAgICAgICAgIDxuczE6Zm9y
ZWlnbkZ1bmRpbmcgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6
Zm9yZWlnbkZ1bmRpbmc+PC9uczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAgICAg
ICAgPG5zMTpjb250cmFjdE1hcmtldGluZ0RhdGE+CiAgICAgICAgICA8bnMxOmZl
ZVBhaWRGb3JVc2VPZlNlcnZpY2U+MC4wMDwvbnMxOmZlZVBhaWRGb3JVc2VPZlNl
cnZpY2U+PC9uczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAgIDxuczE6
Y29udHJhY3REYXRhPgogICAgICAgICAgPG5zMTpjb250cmFjdEFjdGlvblR5cGUg
ZGVzY3JpcHRpb249IlBVUkNIQVNFIE9SREVSIj5CPC9uczE6Y29udHJhY3RBY3Rp
b25UeXBlPgogICAgICAgICAgPG5zMTp0eXBlT2ZDb250cmFjdFByaWNpbmcgZGVz
Y3JpcHRpb249IkZJUk0gRklYRUQgUFJJQ0UiPko8L25zMTp0eXBlT2ZDb250cmFj
dFByaWNpbmc+CiAgICAgICAgICA8bnMxOnJlYXNvbkZvck1vZGlmaWNhdGlvbiBk
ZXNjcmlwdGlvbj0iQ0xPU0UgT1VUIj5LPC9uczE6cmVhc29uRm9yTW9kaWZpY2F0
aW9uPgogICAgICAgICAgPG5zMTpuYXRpb25hbEludGVyZXN0QWN0aW9uQ29kZSBk
ZXNjcmlwdGlvbj0iTk9ORSI+Tk9ORTwvbnMxOm5hdGlvbmFsSW50ZXJlc3RBY3Rp
b25Db2RlPgogICAgICAgICAgPG5zMTpkZXNjcmlwdGlvbk9mQ29udHJhY3RSZXF1
aXJlbWVudD4iSUdGOjpDTDo6SUdGIgoKCgoKVEhJUyBXSUxMIEJFIEFOIE9OTElO
RSBDTEFTUyBGT1IgMTAgQVBQTElDQVRJT04gREVWRUxPUEVSUy4gIEVBQ0ggREVW
RUxPUEVSIFdJTEwgQUNDRVNTIFRIRSBUUkFJTklORyBGUk9NIEVJVEhFUiBBIEhP
TUUgQ09NUFVURVIgT1IgT05FIE9OIFVORVQuICBDT1VSU0UgVE9QSUNTIElOQ0xV
REUgU1FMIFNUQVRFTUVOVCBQUk9DRVNTSU5HLCBQTC9TUUwgVFVOSU5HLCBWSUVX
SU5HIFRIRSBFWEVDVVRJT04gUExBTiwgVEhFIElNUE9SVEFOQzwvbnMxOmRlc2Ny
aXB0aW9uT2ZDb250cmFjdFJlcXVpcmVtZW50PgogICAgICAgICAgPG5zMTppbmhl
cmVudGx5R292ZXJubWVudGFsRnVuY3Rpb24gZGVzY3JpcHRpb249IkNMT1NFTFkg
QVNTT0NJQVRFRCI+Q0w8L25zMTppbmhlcmVudGx5R292ZXJubWVudGFsRnVuY3Rp
b24+CiAgICAgICAgICA8bnMxOkdGRS1HRlAgZGVzY3JpcHRpb249IlRyYW5zYWN0
aW9uIGRvZXMgbm90IHVzZSBHRkUvR0ZQIj5OPC9uczE6R0ZFLUdGUD4KICAgICAg
ICAgIDxuczE6dW5kZWZpbml0aXplZEFjdGlvbiBkZXNjcmlwdGlvbj0iTk8iPlg8
L25zMTp1bmRlZmluaXRpemVkQWN0aW9uPgogICAgICAgICAgPG5zMTpjb25zb2xp
ZGF0ZWRDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb25zb2xpZGF0
ZWRDb250cmFjdD4KICAgICAgICAgIDxuczE6cGVyZm9ybWFuY2VCYXNlZFNlcnZp
Y2VDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8gLSBTRVJWSUNFIFdIRVJFIFBCQSBJ
UyBOT1QgVVNFRC4iPk48L25zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNvbnRy
YWN0PgogICAgICAgICAgPG5zMTpjb250aW5nZW5jeUh1bWFuaXRhcmlhblBlYWNl
a2VlcGluZ09wZXJhdGlvbiBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8
L25zMTpjb250aW5nZW5jeUh1bWFuaXRhcmlhblBlYWNla2VlcGluZ09wZXJhdGlv
bj4KICAgICAgICAgIDxuczE6bGlzdE9mVHJlYXN1cnlBY2NvdW50cz4KICAgICAg
ICAgICAgPG5zMTp0cmVhc3VyeUFjY291bnQ+CiAgICAgICAgICAgICAgPG5zMTp0
cmVhc3VyeUFjY291bnRTeW1ib2w+CiAgICAgICAgICAgICAgICA8bnMxOmFnZW5j
eUlkZW50aWZpZXI+MTU8L25zMTphZ2VuY3lJZGVudGlmaWVyPgogICAgICAgICAg
ICAgICAgPG5zMTptYWluQWNjb3VudENvZGU+MDIwMDwvbnMxOm1haW5BY2NvdW50
Q29kZT4KICAgICAgICAgICAgICAgIDxuczE6c3ViQWNjb3VudENvZGU+MDAwPC9u
czE6c3ViQWNjb3VudENvZGU+PC9uczE6dHJlYXN1cnlBY2NvdW50U3ltYm9sPjwv
bnMxOnRyZWFzdXJ5QWNjb3VudD48L25zMTpsaXN0T2ZUcmVhc3VyeUFjY291bnRz
PgogICAgICAgICAgPG5zMTpwdXJjaGFzZUNhcmRBc1BheW1lbnRNZXRob2QgZGVz
Y3JpcHRpb249IllFUyI+WTwvbnMxOnB1cmNoYXNlQ2FyZEFzUGF5bWVudE1ldGhv
ZD4KICAgICAgICAgIDxuczE6bnVtYmVyT2ZBY3Rpb25zPjE8L25zMTpudW1iZXJP
ZkFjdGlvbnM+PC9uczE6Y29udHJhY3REYXRhPgogICAgICAgIDxuczE6bGVnaXNs
YXRpdmVNYW5kYXRlcz4KICAgICAgICAgIDxuczE6Q2xpbmdlckNvaGVuQWN0IGRl
c2NyaXB0aW9uPSJOTyI+TjwvbnMxOkNsaW5nZXJDb2hlbkFjdD4KICAgICAgICAg
IDxuczE6bWF0ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudCBkZXNjcmlw
dGlvbj0iTk8iPk48L25zMTptYXRlcmlhbHNTdXBwbGllc0FydGljbGVzRXF1aXBt
ZW50PgogICAgICAgICAgPG5zMTpsYWJvclN0YW5kYXJkcyBkZXNjcmlwdGlvbj0i
Tk8iPk48L25zMTpsYWJvclN0YW5kYXJkcz4KICAgICAgICAgIDxuczE6Y29uc3Ry
dWN0aW9uV2FnZVJhdGVSZXF1aXJlbWVudHMgZGVzY3JpcHRpb249Ik5PIj5OPC9u
czE6Y29uc3RydWN0aW9uV2FnZVJhdGVSZXF1aXJlbWVudHM+CiAgICAgICAgICA8
bnMxOmxpc3RPZkFkZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+PC9uczE6bGlzdE9m
QWRkaXRpb25hbFJlcG9ydGluZ1ZhbHVlcz4KICAgICAgICAgIDxuczE6aW50ZXJh
Z2VuY3lDb250cmFjdGluZ0F1dGhvcml0eSBkZXNjcmlwdGlvbj0iTk9UIEFQUExJ
Q0FCTEUiPlg8L25zMTppbnRlcmFnZW5jeUNvbnRyYWN0aW5nQXV0aG9yaXR5Pjwv
bnMxOmxlZ2lzbGF0aXZlTWFuZGF0ZXM+CiAgICAgICAgPG5zMTpwcm9kdWN0T3JT
ZXJ2aWNlSW5mb3JtYXRpb24+CiAgICAgICAgICA8bnMxOnByb2R1Y3RPclNlcnZp
Y2VDb2RlIGRlc2NyaXB0aW9uPSJFRFVDQVRJT04vVFJBSU5JTkctIElORk9STUFU
SU9OIFRFQ0hOT0xPR1kvVEVMRUNPTU1VTklDQVRJT05TIFRSQUlOSU5HIiBwcm9k
dWN0T3JTZXJ2aWNlVHlwZT0iU0VSVklDRSI+VTAxMjwvbnMxOnByb2R1Y3RPclNl
cnZpY2VDb2RlPgogICAgICAgICAgPG5zMTpjb250cmFjdEJ1bmRsaW5nIGRlc2Ny
aXB0aW9uPSJOT1QgQSBCVU5ETEVEIFJFUVVJUkVNRU5UIj5EPC9uczE6Y29udHJh
Y3RCdW5kbGluZz4KICAgICAgICAgIDxuczE6cHJpbmNpcGFsTkFJQ1NDb2RlIGRl
c2NyaXB0aW9uPSJDT01QVVRFUiBUUkFJTklORyI+NjExNDIwPC9uczE6cHJpbmNp
cGFsTkFJQ1NDb2RlPgogICAgICAgICAgPG5zMTpyZWNvdmVyZWRNYXRlcmlhbENs
YXVzZXMgZGVzY3JpcHRpb249Ik5PIENMQVVTRVMgSU5DTFVERUQgQU5EIE5PIFNV
U1RBSU5BQklMSVRZIElOQ0xVREVEIj5DPC9uczE6cmVjb3ZlcmVkTWF0ZXJpYWxD
bGF1c2VzPgogICAgICAgICAgPG5zMTp1c2VPZkVQQURlc2lnbmF0ZWRQcm9kdWN0
cyBkZXNjcmlwdGlvbj0iTUVFVFMgUkVRVUlSRU1FTlRTIj5BPC9uczE6dXNlT2ZF
UEFEZXNpZ25hdGVkUHJvZHVjdHM+CiAgICAgICAgICA8bnMxOmNvdW50cnlPZk9y
aWdpbiBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZPcmln
aW4+CiAgICAgICAgICA8bnMxOnBsYWNlT2ZNYW51ZmFjdHVyZSBkZXNjcmlwdGlv
bj0iTk9UIEEgTUFOVUZBQ1RVUkVEIEVORCBQUk9EVUNUIj5DPC9uczE6cGxhY2VP
Zk1hbnVmYWN0dXJlPjwvbnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1hdGlvbj4K
ICAgICAgICA8bnMxOnZlbmRvcj4KICAgICAgICAgIDxuczE6dmVuZG9ySGVhZGVy
PgogICAgICAgICAgICA8bnMxOnZlbmRvck5hbWU+U0tJTExCVUlMREVSUyBJTkM8
L25zMTp2ZW5kb3JOYW1lPjwvbnMxOnZlbmRvckhlYWRlcj4KICAgICAgICAgIDxu
czE6dmVuZG9yU2l0ZURldGFpbHM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yU29j
aW9FY29ub21pY0luZGljYXRvcnM+CiAgICAgICAgICAgICAgPG5zMTppc0FsYXNr
YW5OYXRpdmVPd25lZENvcnBvcmF0aW9uT3JGaXJtPmZhbHNlPC9uczE6aXNBbGFz
a2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT4KICAgICAgICAgICAgICA8
bnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD5mYWxzZTwvbnMxOmlzQW1lcmljYW5J
bmRpYW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOmlzSW5kaWFuVHJpYmU+ZmFs
c2U8L25zMTppc0luZGlhblRyaWJlPgogICAgICAgICAgICAgIDxuczE6aXNOYXRp
dmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JGaXJtPmZhbHNlPC9uczE6aXNO
YXRpdmVIYXdhaWlhbk93bmVkT3JnYW5pemF0aW9uT3JGaXJtPgogICAgICAgICAg
ICAgIDxuczE6aXNUcmliYWxseU93bmVkRmlybT5mYWxzZTwvbnMxOmlzVHJpYmFs
bHlPd25lZEZpcm0+CiAgICAgICAgICAgICAgPG5zMTppc1ZldGVyYW5Pd25lZD5m
YWxzZTwvbnMxOmlzVmV0ZXJhbk93bmVkPgogICAgICAgICAgICAgIDxuczE6aXNT
ZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVkQnVzaW5lc3M+ZmFsc2U8
L25zMTppc1NlcnZpY2VSZWxhdGVkRGlzYWJsZWRWZXRlcmFuT3duZWRCdXNpbmVz
cz4KICAgICAgICAgICAgICA8bnMxOmlzV29tZW5Pd25lZD5mYWxzZTwvbnMxOmlz
V29tZW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOm1pbm9yaXR5T3duZWQ+CiAg
ICAgICAgICAgICAgICA8bnMxOmlzTWlub3JpdHlPd25lZD5mYWxzZTwvbnMxOmlz
TWlub3JpdHlPd25lZD4KICAgICAgICAgICAgICAgIDxuczE6aXNTdWJDb250aW5l
bnRBc2lhbkFtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU3ViQ29u
dGluZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNl
PC9uczE6aXNBc2lhblBhY2lmaWNBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAg
ICAgICAgICAgICA8bnMxOmlzQmxhY2tBbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFs
c2U8L25zMTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAg
ICAgICAgPG5zMTppc0hpc3BhbmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNl
PC9uczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAgICAgICAg
ICAgICAgIDxuczE6aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8
L25zMTppc05hdGl2ZUFtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAgICAgICAgICAg
ICAgIDxuczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+ZmFsc2U8L25zMTppc090aGVy
TWlub3JpdHlPd25lZD48L25zMTptaW5vcml0eU93bmVkPgogICAgICAgICAgICAg
IDxuczE6aXNWZXJ5U21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzVmVyeVNtYWxsQnVz
aW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dvbWVuT3duZWRTbWFsbEJ1c2lu
ZXNzPmZhbHNlPC9uczE6aXNXb21lbk93bmVkU21hbGxCdXNpbmVzcz4KICAgICAg
ICAgICAgICA8bnMxOmlzRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3du
ZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNFY29ub21pY2FsbHlEaXNhZHZh
bnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5z
MTppc0pvaW50VmVudHVyZVdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9u
czE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21hbGxCdXNpbmVzcz4KICAgICAg
ICAgICAgICA8bnMxOmlzSm9pbnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50
YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2ludFZl
bnR1cmVFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVz
aW5lc3M+PC9uczE6dmVuZG9yU29jaW9FY29ub21pY0luZGljYXRvcnM+CiAgICAg
ICAgICAgIDxuczE6dmVuZG9yQnVzaW5lc3NUeXBlcz4KICAgICAgICAgICAgICA8
bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcGVkQ29ycG9yYXRpb25Pd25lZEZpcm0+ZmFs
c2U8L25zMTppc0NvbW11bml0eURldmVsb3BlZENvcnBvcmF0aW9uT3duZWRGaXJt
PgogICAgICAgICAgICAgIDxuczE6aXNMYWJvclN1cnBsdXNBcmVhRmlybT5mYWxz
ZTwvbnMxOmlzTGFib3JTdXJwbHVzQXJlYUZpcm0+CiAgICAgICAgICAgICAgPG5z
MTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNGZWRl
cmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzRmVkZXJhbEdvdmVybm1lbnQ+CiAg
ICAgICAgICAgICAgICA8bnMxOmlzRmVkZXJhbGx5RnVuZGVkUmVzZWFyY2hBbmRE
ZXZlbG9wbWVudENvcnA+ZmFsc2U8L25zMTppc0ZlZGVyYWxseUZ1bmRlZFJlc2Vh
cmNoQW5kRGV2ZWxvcG1lbnRDb3JwPgogICAgICAgICAgICAgICAgPG5zMTppc0Zl
ZGVyYWxHb3Zlcm5tZW50QWdlbmN5PmZhbHNlPC9uczE6aXNGZWRlcmFsR292ZXJu
bWVudEFnZW5jeT48L25zMTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAg
ICA8bnMxOmlzU3RhdGVHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNTdGF0ZUdvdmVy
bm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpsb2NhbEdvdmVybm1lbnQ+CiAgICAg
ICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNM
b2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ2l0eUxvY2Fs
R292ZXJubWVudD5mYWxzZTwvbnMxOmlzQ2l0eUxvY2FsR292ZXJubWVudD4KICAg
ICAgICAgICAgICAgIDxuczE6aXNDb3VudHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8
L25zMTppc0NvdW50eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxu
czE6aXNJbnRlck11bmljaXBhbExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
SW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8
bnMxOmlzTG9jYWxHb3Zlcm5tZW50T3duZWQ+ZmFsc2U8L25zMTppc0xvY2FsR292
ZXJubWVudE93bmVkPgogICAgICAgICAgICAgICAgPG5zMTppc011bmljaXBhbGl0
eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzTXVuaWNpcGFsaXR5TG9jYWxH
b3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc1NjaG9vbERpc3RyaWN0
TG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNTY2hvb2xEaXN0cmljdExvY2Fs
R292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNUb3duc2hpcExvY2Fs
R292ZXJubWVudD5mYWxzZTwvbnMxOmlzVG93bnNoaXBMb2NhbEdvdmVybm1lbnQ+
PC9uczE6bG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6aXNUcmli
YWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNUcmliYWxHb3Zlcm5tZW50PgogICAg
ICAgICAgICAgIDxuczE6aXNGb3JlaWduR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
Rm9yZWlnbkdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpidXNpbmVzc09y
T3JnYW5pemF0aW9uVHlwZT4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3Jwb3Jh
dGVFbnRpdHlOb3RUYXhFeGVtcHQ+dHJ1ZTwvbnMxOmlzQ29ycG9yYXRlRW50aXR5
Tm90VGF4RXhlbXB0PgogICAgICAgICAgICAgICAgPG5zMTppc0NvcnBvcmF0ZUVu
dGl0eVRheEV4ZW1wdD5mYWxzZTwvbnMxOmlzQ29ycG9yYXRlRW50aXR5VGF4RXhl
bXB0PgogICAgICAgICAgICAgICAgPG5zMTppc1BhcnRuZXJzaGlwT3JMaW1pdGVk
TGlhYmlsaXR5UGFydG5lcnNoaXA+ZmFsc2U8L25zMTppc1BhcnRuZXJzaGlwT3JM
aW1pdGVkTGlhYmlsaXR5UGFydG5lcnNoaXA+CiAgICAgICAgICAgICAgICA8bnMx
OmlzU29sZVByb3ByZWl0b3JzaGlwPmZhbHNlPC9uczE6aXNTb2xlUHJvcHJlaXRv
cnNoaXA+CiAgICAgICAgICAgICAgICA8bnMxOmlzU21hbGxBZ3JpY3VsdHVyYWxD
b29wZXJhdGl2ZT5mYWxzZTwvbnMxOmlzU21hbGxBZ3JpY3VsdHVyYWxDb29wZXJh
dGl2ZT4KICAgICAgICAgICAgICAgIDxuczE6aXNJbnRlcm5hdGlvbmFsT3JnYW5p
emF0aW9uPmZhbHNlPC9uczE6aXNJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uPgog
ICAgICAgICAgICAgICAgPG5zMTppc1VTR292ZXJubWVudEVudGl0eT5mYWxzZTwv
bnMxOmlzVVNHb3Zlcm5tZW50RW50aXR5PjwvbnMxOmJ1c2luZXNzT3JPcmdhbml6
YXRpb25UeXBlPjwvbnMxOnZlbmRvckJ1c2luZXNzVHlwZXM+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yTGluZU9mQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTpp
c0NvbW11bml0eURldmVsb3BtZW50Q29ycG9yYXRpb24+ZmFsc2U8L25zMTppc0Nv
bW11bml0eURldmVsb3BtZW50Q29ycG9yYXRpb24+CiAgICAgICAgICAgICAgPG5z
MTppc0RvbWVzdGljU2hlbHRlcj5mYWxzZTwvbnMxOmlzRG9tZXN0aWNTaGVsdGVy
PgogICAgICAgICAgICAgIDxuczE6aXNFZHVjYXRpb25hbEluc3RpdHV0aW9uPmZh
bHNlPC9uczE6aXNFZHVjYXRpb25hbEluc3RpdHV0aW9uPgogICAgICAgICAgICAg
IDxuczE6aXNGb3VuZGF0aW9uPmZhbHNlPC9uczE6aXNGb3VuZGF0aW9uPgogICAg
ICAgICAgICAgIDxuczE6aXNIb3NwaXRhbD5mYWxzZTwvbnMxOmlzSG9zcGl0YWw+
CiAgICAgICAgICAgICAgPG5zMTppc01hbnVmYWN0dXJlck9mR29vZHM+ZmFsc2U8
L25zMTppc01hbnVmYWN0dXJlck9mR29vZHM+CiAgICAgICAgICAgICAgPG5zMTpp
c1ZldGVyaW5hcnlIb3NwaXRhbD5mYWxzZTwvbnMxOmlzVmV0ZXJpbmFyeUhvc3Bp
dGFsPgogICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY1NlcnZpY2luZ0luc3Rp
dHV0aW9uPmZhbHNlPC9uczE6aXNIaXNwYW5pY1NlcnZpY2luZ0luc3RpdHV0aW9u
PjwvbnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgogICAgICAgICAgICA8bnMxOnZl
bmRvclJlbGF0aW9uc2hpcFdpdGhGZWRlcmFsR292ZXJubWVudD4KICAgICAgICAg
ICAgICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzPmZhbHNlPC9uczE6cmVjZWl2ZXND
b250cmFjdHM+CiAgICAgICAgICAgICAgPG5zMTpyZWNlaXZlc0dyYW50cz5mYWxz
ZTwvbnMxOnJlY2VpdmVzR3JhbnRzPgogICAgICAgICAgICAgIDxuczE6cmVjZWl2
ZXNDb250cmFjdHNBbmRHcmFudHM+dHJ1ZTwvbnMxOnJlY2VpdmVzQ29udHJhY3Rz
QW5kR3JhbnRzPjwvbnMxOnZlbmRvclJlbGF0aW9uc2hpcFdpdGhGZWRlcmFsR292
ZXJubWVudD4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZHb3Zlcm5tZW50RW50aXR5
PgogICAgICAgICAgICAgIDxuczE6aXNBaXJwb3J0QXV0aG9yaXR5PmZhbHNlPC9u
czE6aXNBaXJwb3J0QXV0aG9yaXR5PgogICAgICAgICAgICAgIDxuczE6aXNDb3Vu
Y2lsT2ZHb3Zlcm5tZW50cz5mYWxzZTwvbnMxOmlzQ291bmNpbE9mR292ZXJubWVu
dHM+CiAgICAgICAgICAgICAgPG5zMTppc0hvdXNpbmdBdXRob3JpdGllc1B1Ymxp
Y09yVHJpYmFsPmZhbHNlPC9uczE6aXNIb3VzaW5nQXV0aG9yaXRpZXNQdWJsaWNP
clRyaWJhbD4KICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJzdGF0ZUVudGl0eT5m
YWxzZTwvbnMxOmlzSW50ZXJzdGF0ZUVudGl0eT4KICAgICAgICAgICAgICA8bnMx
OmlzUGxhbm5pbmdDb21taXNzaW9uPmZhbHNlPC9uczE6aXNQbGFubmluZ0NvbW1p
c3Npb24+CiAgICAgICAgICAgICAgPG5zMTppc1BvcnRBdXRob3JpdHk+ZmFsc2U8
L25zMTppc1BvcnRBdXRob3JpdHk+CiAgICAgICAgICAgICAgPG5zMTppc1RyYW5z
aXRBdXRob3JpdHk+ZmFsc2U8L25zMTppc1RyYW5zaXRBdXRob3JpdHk+PC9uczE6
dHlwZU9mR292ZXJubWVudEVudGl0eT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JP
cmdhbml6YXRpb25GYWN0b3JzPgogICAgICAgICAgICAgIDxuczE6aXNTdWJjaGFw
dGVyU0NvcnBvcmF0aW9uPnRydWU8L25zMTppc1N1YmNoYXB0ZXJTQ29ycG9yYXRp
b24+CiAgICAgICAgICAgICAgPG5zMTppc0xpbWl0ZWRMaWFiaWxpdHlDb3Jwb3Jh
dGlvbj5mYWxzZTwvbnMxOmlzTGltaXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPgog
ICAgICAgICAgICAgIDxuczE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPmZhbHNl
PC9uczE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPgogICAgICAgICAgICAgIDxu
czE6cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgICAgPG5zMTppc0ZvclBy
b2ZpdE9yZ2FuaXphdGlvbj50cnVlPC9uczE6aXNGb3JQcm9maXRPcmdhbml6YXRp
b24+CiAgICAgICAgICAgICAgICA8bnMxOmlzTm9ucHJvZml0T3JnYW5pemF0aW9u
PmZhbHNlPC9uczE6aXNOb25wcm9maXRPcmdhbml6YXRpb24+CiAgICAgICAgICAg
ICAgICA8bnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdhbml6YXRpb24+ZmFsc2U8
L25zMTppc090aGVyTm90Rm9yUHJvZml0T3JnYW5pemF0aW9uPjwvbnMxOnByb2Zp
dFN0cnVjdHVyZT4KICAgICAgICAgICAgICA8bnMxOmlzU2hlbHRlcmVkV29ya3No
b3A+ZmFsc2U8L25zMTppc1NoZWx0ZXJlZFdvcmtzaG9wPgogICAgICAgICAgICAg
IDxuczE6c3RhdGVPZkluY29ycG9yYXRpb24gbmFtZT0iUkhPREUgSVNMQU5EIj5S
STwvbnMxOnN0YXRlT2ZJbmNvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6
Y291bnRyeU9mSW5jb3Jwb3JhdGlvbiBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8
L25zMTpjb3VudHJ5T2ZJbmNvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6
b3JnYW5pemF0aW9uYWxUeXBlPkNPUlBPUkFURSBOT1QgVEFYIEVYRU1QVDwvbnMx
Om9yZ2FuaXphdGlvbmFsVHlwZT4KICAgICAgICAgICAgICA8bnMxOm51bWJlck9m
RW1wbG95ZWVzPjM8L25zMTpudW1iZXJPZkVtcGxveWVlcz4KICAgICAgICAgICAg
ICA8bnMxOmFubnVhbFJldmVudWU+ODAwMDAwPC9uczE6YW5udWFsUmV2ZW51ZT48
L25zMTp2ZW5kb3JPcmdhbml6YXRpb25GYWN0b3JzPgogICAgICAgICAgICA8bnMx
OnR5cGVPZkVkdWNhdGlvbmFsRW50aXR5PgogICAgICAgICAgICAgIDxuczE6aXMx
ODYyTGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMxOmlzMTg2MkxhbmRHcmFudENv
bGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppczE4OTBMYW5kR3JhbnRDb2xsZWdl
PmZhbHNlPC9uczE6aXMxODkwTGFuZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAg
ICA8bnMxOmlzMTk5NExhbmRHcmFudENvbGxlZ2U+ZmFsc2U8L25zMTppczE5OTRM
YW5kR3JhbnRDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXNIaXN0b3JpY2Fs
bHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHk+ZmFsc2U8L25zMTppc0hpc3Rvcmlj
YWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eT4KICAgICAgICAgICAgICA8bnMx
OmlzTWlub3JpdHlJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzTWlub3JpdHlJbnN0
aXR1dGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzUHJpdmF0ZVVuaXZlcnNpdHlP
ckNvbGxlZ2U+ZmFsc2U8L25zMTppc1ByaXZhdGVVbml2ZXJzaXR5T3JDb2xsZWdl
PgogICAgICAgICAgICAgIDxuczE6aXNTY2hvb2xPZkZvcmVzdHJ5PmZhbHNlPC9u
czE6aXNTY2hvb2xPZkZvcmVzdHJ5PgogICAgICAgICAgICAgIDxuczE6aXNTdGF0
ZUNvbnRyb2xsZWRJbnN0aXR1dGlvbm9mSGlnaGVyTGVhcm5pbmc+ZmFsc2U8L25z
MTppc1N0YXRlQ29udHJvbGxlZEluc3RpdHV0aW9ub2ZIaWdoZXJMZWFybmluZz4K
ICAgICAgICAgICAgICA8bnMxOmlzVHJpYmFsQ29sbGVnZT5mYWxzZTwvbnMxOmlz
VHJpYmFsQ29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzVmV0ZXJpbmFyeUNv
bGxlZ2U+ZmFsc2U8L25zMTppc1ZldGVyaW5hcnlDb2xsZWdlPgogICAgICAgICAg
ICAgIDxuczE6aXNBbGFza2FuTmF0aXZlU2VydmljaW5nSW5zdGl0dXRpb24+ZmFs
c2U8L25zMTppc0FsYXNrYW5OYXRpdmVTZXJ2aWNpbmdJbnN0aXR1dGlvbj4KICAg
ICAgICAgICAgICA8bnMxOmlzTmF0aXZlSGF3YWlpYW5TZXJ2aWNpbmdJbnN0aXR1
dGlvbj5mYWxzZTwvbnMxOmlzTmF0aXZlSGF3YWlpYW5TZXJ2aWNpbmdJbnN0aXR1
dGlvbj48L25zMTp0eXBlT2ZFZHVjYXRpb25hbEVudGl0eT4KICAgICAgICAgICAg
PG5zMTp2ZW5kb3JDZXJ0aWZpY2F0aW9ucz4KICAgICAgICAgICAgICA8bnMxOmlz
RE9UQ2VydGlmaWVkRGlzYWR2YW50YWdlZEJ1c2luZXNzRW50ZXJwcmlzZT5mYWxz
ZTwvbnMxOmlzRE9UQ2VydGlmaWVkRGlzYWR2YW50YWdlZEJ1c2luZXNzRW50ZXJw
cmlzZT4KICAgICAgICAgICAgICA8bnMxOmlzU2VsZkNlcnRpZmllZFNtYWxsRGlz
YWR2YW50YWdlZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNTZWxmQ2VydGlmaWVkU21h
bGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1NC
QUNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzPmZhbHNlPC9uczE6
aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz4KICAgICAg
ICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkOEFQcm9ncmFtUGFydGljaXBhbnQ+
ZmFsc2U8L25zMTppc1NCQUNlcnRpZmllZDhBUHJvZ3JhbVBhcnRpY2lwYW50Pgog
ICAgICAgICAgICAgIDxuczE6aXNTZWxmQ2VydGlmaWVkSFVCWm9uZUpvaW50VmVu
dHVyZT5mYWxzZTwvbnMxOmlzU2VsZkNlcnRpZmllZEhVQlpvbmVKb2ludFZlbnR1
cmU+CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRpZmllZEhVQlpvbmU+ZmFs
c2U8L25zMTppc1NCQUNlcnRpZmllZEhVQlpvbmU+CiAgICAgICAgICAgICAgPG5z
MTppc1NCQUNlcnRpZmllZDhBSm9pbnRWZW50dXJlPmZhbHNlPC9uczE6aXNTQkFD
ZXJ0aWZpZWQ4QUpvaW50VmVudHVyZT48L25zMTp2ZW5kb3JDZXJ0aWZpY2F0aW9u
cz4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAg
ICA8bnMxOnN0cmVldEFkZHJlc3M+MjEzIFJPQklOU09OIFNUPC9uczE6c3RyZWV0
QWRkcmVzcz4KICAgICAgICAgICAgICA8bnMxOmNpdHk+V0FLRUZJRUxEPC9uczE6
Y2l0eT4KICAgICAgICAgICAgICA8bnMxOnN0YXRlIG5hbWU9IlJIT0RFIElTTEFO
RCI+Ukk8L25zMTpzdGF0ZT4KICAgICAgICAgICAgICA8bnMxOlpJUENvZGU+MDI4
NzkzNTkwPC9uczE6WklQQ29kZT4KICAgICAgICAgICAgICA8bnMxOmNvdW50cnlD
b2RlIG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNvdW50cnlDb2RlPgog
ICAgICAgICAgICAgIDxuczE6cGhvbmVObz40MDE3ODM2MTcyPC9uczE6cGhvbmVO
bz4KICAgICAgICAgICAgICA8bnMxOmZheE5vPjQwMTc4MzA0MDU8L25zMTpmYXhO
bz4KICAgICAgICAgICAgICA8bnMxOmNvbmdyZXNzaW9uYWxEaXN0cmljdENvZGU+
MDI8L25zMTpjb25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjwvbnMxOnZlbmRvckxv
Y2F0aW9uPgogICAgICAgICAgICA8bnMxOnZlbmRvclNpdGVDb2RlPjk2MDA4NDI0
MjwvbnMxOnZlbmRvclNpdGVDb2RlPgogICAgICAgICAgICA8bnMxOnZlbmRvckFs
dGVybmF0ZVNpdGVDb2RlPjAyODc5PC9uczE6dmVuZG9yQWx0ZXJuYXRlU2l0ZUNv
ZGU+CiAgICAgICAgICAgIDxuczE6dmVuZG9yRFVOU0luZm9ybWF0aW9uPgogICAg
ICAgICAgICAgIDxuczE6RFVOU051bWJlcj45NjAwODQyNDI8L25zMTpEVU5TTnVt
YmVyPgogICAgICAgICAgICAgIDxuczE6dmVuZG9yTmFtZT5TS0lMTEJVSUxERVJT
IElOQzwvbnMxOnZlbmRvck5hbWU+CiAgICAgICAgICAgICAgPG5zMTpnbG9iYWxQ
YXJlbnREVU5TTnVtYmVyPjk2MDA4NDI0MjwvbnMxOmdsb2JhbFBhcmVudERVTlNO
dW1iZXI+CiAgICAgICAgICAgICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT5T
S0lMTEJVSUxERVJTIElOQzwvbnMxOmdsb2JhbFBhcmVudERVTlNOYW1lPjwvbnMx
OnZlbmRvckRVTlNJbmZvcm1hdGlvbj4KICAgICAgICAgICAgPG5zMTpjY3JSZWdp
c3RyYXRpb25EZXRhaWxzPgogICAgICAgICAgICAgIDxuczE6cmVnaXN0cmF0aW9u
RGF0ZT4yMDAxLTEwLTIyIDAwOjAwOjAwPC9uczE6cmVnaXN0cmF0aW9uRGF0ZT4K
ICAgICAgICAgICAgICA8bnMxOnJlbmV3YWxEYXRlPjIwMTYtMDEtMjEgMDA6MDA6
MDA8L25zMTpyZW5ld2FsRGF0ZT48L25zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxz
PjwvbnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAgICAgPG5zMTpjb250cmFj
dGluZ09mZmljZXJCdXNpbmVzc1NpemVEZXRlcm1pbmF0aW9uIGRlc2NyaXB0aW9u
PSJPVEhFUiBUSEFOIFNNQUxMIEJVU0lORVNTIj5PPC9uczE6Y29udHJhY3RpbmdP
ZmZpY2VyQnVzaW5lc3NTaXplRGV0ZXJtaW5hdGlvbj48L25zMTp2ZW5kb3I+CiAg
ICAgICAgPG5zMTpwbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICA8bnMxOnBy
aW5jaXBhbFBsYWNlT2ZQZXJmb3JtYW5jZT4KICAgICAgICAgICAgPG5zMTpzdGF0
ZUNvZGUgbmFtZT0iRElTVFJJQ1QgT0YgQ09MVU1CSUEiPkRDPC9uczE6c3RhdGVD
b2RlPgogICAgICAgICAgICA8bnMxOmNvdW50cnlDb2RlIG5hbWU9IlVOSVRFRCBT
VEFURVMiPlVTQTwvbnMxOmNvdW50cnlDb2RlPjwvbnMxOnByaW5jaXBhbFBsYWNl
T2ZQZXJmb3JtYW5jZT4KICAgICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNl
WklQQ29kZSBjb3VudHk9IkRJU1RSSUNUIE9GIENPTFVNQklBIiBjaXR5PSJXQVNI
SU5HVE9OIj4yMDUzNTAwMDE8L25zMTpwbGFjZU9mUGVyZm9ybWFuY2VaSVBDb2Rl
PgogICAgICAgICAgPG5zMTpwbGFjZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFs
RGlzdHJpY3Q+MDA8L25zMTpwbGFjZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFs
RGlzdHJpY3Q+PC9uczE6cGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgIDxuczE6
Y29tcGV0aXRpb24+CiAgICAgICAgICA8bnMxOmV4dGVudENvbXBldGVkIGRlc2Ny
aXB0aW9uPSJGVUxMIEFORCBPUEVOIENPTVBFVElUSU9OIj5BPC9uczE6ZXh0ZW50
Q29tcGV0ZWQ+CiAgICAgICAgICA8bnMxOnNvbGljaXRhdGlvblByb2NlZHVyZXMg
ZGVzY3JpcHRpb249Ik5FR09USUFURUQgUFJPUE9TQUwvUVVPVEUiPk5QPC9uczE6
c29saWNpdGF0aW9uUHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6dHlwZU9mU2V0
QXNpZGUgZGVzY3JpcHRpb249Ik5PIFNFVCBBU0lERSBVU0VELiI+Tk9ORTwvbnMx
OnR5cGVPZlNldEFzaWRlPgogICAgICAgICAgPG5zMTpldmFsdWF0ZWRQcmVmZXJl
bmNlIGRlc2NyaXB0aW9uPSJOTyBQUkVGRVJFTkNFIFVTRUQiPk5PTkU8L25zMTpl
dmFsdWF0ZWRQcmVmZXJlbmNlPgogICAgICAgICAgPG5zMTpudW1iZXJPZk9mZmVy
c1JlY2VpdmVkPjM8L25zMTpudW1iZXJPZk9mZmVyc1JlY2VpdmVkPgogICAgICAg
ICAgPG5zMTpjb21tZXJjaWFsSXRlbUFjcXVpc2l0aW9uUHJvY2VkdXJlcyBkZXNj
cmlwdGlvbj0iQ09NTUVSQ0lBTCBJVEVNIFBST0NFRFVSRVMgTk9UIFVTRUQiPkQ8
L25zMTpjb21tZXJjaWFsSXRlbUFjcXVpc2l0aW9uUHJvY2VkdXJlcz4KICAgICAg
ICAgIDxuczE6Y29tbWVyY2lhbEl0ZW1UZXN0UHJvZ3JhbSBkZXNjcmlwdGlvbj0i
Tk8iPk48L25zMTpjb21tZXJjaWFsSXRlbVRlc3RQcm9ncmFtPgogICAgICAgICAg
PG5zMTpBNzZBY3Rpb24gZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6QTc2QWN0aW9u
PgogICAgICAgICAgPG5zMTpmZWRCaXpPcHBzIGRlc2NyaXB0aW9uPSJOTyI+Tjwv
bnMxOmZlZEJpek9wcHM+CiAgICAgICAgICA8bnMxOmxvY2FsQXJlYVNldEFzaWRl
IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmxvY2FsQXJlYVNldEFzaWRlPjwvbnMx
OmNvbXBldGl0aW9uPgogICAgICAgIDxuczE6cHJlZmVyZW5jZVByb2dyYW1zPgog
ICAgICAgICAgPG5zMTpzdWJjb250cmFjdFBsYW4gZGVzY3JpcHRpb249IlBMQU4g
Tk9UIFJFUVVJUkVEICI+QjwvbnMxOnN1YmNvbnRyYWN0UGxhbj48L25zMTpwcmVm
ZXJlbmNlUHJvZ3JhbXM+CiAgICAgICAgPG5zMTp0cmFuc2FjdGlvbkluZm9ybWF0
aW9uPgogICAgICAgICAgPG5zMTpjcmVhdGVkQnk+VkxCQU5LUzwvbnMxOmNyZWF0
ZWRCeT4KICAgICAgICAgIDxuczE6Y3JlYXRlZERhdGU+MjAxNS0xMC0zMCAxMzoz
NDo0MDwvbnMxOmNyZWF0ZWREYXRlPgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZp
ZWRCeT5WTEJBTktTPC9uczE6bGFzdE1vZGlmaWVkQnk+CiAgICAgICAgICA8bnMx
Omxhc3RNb2RpZmllZERhdGU+MjAxNi0wOS0xNSAxMDozNzoxNDwvbnMxOmxhc3RN
b2RpZmllZERhdGU+CiAgICAgICAgICA8bnMxOnN0YXR1cyBkZXNjcmlwdGlvbj0i
RklOQUwiPkY8L25zMTpzdGF0dXM+CiAgICAgICAgICA8bnMxOmFwcHJvdmVkQnk+
VkxCQU5LUzwvbnMxOmFwcHJvdmVkQnk+CiAgICAgICAgICA8bnMxOmFwcHJvdmVk
RGF0ZT4yMDE2LTA5LTE1IDEwOjM3OjE0PC9uczE6YXBwcm92ZWREYXRlPgogICAg
ICAgICAgPG5zMTpjbG9zZWRCeT5WTEJBTktTPC9uczE6Y2xvc2VkQnk+CiAgICAg
ICAgICA8bnMxOmNsb3NlZERhdGU+MjAxNi0wOS0xNSAxMDozNzoxNDwvbnMxOmNs
b3NlZERhdGU+CiAgICAgICAgICA8bnMxOmNsb3NlZFN0YXR1cz5ZPC9uczE6Y2xv
c2VkU3RhdHVzPjwvbnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+PC9uczE6YXdh
cmQ+CiAgICA8L2NvbnRlbnQ+CiAgPC9lbnRyeT4KICA8ZW50cnk+CiAgICA8dGl0
bGU+PCFbQ0RBVEFbTmV3IFBVUkNIQVNFIE9SREVSIERPQzQwUEFQVDE1MTEyMTkg
YXdhcmRlZCB0byBTSEkgSU5URVJOQVRJT05BTCBDT1JQLiBmb3IgdGhlIGFtb3Vu
dCBvZiAkNCwwMDBdXT48L3RpdGxlPgogICAgPGxpbmsgcmVsPSJhbHRlcm5hdGUi
IHR5cGU9InRleHQvaHRtbCIgaHJlZj0iaHR0cHM6Ly93d3cuZnBkcy5nb3YvZXpz
ZWFyY2gvc2VhcmNoLmRvP3M9RlBEUyZhbXA7aW5kZXhOYW1lPWF3YXJkZnVsbCZh
bXA7dGVtcGxhdGVOYW1lPTEuNS4xJmFtcDtxPURPQzQwUEFQVDE1MTEyMTkrMTM0
NCsiPjwvbGluaz4KICAgIDxtb2RpZmllZD4yMDE1LTA2LTExIDE3OjQwOjM4PC9t
b2RpZmllZD4KICAgIDxjb250ZW50IHhtbG5zOm5zMT0iaHR0cHM6Ly93d3cuZnBk
cy5nb3YvRlBEUyIgdHlwZT0iYXBwbGljYXRpb24veG1sIj4KICAgICAgPG5zMTph
d2FyZCB4bWxuczpuczE9Imh0dHA6Ly93d3cuZnBkc25nLmNvbS9GUERTIiB2ZXJz
aW9uPSIxLjQiPgogICAgICAgIDxuczE6YXdhcmRJRD4KICAgICAgICAgIDxuczE6
YXdhcmRDb250cmFjdElEPgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9
IlBBVEVOVCBBTkQgVFJBREVNQVJLIE9GRklDRSI+MTM0NDwvbnMxOmFnZW5jeUlE
PgogICAgICAgICAgICA8bnMxOlBJSUQ+RE9DNDBQQVBUMTUxMTIxOTwvbnMxOlBJ
SUQ+CiAgICAgICAgICAgIDxuczE6bW9kTnVtYmVyPjA8L25zMTptb2ROdW1iZXI+
CiAgICAgICAgICAgIDxuczE6dHJhbnNhY3Rpb25OdW1iZXI+MDwvbnMxOnRyYW5z
YWN0aW9uTnVtYmVyPjwvbnMxOmF3YXJkQ29udHJhY3RJRD48L25zMTphd2FyZElE
PgogICAgICAgIDxuczE6cmVsZXZhbnRDb250cmFjdERhdGVzPgogICAgICAgICAg
PG5zMTpzaWduZWREYXRlPjIwMTUtMDYtMDkgMDA6MDA6MDA8L25zMTpzaWduZWRE
YXRlPgogICAgICAgICAgPG5zMTplZmZlY3RpdmVEYXRlPjIwMTUtMDYtMDkgMDA6
MDA6MDA8L25zMTplZmZlY3RpdmVEYXRlPgogICAgICAgICAgPG5zMTpjdXJyZW50
Q29tcGxldGlvbkRhdGU+MjAxNi0wNi0wOCAwMDowMDowMDwvbnMxOmN1cnJlbnRD
b21wbGV0aW9uRGF0ZT4KICAgICAgICAgIDxuczE6dWx0aW1hdGVDb21wbGV0aW9u
RGF0ZT4yMDE2LTA2LTA4IDAwOjAwOjAwPC9uczE6dWx0aW1hdGVDb21wbGV0aW9u
RGF0ZT48L25zMTpyZWxldmFudENvbnRyYWN0RGF0ZXM+CiAgICAgICAgPG5zMTpk
b2xsYXJWYWx1ZXM+CiAgICAgICAgICA8bnMxOm9ibGlnYXRlZEFtb3VudD40MDAw
LjAwPC9uczE6b2JsaWdhdGVkQW1vdW50PgogICAgICAgICAgPG5zMTpiYXNlQW5k
RXhlcmNpc2VkT3B0aW9uc1ZhbHVlPjQwMDAuMDA8L25zMTpiYXNlQW5kRXhlcmNp
c2VkT3B0aW9uc1ZhbHVlPgogICAgICAgICAgPG5zMTpiYXNlQW5kQWxsT3B0aW9u
c1ZhbHVlPjQwMDAuMDA8L25zMTpiYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjwvbnMx
OmRvbGxhclZhbHVlcz4KICAgICAgICA8bnMxOnRvdGFsRG9sbGFyVmFsdWVzPgog
ICAgICAgICAgPG5zMTp0b3RhbE9ibGlnYXRlZEFtb3VudD40MDAwLjAwPC9uczE6
dG90YWxPYmxpZ2F0ZWRBbW91bnQ+CiAgICAgICAgICA8bnMxOnRvdGFsQmFzZUFu
ZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT40MDAwLjAwPC9uczE6dG90YWxCYXNlQW5k
RXhlcmNpc2VkT3B0aW9uc1ZhbHVlPgogICAgICAgICAgPG5zMTp0b3RhbEJhc2VB
bmRBbGxPcHRpb25zVmFsdWU+NDAwMC4wMDwvbnMxOnRvdGFsQmFzZUFuZEFsbE9w
dGlvbnNWYWx1ZT48L25zMTp0b3RhbERvbGxhclZhbHVlcz4KICAgICAgICA8bnMx
OnB1cmNoYXNlckluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpjb250cmFjdGlu
Z09mZmljZUFnZW5jeUlEIG5hbWU9IlBBVEVOVCBBTkQgVFJBREVNQVJLIE9GRklD
RSIgZGVwYXJ0bWVudElEPSIxMzAwIiBkZXBhcnRtZW50TmFtZT0iQ09NTUVSQ0Us
IERFUEFSVE1FTlQgT0YiPjEzNDQ8L25zMTpjb250cmFjdGluZ09mZmljZUFnZW5j
eUlEPgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZUlEIG5hbWU9IkRF
UFQgT0YgQ09NTS9QQVRFTlQgQU5EIFRSQURFTUFSSyBPRkZJQ0UiIGNvdW50cnk9
IlVTQSI+MDAwUEE8L25zMTpjb250cmFjdGluZ09mZmljZUlEPgogICAgICAgICAg
PG5zMTpmdW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEIG5hbWU9IlBBVEVOVCBBTkQg
VFJBREVNQVJLIE9GRklDRSIgZGVwYXJ0bWVudElEPSIxMzAwIiBkZXBhcnRtZW50
TmFtZT0iQ09NTUVSQ0UsIERFUEFSVE1FTlQgT0YiPjEzNDQ8L25zMTpmdW5kaW5n
UmVxdWVzdGluZ0FnZW5jeUlEPgogICAgICAgICAgPG5zMTpmdW5kaW5nUmVxdWVz
dGluZ09mZmljZUlEIG5hbWU9IkRFUFQgT0YgQ09NTS9QQVRFTlQgQU5EIFRSQURF
TUFSSyBPRkZJQ0UiPjAwMFBBPC9uczE6ZnVuZGluZ1JlcXVlc3RpbmdPZmZpY2VJ
RD4KICAgICAgICAgIDxuczE6Zm9yZWlnbkZ1bmRpbmcgZGVzY3JpcHRpb249Ik5P
VCBBUFBMSUNBQkxFIj5YPC9uczE6Zm9yZWlnbkZ1bmRpbmc+PC9uczE6cHVyY2hh
c2VySW5mb3JtYXRpb24+CiAgICAgICAgPG5zMTpjb250cmFjdE1hcmtldGluZ0Rh
dGE+CiAgICAgICAgICA8bnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZpY2U+MC4wMDwv
bnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZpY2U+PC9uczE6Y29udHJhY3RNYXJrZXRp
bmdEYXRhPgogICAgICAgIDxuczE6Y29udHJhY3REYXRhPgogICAgICAgICAgPG5z
MTpjb250cmFjdEFjdGlvblR5cGUgZGVzY3JpcHRpb249IlBVUkNIQVNFIE9SREVS
Ij5CPC9uczE6Y29udHJhY3RBY3Rpb25UeXBlPgogICAgICAgICAgPG5zMTp0eXBl
T2ZDb250cmFjdFByaWNpbmcgZGVzY3JpcHRpb249IkZJUk0gRklYRUQgUFJJQ0Ui
Pko8L25zMTp0eXBlT2ZDb250cmFjdFByaWNpbmc+CiAgICAgICAgICA8bnMxOm5h
dGlvbmFsSW50ZXJlc3RBY3Rpb25Db2RlIGRlc2NyaXB0aW9uPSJOT05FIj5OT05F
PC9uczE6bmF0aW9uYWxJbnRlcmVzdEFjdGlvbkNvZGU+CiAgICAgICAgICA8bnMx
OmRlc2NyaXB0aW9uT2ZDb250cmFjdFJlcXVpcmVtZW50PkxJQ0VOU0UgRk9SIFNP
TkFSU09VUkNFIFBML1NRTDwvbnMxOmRlc2NyaXB0aW9uT2ZDb250cmFjdFJlcXVp
cmVtZW50PgogICAgICAgICAgPG5zMTpHRkUtR0ZQIGRlc2NyaXB0aW9uPSJUcmFu
c2FjdGlvbiBkb2VzIG5vdCB1c2UgR0ZFL0dGUCI+TjwvbnMxOkdGRS1HRlA+CiAg
ICAgICAgICA8bnMxOnVuZGVmaW5pdGl6ZWRBY3Rpb24gZGVzY3JpcHRpb249Ik5P
Ij5YPC9uczE6dW5kZWZpbml0aXplZEFjdGlvbj4KICAgICAgICAgIDxuczE6Y29u
c29saWRhdGVkQ29udHJhY3QgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6Y29uc29s
aWRhdGVkQ29udHJhY3Q+CiAgICAgICAgICA8bnMxOnBlcmZvcm1hbmNlQmFzZWRT
ZXJ2aWNlQ29udHJhY3QgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9u
czE6cGVyZm9ybWFuY2VCYXNlZFNlcnZpY2VDb250cmFjdD4KICAgICAgICAgIDxu
czE6Y29udGluZ2VuY3lIdW1hbml0YXJpYW5QZWFjZWtlZXBpbmdPcGVyYXRpb24g
ZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6Y29udGluZ2VuY3lI
dW1hbml0YXJpYW5QZWFjZWtlZXBpbmdPcGVyYXRpb24+CiAgICAgICAgICA8bnMx
Omxpc3RPZlRyZWFzdXJ5QWNjb3VudHM+CiAgICAgICAgICAgIDxuczE6dHJlYXN1
cnlBY2NvdW50PgogICAgICAgICAgICAgIDxuczE6dHJlYXN1cnlBY2NvdW50U3lt
Ym9sPgogICAgICAgICAgICAgICAgPG5zMTphZ2VuY3lJZGVudGlmaWVyPjEzPC9u
czE6YWdlbmN5SWRlbnRpZmllcj4KICAgICAgICAgICAgICAgIDxuczE6bWFpbkFj
Y291bnRDb2RlPjEwMDY8L25zMTptYWluQWNjb3VudENvZGU+CiAgICAgICAgICAg
ICAgICA8bnMxOnN1YkFjY291bnRDb2RlPjAwMDwvbnMxOnN1YkFjY291bnRDb2Rl
PjwvbnMxOnRyZWFzdXJ5QWNjb3VudFN5bWJvbD48L25zMTp0cmVhc3VyeUFjY291
bnQ+PC9uczE6bGlzdE9mVHJlYXN1cnlBY2NvdW50cz4KICAgICAgICAgIDxuczE6
cHVyY2hhc2VDYXJkQXNQYXltZW50TWV0aG9kIGRlc2NyaXB0aW9uPSJOTyI+Tjwv
bnMxOnB1cmNoYXNlQ2FyZEFzUGF5bWVudE1ldGhvZD4KICAgICAgICAgIDxuczE6
bnVtYmVyT2ZBY3Rpb25zPjE8L25zMTpudW1iZXJPZkFjdGlvbnM+PC9uczE6Y29u
dHJhY3REYXRhPgogICAgICAgIDxuczE6bGVnaXNsYXRpdmVNYW5kYXRlcz4KICAg
ICAgICAgIDxuczE6Q2xpbmdlckNvaGVuQWN0IGRlc2NyaXB0aW9uPSJZRVMiPlk8
L25zMTpDbGluZ2VyQ29oZW5BY3Q+CiAgICAgICAgICA8bnMxOm1hdGVyaWFsc1N1
cHBsaWVzQXJ0aWNsZXNFcXVpcG1lbnQgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNB
QkxFIj5YPC9uczE6bWF0ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudD4K
ICAgICAgICAgIDxuczE6bGFib3JTdGFuZGFyZHMgZGVzY3JpcHRpb249Ik5PVCBB
UFBMSUNBQkxFIj5YPC9uczE6bGFib3JTdGFuZGFyZHM+CiAgICAgICAgICA8bnMx
OmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWlyZW1lbnRzIGRlc2NyaXB0aW9uPSJO
T1QgQVBQTElDQUJMRSI+WDwvbnMxOmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWly
ZW1lbnRzPgogICAgICAgICAgPG5zMTpsaXN0T2ZBZGRpdGlvbmFsUmVwb3J0aW5n
VmFsdWVzPjwvbnMxOmxpc3RPZkFkZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+CiAg
ICAgICAgICA8bnMxOmludGVyYWdlbmN5Q29udHJhY3RpbmdBdXRob3JpdHkgZGVz
Y3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6aW50ZXJhZ2VuY3lDb250
cmFjdGluZ0F1dGhvcml0eT48L25zMTpsZWdpc2xhdGl2ZU1hbmRhdGVzPgogICAg
ICAgIDxuczE6cHJvZHVjdE9yU2VydmljZUluZm9ybWF0aW9uPgogICAgICAgICAg
PG5zMTpwcm9kdWN0T3JTZXJ2aWNlQ29kZSBkZXNjcmlwdGlvbj0iQURQIFNPRlRX
QVJFIiBwcm9kdWN0T3JTZXJ2aWNlVHlwZT0iUFJPRFVDVCI+NzAzMDwvbnMxOnBy
b2R1Y3RPclNlcnZpY2VDb2RlPgogICAgICAgICAgPG5zMTpjb250cmFjdEJ1bmRs
aW5nIGRlc2NyaXB0aW9uPSJOT1QgQSBCVU5ETEVEIFJFUVVJUkVNRU5UIj5EPC9u
czE6Y29udHJhY3RCdW5kbGluZz4KICAgICAgICAgIDxuczE6cHJpbmNpcGFsTkFJ
Q1NDb2RlIGRlc2NyaXB0aW9uPSJDT01QVVRFUiBBTkQgQ09NUFVURVIgUEVSSVBI
RVJBTCBFUVVJUE1FTlQgQU5EIFNPRlRXQVJFIE1FUkNIQU5UIFdIT0xFU0FMRVJT
Ij40MjM0MzA8L25zMTpwcmluY2lwYWxOQUlDU0NvZGU+CiAgICAgICAgICA8bnMx
OnJlY292ZXJlZE1hdGVyaWFsQ2xhdXNlcyBkZXNjcmlwdGlvbj0iTk8gQ0xBVVNF
UyBJTkNMVURFRCBBTkQgTk8gU1VTVEFJTkFCSUxJVFkgSU5DTFVERUQiPkM8L25z
MTpyZWNvdmVyZWRNYXRlcmlhbENsYXVzZXM+CiAgICAgICAgICA8bnMxOm1hbnVm
YWN0dXJpbmdPcmdhbml6YXRpb25UeXBlIGRlc2NyaXB0aW9uPSJVLlMuIE9XTkVE
IEJVU0lORVNTIj5BPC9uczE6bWFudWZhY3R1cmluZ09yZ2FuaXphdGlvblR5cGU+
CiAgICAgICAgICA8bnMxOnVzZU9mRVBBRGVzaWduYXRlZFByb2R1Y3RzIGRlc2Ny
aXB0aW9uPSJOT1QgUkVRVUlSRUQiPkU8L25zMTp1c2VPZkVQQURlc2lnbmF0ZWRQ
cm9kdWN0cz4KICAgICAgICAgIDxuczE6Y291bnRyeU9mT3JpZ2luIG5hbWU9IlVO
SVRFRCBTVEFURVMiPlVTQTwvbnMxOmNvdW50cnlPZk9yaWdpbj4KICAgICAgICAg
IDxuczE6cGxhY2VPZk1hbnVmYWN0dXJlIGRlc2NyaXB0aW9uPSJNRkcgSU4gVS5T
LiI+RDwvbnMxOnBsYWNlT2ZNYW51ZmFjdHVyZT48L25zMTpwcm9kdWN0T3JTZXJ2
aWNlSW5mb3JtYXRpb24+CiAgICAgICAgPG5zMTp2ZW5kb3I+CiAgICAgICAgICA8
bnMxOnZlbmRvckhlYWRlcj4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JOYW1lPlNI
SSBJTlRFUk5BVElPTkFMIENPUlAuPC9uczE6dmVuZG9yTmFtZT48L25zMTp2ZW5k
b3JIZWFkZXI+CiAgICAgICAgICA8bnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAg
ICAgICAgICA8bnMxOnZlbmRvclNvY2lvRWNvbm9taWNJbmRpY2F0b3JzPgogICAg
ICAgICAgICAgIDxuczE6aXNBbGFza2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9y
RmlybT5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZU93bmVkQ29ycG9yYXRpb25P
ckZpcm0+CiAgICAgICAgICAgICAgPG5zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+
ZmFsc2U8L25zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+CiAgICAgICAgICAgICAg
PG5zMTppc0luZGlhblRyaWJlPmZhbHNlPC9uczE6aXNJbmRpYW5UcmliZT4KICAg
ICAgICAgICAgICA8bnMxOmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlv
bk9yRmlybT5mYWxzZTwvbnMxOmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXph
dGlvbk9yRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzVHJpYmFsbHlPd25lZEZp
cm0+ZmFsc2U8L25zMTppc1RyaWJhbGx5T3duZWRGaXJtPgogICAgICAgICAgICAg
IDxuczE6aXNWZXRlcmFuT3duZWQ+ZmFsc2U8L25zMTppc1ZldGVyYW5Pd25lZD4K
ICAgICAgICAgICAgICA8bnMxOmlzU2VydmljZVJlbGF0ZWREaXNhYmxlZFZldGVy
YW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNTZXJ2aWNlUmVsYXRlZERpc2Fi
bGVkVmV0ZXJhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dv
bWVuT3duZWQ+dHJ1ZTwvbnMxOmlzV29tZW5Pd25lZD4KICAgICAgICAgICAgICA8
bnMxOm1pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTWlub3Jp
dHlPd25lZD50cnVlPC9uczE6aXNNaW5vcml0eU93bmVkPgogICAgICAgICAgICAg
ICAgPG5zMTppc1N1YkNvbnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNz
PmZhbHNlPC9uczE6aXNTdWJDb250aW5lbnRBc2lhbkFtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNBc2lhblBhY2lmaWNBbWVyaWNh
bk93bmVkQnVzaW5lc3M+dHJ1ZTwvbnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5P
d25lZEJ1c2luZXNzPgogICAgICAgICAgICAgICAgPG5zMTppc0JsYWNrQW1lcmlj
YW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNCbGFja0FtZXJpY2FuT3duZWRC
dXNpbmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY0FtZXJpY2Fu
T3duZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzSGlzcGFuaWNBbWVyaWNhbk93bmVk
QnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzTmF0aXZlQW1lcmljYW5P
d25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVz
aW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzT3RoZXJNaW5vcml0eU93bmVk
PmZhbHNlPC9uczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+PC9uczE6bWlub3JpdHlP
d25lZD4KICAgICAgICAgICAgICA8bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+ZmFs
c2U8L25zMTppc1ZlcnlTbWFsbEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6
aXNXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzV29tZW5Pd25l
ZFNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0Vjb25vbWljYWxs
eURpc2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMx
OmlzRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2lu
ZXNzPgogICAgICAgICAgICAgIDxuczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVk
U21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzSm9pbnRWZW50dXJlV29tZW5Pd25l
ZFNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVy
ZUVjb25vbWljYWxseURpc2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVz
cz5mYWxzZTwvbnMxOmlzSm9pbnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50
YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPjwvbnMxOnZlbmRvclNvY2lvRWNv
bm9taWNJbmRpY2F0b3JzPgogICAgICAgICAgICA8bnMxOnZlbmRvckJ1c2luZXNz
VHlwZXM+CiAgICAgICAgICAgICAgPG5zMTppc0NvbW11bml0eURldmVsb3BlZENv
cnBvcmF0aW9uT3duZWRGaXJtPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9w
ZWRDb3Jwb3JhdGlvbk93bmVkRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzTGFi
b3JTdXJwbHVzQXJlYUZpcm0+ZmFsc2U8L25zMTppc0xhYm9yU3VycGx1c0FyZWFG
aXJtPgogICAgICAgICAgICAgIDxuczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAgICAg
ICAgICAgICAgICA8bnMxOmlzRmVkZXJhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTpp
c0ZlZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVy
YWxseUZ1bmRlZFJlc2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPmZhbHNlPC9uczE6
aXNGZWRlcmFsbHlGdW5kZWRSZXNlYXJjaEFuZERldmVsb3BtZW50Q29ycD4KICAg
ICAgICAgICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT5mYWxz
ZTwvbnMxOmlzRmVkZXJhbEdvdmVybm1lbnRBZ2VuY3k+PC9uczE6ZmVkZXJhbEdv
dmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTppc1N0YXRlR292ZXJubWVudD5m
YWxzZTwvbnMxOmlzU3RhdGVHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6
bG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292
ZXJubWVudD5mYWxzZTwvbnMxOmlzTG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAg
ICAgICAgPG5zMTppc0NpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0Np
dHlMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ291bnR5
TG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNDb3VudHlMb2NhbEdvdmVybm1l
bnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdv
dmVybm1lbnQ+ZmFsc2U8L25zMTppc0ludGVyTXVuaWNpcGFsTG9jYWxHb3Zlcm5t
ZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJubWVudE93bmVk
PmZhbHNlPC9uczE6aXNMb2NhbEdvdmVybm1lbnRPd25lZD4KICAgICAgICAgICAg
ICAgIDxuczE6aXNNdW5pY2lwYWxpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25z
MTppc011bmljaXBhbGl0eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAg
IDxuczE6aXNTY2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMx
OmlzU2Nob29sRGlzdHJpY3RMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzVG93bnNoaXBMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1Rv
d25zaGlwTG9jYWxHb3Zlcm5tZW50PjwvbnMxOmxvY2FsR292ZXJubWVudD4KICAg
ICAgICAgICAgICA8bnMxOmlzVHJpYmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
VHJpYmFsR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbkdv
dmVybm1lbnQ+ZmFsc2U8L25zMTppc0ZvcmVpZ25Hb3Zlcm5tZW50PgogICAgICAg
ICAgICAgIDxuczE6YnVzaW5lc3NPck9yZ2FuaXphdGlvblR5cGU+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzQ29ycG9yYXRlRW50aXR5Tm90VGF4RXhlbXB0PnRydWU8
L25zMTppc0NvcnBvcmF0ZUVudGl0eU5vdFRheEV4ZW1wdD4KICAgICAgICAgICAg
ICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlUYXhFeGVtcHQ+ZmFsc2U8L25zMTpp
c0NvcnBvcmF0ZUVudGl0eVRheEV4ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6
aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPmZhbHNl
PC9uczE6aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlw
PgogICAgICAgICAgICAgICAgPG5zMTppc1NvbGVQcm9wcmVpdG9yc2hpcD5mYWxz
ZTwvbnMxOmlzU29sZVByb3ByZWl0b3JzaGlwPgogICAgICAgICAgICAgICAgPG5z
MTppc1NtYWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+ZmFsc2U8L25zMTppc1Nt
YWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+CiAgICAgICAgICAgICAgICA8bnMx
OmlzSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzSW50ZXJu
YXRpb25hbE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNVU0dv
dmVybm1lbnRFbnRpdHk+ZmFsc2U8L25zMTppc1VTR292ZXJubWVudEVudGl0eT48
L25zMTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT48L25zMTp2ZW5kb3JCdXNp
bmVzc1R5cGVzPgogICAgICAgICAgICA8bnMxOnZlbmRvckxpbmVPZkJ1c2luZXNz
PgogICAgICAgICAgICAgIDxuczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBv
cmF0aW9uPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0
aW9uPgogICAgICAgICAgICAgIDxuczE6aXNEb21lc3RpY1NoZWx0ZXI+ZmFsc2U8
L25zMTppc0RvbWVzdGljU2hlbHRlcj4KICAgICAgICAgICAgICA8bnMxOmlzRWR1
Y2F0aW9uYWxJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzRWR1Y2F0aW9uYWxJbnN0
aXR1dGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzRm91bmRhdGlvbj5mYWxzZTwv
bnMxOmlzRm91bmRhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzSG9zcGl0YWw+
ZmFsc2U8L25zMTppc0hvc3BpdGFsPgogICAgICAgICAgICAgIDxuczE6aXNNYW51
ZmFjdHVyZXJPZkdvb2RzPmZhbHNlPC9uczE6aXNNYW51ZmFjdHVyZXJPZkdvb2Rz
PgogICAgICAgICAgICAgIDxuczE6aXNWZXRlcmluYXJ5SG9zcGl0YWw+ZmFsc2U8
L25zMTppc1ZldGVyaW5hcnlIb3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzSGlz
cGFuaWNTZXJ2aWNpbmdJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzSGlzcGFuaWNT
ZXJ2aWNpbmdJbnN0aXR1dGlvbj48L25zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JSZWxhdGlvbnNoaXBXaXRoRmVkZXJhbEdv
dmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpyZWNlaXZlc0NvbnRyYWN0cz5m
YWxzZTwvbnMxOnJlY2VpdmVzQ29udHJhY3RzPgogICAgICAgICAgICAgIDxuczE6
cmVjZWl2ZXNHcmFudHM+ZmFsc2U8L25zMTpyZWNlaXZlc0dyYW50cz4KICAgICAg
ICAgICAgICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzQW5kR3JhbnRzPnRydWU8L25z
MTpyZWNlaXZlc0NvbnRyYWN0c0FuZEdyYW50cz48L25zMTp2ZW5kb3JSZWxhdGlv
bnNoaXBXaXRoRmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgIDxuczE6dHlw
ZU9mR292ZXJubWVudEVudGl0eT4KICAgICAgICAgICAgICA8bnMxOmlzQWlycG9y
dEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzQWlycG9ydEF1dGhvcml0eT4KICAgICAg
ICAgICAgICA8bnMxOmlzQ291bmNpbE9mR292ZXJubWVudHM+ZmFsc2U8L25zMTpp
c0NvdW5jaWxPZkdvdmVybm1lbnRzPgogICAgICAgICAgICAgIDxuczE6aXNIb3Vz
aW5nQXV0aG9yaXRpZXNQdWJsaWNPclRyaWJhbD5mYWxzZTwvbnMxOmlzSG91c2lu
Z0F1dGhvcml0aWVzUHVibGljT3JUcmliYWw+CiAgICAgICAgICAgICAgPG5zMTpp
c0ludGVyc3RhdGVFbnRpdHk+ZmFsc2U8L25zMTppc0ludGVyc3RhdGVFbnRpdHk+
CiAgICAgICAgICAgICAgPG5zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj5mYWxzZTwv
bnMxOmlzUGxhbm5pbmdDb21taXNzaW9uPgogICAgICAgICAgICAgIDxuczE6aXNQ
b3J0QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNQb3J0QXV0aG9yaXR5PgogICAgICAg
ICAgICAgIDxuczE6aXNUcmFuc2l0QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNUcmFu
c2l0QXV0aG9yaXR5PjwvbnMxOnR5cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAg
ICAgICAgIDxuczE6dmVuZG9yT3JnYW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAg
ICAgICA8bnMxOmlzU3ViY2hhcHRlclNDb3Jwb3JhdGlvbj5mYWxzZTwvbnMxOmlz
U3ViY2hhcHRlclNDb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzTGlt
aXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNMaW1pdGVkTGlh
YmlsaXR5Q29ycG9yYXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc0ZvcmVpZ25P
d25lZEFuZExvY2F0ZWQ+ZmFsc2U8L25zMTppc0ZvcmVpZ25Pd25lZEFuZExvY2F0
ZWQ+CiAgICAgICAgICAgICAgPG5zMTpwcm9maXRTdHJ1Y3R1cmU+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzRm9yUHJvZml0T3JnYW5pemF0aW9uPnRydWU8L25zMTpp
c0ZvclByb2ZpdE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNO
b25wcm9maXRPcmdhbml6YXRpb24+ZmFsc2U8L25zMTppc05vbnByb2ZpdE9yZ2Fu
aXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck5vdEZvclByb2Zp
dE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdh
bml6YXRpb24+PC9uczE6cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgIDxu
czE6aXNTaGVsdGVyZWRXb3Jrc2hvcD5mYWxzZTwvbnMxOmlzU2hlbHRlcmVkV29y
a3Nob3A+CiAgICAgICAgICAgICAgPG5zMTpzdGF0ZU9mSW5jb3Jwb3JhdGlvbiBu
YW1lPSJORVcgSkVSU0VZIj5OSjwvbnMxOnN0YXRlT2ZJbmNvcnBvcmF0aW9uPgog
ICAgICAgICAgICAgIDxuczE6Y291bnRyeU9mSW5jb3Jwb3JhdGlvbiBuYW1lPSJV
TklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZJbmNvcnBvcmF0aW9uPgog
ICAgICAgICAgICAgIDxuczE6b3JnYW5pemF0aW9uYWxUeXBlPkNPUlBPUkFURSBO
T1QgVEFYIEVYRU1QVDwvbnMxOm9yZ2FuaXphdGlvbmFsVHlwZT4KICAgICAgICAg
ICAgICA8bnMxOm51bWJlck9mRW1wbG95ZWVzPjIwMDA8L25zMTpudW1iZXJPZkVt
cGxveWVlcz4KICAgICAgICAgICAgICA8bnMxOmFubnVhbFJldmVudWU+NjUwMDAw
MDAwMDwvbnMxOmFubnVhbFJldmVudWU+PC9uczE6dmVuZG9yT3JnYW5pemF0aW9u
RmFjdG9ycz4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZFZHVjYXRpb25hbEVudGl0
eT4KICAgICAgICAgICAgICA8bnMxOmlzMTg2MkxhbmRHcmFudENvbGxlZ2U+ZmFs
c2U8L25zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPgogICAgICAgICAgICAgIDxu
czE6aXMxODkwTGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMxOmlzMTg5MExhbmRH
cmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppczE5OTRMYW5kR3JhbnRD
b2xsZWdlPmZhbHNlPC9uczE6aXMxOTk0TGFuZEdyYW50Q29sbGVnZT4KICAgICAg
ICAgICAgICA8bnMxOmlzSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJz
aXR5PmZhbHNlPC9uczE6aXNIaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZl
cnNpdHk+CiAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+
ZmFsc2U8L25zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+CiAgICAgICAgICAgICAg
PG5zMTppc1ByaXZhdGVVbml2ZXJzaXR5T3JDb2xsZWdlPmZhbHNlPC9uczE6aXNQ
cml2YXRlVW5pdmVyc2l0eU9yQ29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlz
U2Nob29sT2ZGb3Jlc3RyeT5mYWxzZTwvbnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT4K
ICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25v
ZkhpZ2hlckxlYXJuaW5nPmZhbHNlPC9uczE6aXNTdGF0ZUNvbnRyb2xsZWRJbnN0
aXR1dGlvbm9mSGlnaGVyTGVhcm5pbmc+CiAgICAgICAgICAgICAgPG5zMTppc1Ry
aWJhbENvbGxlZ2U+ZmFsc2U8L25zMTppc1RyaWJhbENvbGxlZ2U+CiAgICAgICAg
ICAgICAgPG5zMTppc1ZldGVyaW5hcnlDb2xsZWdlPmZhbHNlPC9uczE6aXNWZXRl
cmluYXJ5Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzQWxhc2thbk5hdGl2
ZVNlcnZpY2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNBbGFza2FuTmF0aXZl
U2VydmljaW5nSW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc05hdGl2
ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc05hdGl2
ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+PC9uczE6dHlwZU9mRWR1Y2F0
aW9uYWxFbnRpdHk+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQ2VydGlmaWNhdGlv
bnM+CiAgICAgICAgICAgICAgPG5zMTppc0RPVENlcnRpZmllZERpc2FkdmFudGFn
ZWRCdXNpbmVzc0VudGVycHJpc2U+ZmFsc2U8L25zMTppc0RPVENlcnRpZmllZERp
c2FkdmFudGFnZWRCdXNpbmVzc0VudGVycHJpc2U+CiAgICAgICAgICAgICAgPG5z
MTppc1NlbGZDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzU2VsZkNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNz
PgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFu
dGFnZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNh
ZHZhbnRhZ2VkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRp
ZmllZDhBUHJvZ3JhbVBhcnRpY2lwYW50PmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZp
ZWQ4QVByb2dyYW1QYXJ0aWNpcGFudD4KICAgICAgICAgICAgICA8bnMxOmlzU2Vs
ZkNlcnRpZmllZEhVQlpvbmVKb2ludFZlbnR1cmU+ZmFsc2U8L25zMTppc1NlbGZD
ZXJ0aWZpZWRIVUJab25lSm9pbnRWZW50dXJlPgogICAgICAgICAgICAgIDxuczE6
aXNTQkFDZXJ0aWZpZWRIVUJab25lPmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWRI
VUJab25lPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QUpvaW50
VmVudHVyZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+
PC9uczE6dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAgICAgICAgICAgIDxuczE6dmVu
ZG9yTG9jYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpzdHJlZXRBZGRyZXNzPjI5
MCBEQVZJRFNPTiBBVkUgU1RFIDEwMTwvbnMxOnN0cmVldEFkZHJlc3M+CiAgICAg
ICAgICAgICAgPG5zMTpjaXR5PlNPTUVSU0VUPC9uczE6Y2l0eT4KICAgICAgICAg
ICAgICA8bnMxOnN0YXRlIG5hbWU9Ik5FVyBKRVJTRVkiPk5KPC9uczE6c3RhdGU+
CiAgICAgICAgICAgICAgPG5zMTpaSVBDb2RlPjA4ODczNDE3OTwvbnMxOlpJUENv
ZGU+CiAgICAgICAgICAgICAgPG5zMTpjb3VudHJ5Q29kZSBuYW1lPSJVTklURUQg
U1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5Q29kZT4KICAgICAgICAgICAgICA8bnMx
OnBob25lTm8+ODQ3NjAzMTEzMjwvbnMxOnBob25lTm8+CiAgICAgICAgICAgICAg
PG5zMTpjb25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjEyPC9uczE6Y29uZ3Jlc3Np
b25hbERpc3RyaWN0Q29kZT48L25zMTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAg
ICAgPG5zMTp2ZW5kb3JTaXRlQ29kZT42MTE0Mjk0ODE8L25zMTp2ZW5kb3JTaXRl
Q29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4w
ODg3MzwvbnMxOnZlbmRvckFsdGVybmF0ZVNpdGVDb2RlPgogICAgICAgICAgICA8
bnMxOnZlbmRvckRVTlNJbmZvcm1hdGlvbj4KICAgICAgICAgICAgICA8bnMxOkRV
TlNOdW1iZXI+NjExNDI5NDgxPC9uczE6RFVOU051bWJlcj4KICAgICAgICAgICAg
ICA8bnMxOnZlbmRvck5hbWU+U0hJIElOVEVSTkFUSU9OQUwgQ09SUC48L25zMTp2
ZW5kb3JOYW1lPgogICAgICAgICAgICAgIDxuczE6Z2xvYmFsUGFyZW50RFVOU051
bWJlcj42MTE0Mjk0ODE8L25zMTpnbG9iYWxQYXJlbnREVU5TTnVtYmVyPgogICAg
ICAgICAgICAgIDxuczE6Z2xvYmFsUGFyZW50RFVOU05hbWU+U0hJIElOVEVSTkFU
SU9OQUwgQ09SUC48L25zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT48L25zMTp2ZW5k
b3JEVU5TSW5mb3JtYXRpb24+CiAgICAgICAgICAgIDxuczE6Y2NyUmVnaXN0cmF0
aW9uRGV0YWlscz4KICAgICAgICAgICAgICA8bnMxOnJlZ2lzdHJhdGlvbkRhdGU+
MjAwMS0xMi0wNSAwMDowMDowMDwvbnMxOnJlZ2lzdHJhdGlvbkRhdGU+CiAgICAg
ICAgICAgICAgPG5zMTpyZW5ld2FsRGF0ZT4yMDE2LTA1LTE5IDAwOjAwOjAwPC9u
czE6cmVuZXdhbERhdGU+PC9uczE6Y2NyUmVnaXN0cmF0aW9uRGV0YWlscz48L25z
MTp2ZW5kb3JTaXRlRGV0YWlscz4KICAgICAgICAgIDxuczE6Y29udHJhY3RpbmdP
ZmZpY2VyQnVzaW5lc3NTaXplRGV0ZXJtaW5hdGlvbiBkZXNjcmlwdGlvbj0iT1RI
RVIgVEhBTiBTTUFMTCBCVVNJTkVTUyI+TzwvbnMxOmNvbnRyYWN0aW5nT2ZmaWNl
ckJ1c2luZXNzU2l6ZURldGVybWluYXRpb24+PC9uczE6dmVuZG9yPgogICAgICAg
IDxuczE6cGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpwcmluY2lw
YWxQbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICAgIDxuczE6c3RhdGVDb2Rl
IG5hbWU9IlZJUkdJTklBIj5WQTwvbnMxOnN0YXRlQ29kZT4KICAgICAgICAgICAg
PG5zMTpjb3VudHJ5Q29kZSBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpj
b3VudHJ5Q29kZT48L25zMTpwcmluY2lwYWxQbGFjZU9mUGVyZm9ybWFuY2U+CiAg
ICAgICAgICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZVpJUENvZGUgY291bnR5PSJB
TEVYQU5EUklBIENJVFkiIGNpdHk9IkFMRVhBTkRSSUEiPjIyMzEzMTQ1MDwvbnMx
OnBsYWNlT2ZQZXJmb3JtYW5jZVpJUENvZGU+CiAgICAgICAgICA8bnMxOnBsYWNl
T2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9uYWxEaXN0cmljdD4wODwvbnMxOnBsYWNl
T2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9uYWxEaXN0cmljdD48L25zMTpwbGFjZU9m
UGVyZm9ybWFuY2U+CiAgICAgICAgPG5zMTpjb21wZXRpdGlvbj4KICAgICAgICAg
IDxuczE6ZXh0ZW50Q29tcGV0ZWQgZGVzY3JpcHRpb249Ik5PVCBDT01QRVRFRCBV
TkRFUiBTQVAiPkc8L25zMTpleHRlbnRDb21wZXRlZD4KICAgICAgICAgIDxuczE6
c29saWNpdGF0aW9uUHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iU0lNUExJRklFRCBB
Q1FVSVNJVElPTiI+U1AxPC9uczE6c29saWNpdGF0aW9uUHJvY2VkdXJlcz4KICAg
ICAgICAgIDxuczE6dHlwZU9mU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIFNFVCBB
U0lERSBVU0VELiI+Tk9ORTwvbnMxOnR5cGVPZlNldEFzaWRlPgogICAgICAgICAg
PG5zMTpldmFsdWF0ZWRQcmVmZXJlbmNlIGRlc2NyaXB0aW9uPSJOTyBQUkVGRVJF
TkNFIFVTRUQiPk5PTkU8L25zMTpldmFsdWF0ZWRQcmVmZXJlbmNlPgogICAgICAg
ICAgPG5zMTpyZWFzb25Ob3RDb21wZXRlZCBkZXNjcmlwdGlvbj0iU0FQIE5PTi1D
T01QRVRJVElPTiI+U1AyPC9uczE6cmVhc29uTm90Q29tcGV0ZWQ+CiAgICAgICAg
ICA8bnMxOm51bWJlck9mT2ZmZXJzUmVjZWl2ZWQ+MTwvbnMxOm51bWJlck9mT2Zm
ZXJzUmVjZWl2ZWQ+CiAgICAgICAgICA8bnMxOmNvbW1lcmNpYWxJdGVtQWNxdWlz
aXRpb25Qcm9jZWR1cmVzIGRlc2NyaXB0aW9uPSJDT01NRVJDSUFMIElURU0gUFJP
Q0VEVVJFUyBOT1QgVVNFRCI+RDwvbnMxOmNvbW1lcmNpYWxJdGVtQWNxdWlzaXRp
b25Qcm9jZWR1cmVzPgogICAgICAgICAgPG5zMTpjb21tZXJjaWFsSXRlbVRlc3RQ
cm9ncmFtIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbW1lcmNpYWxJdGVtVGVz
dFByb2dyYW0+CiAgICAgICAgICA8bnMxOkE3NkFjdGlvbiBkZXNjcmlwdGlvbj0i
Tk8iPk48L25zMTpBNzZBY3Rpb24+CiAgICAgICAgICA8bnMxOmZlZEJpek9wcHMg
ZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6ZmVkQml6T3Bwcz4K
ICAgICAgICAgIDxuczE6bG9jYWxBcmVhU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5P
Ij5OPC9uczE6bG9jYWxBcmVhU2V0QXNpZGU+PC9uczE6Y29tcGV0aXRpb24+CiAg
ICAgICAgPG5zMTpwcmVmZXJlbmNlUHJvZ3JhbXM+CiAgICAgICAgICA8bnMxOnN1
YmNvbnRyYWN0UGxhbiBkZXNjcmlwdGlvbj0iUExBTiBOT1QgUkVRVUlSRUQgIj5C
PC9uczE6c3ViY29udHJhY3RQbGFuPjwvbnMxOnByZWZlcmVuY2VQcm9ncmFtcz4K
ICAgICAgICA8bnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+CiAgICAgICAgICA8
bnMxOmNyZWF0ZWRCeT5QVE9UQkY8L25zMTpjcmVhdGVkQnk+CiAgICAgICAgICA8
bnMxOmNyZWF0ZWREYXRlPjIwMTUtMDYtMTEgMTc6MDk6NTQ8L25zMTpjcmVhdGVk
RGF0ZT4KICAgICAgICAgIDxuczE6bGFzdE1vZGlmaWVkQnk+UFRPVEJGPC9uczE6
bGFzdE1vZGlmaWVkQnk+CiAgICAgICAgICA8bnMxOmxhc3RNb2RpZmllZERhdGU+
MjAxNS0wNi0xMSAxNzo0MDozODwvbnMxOmxhc3RNb2RpZmllZERhdGU+CiAgICAg
ICAgICA8bnMxOnN0YXR1cyBkZXNjcmlwdGlvbj0iRklOQUwiPkY8L25zMTpzdGF0
dXM+CiAgICAgICAgICA8bnMxOmFwcHJvdmVkQnk+UFRPVEJGPC9uczE6YXBwcm92
ZWRCeT4KICAgICAgICAgIDxuczE6YXBwcm92ZWREYXRlPjIwMTUtMDYtMTEgMTc6
NDA6Mzg8L25zMTphcHByb3ZlZERhdGU+PC9uczE6dHJhbnNhY3Rpb25JbmZvcm1h
dGlvbj48L25zMTphd2FyZD4KICAgIDwvY29udGVudD4KICA8L2VudHJ5PgogIDxl
bnRyeT4KICAgIDx0aXRsZT48IVtDREFUQVtOZXcgREVMSVZFUlkgT1JERVIgQUcz
MlNCRDE1MDE0NyBhd2FyZGVkIHRvIEFQRVhURUNIIExMQyBmb3IgdGhlIGFtb3Vu
dCBvZiAkMTk4LDAwMF1dPjwvdGl0bGU+CiAgICA8bGluayByZWw9ImFsdGVybmF0
ZSIgdHlwZT0idGV4dC9odG1sIiBocmVmPSJodHRwczovL3d3dy5mcGRzLmdvdi9l
enNlYXJjaC9zZWFyY2guZG8/cz1GUERTJmFtcDtpbmRleE5hbWU9YXdhcmRmdWxs
JmFtcDt0ZW1wbGF0ZU5hbWU9MS41LjEmYW1wO3E9QUczMlNCRDE1MDE0NysxMkgy
KyI+PC9saW5rPgogICAgPG1vZGlmaWVkPjIwMTctMTAtMDQgMTQ6MjA6NDg8L21v
ZGlmaWVkPgogICAgPGNvbnRlbnQgeG1sbnM6bnMxPSJodHRwczovL3d3dy5mcGRz
Lmdvdi9GUERTIiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPgogICAgICA8bnMxOmF3
YXJkIHhtbG5zOm5zMT0iaHR0cDovL3d3dy5mcGRzbmcuY29tL0ZQRFMiIHZlcnNp
b249IjEuNCI+CiAgICAgICAgPG5zMTphd2FyZElEPgogICAgICAgICAgPG5zMTph
d2FyZENvbnRyYWN0SUQ+CiAgICAgICAgICAgIDxuczE6YWdlbmN5SUQgbmFtZT0i
QUdSSUNVTFRVUkFMIFJFU0VBUkNIIFNFUlZJQ0UiPjEySDI8L25zMTphZ2VuY3lJ
RD4KICAgICAgICAgICAgPG5zMTpQSUlEPkFHMzJTQkQxNTAxNDc8L25zMTpQSUlE
PgogICAgICAgICAgICA8bnMxOm1vZE51bWJlcj4wPC9uczE6bW9kTnVtYmVyPgog
ICAgICAgICAgICA8bnMxOnRyYW5zYWN0aW9uTnVtYmVyPjA8L25zMTp0cmFuc2Fj
dGlvbk51bWJlcj48L25zMTphd2FyZENvbnRyYWN0SUQ+CiAgICAgICAgICA8bnMx
OnJlZmVyZW5jZWRJRFZJRD4KICAgICAgICAgICAgPG5zMTphZ2VuY3lJRCBuYW1l
PSJGRURFUkFMIEFDUVVJU0lUSU9OIFNFUlZJQ0UiPjQ3MzI8L25zMTphZ2VuY3lJ
RD4KICAgICAgICAgICAgPG5zMTpQSUlEPkdTMDZGMDgyMVo8L25zMTpQSUlEPgog
ICAgICAgICAgICA8bnMxOm1vZE51bWJlcj4wPC9uczE6bW9kTnVtYmVyPjwvbnMx
OnJlZmVyZW5jZWRJRFZJRD48L25zMTphd2FyZElEPgogICAgICAgIDxuczE6cmVs
ZXZhbnRDb250cmFjdERhdGVzPgogICAgICAgICAgPG5zMTpzaWduZWREYXRlPjIw
MTUtMDYtMDMgMDA6MDA6MDA8L25zMTpzaWduZWREYXRlPgogICAgICAgICAgPG5z
MTplZmZlY3RpdmVEYXRlPjIwMTUtMDYtMDMgMDA6MDA6MDA8L25zMTplZmZlY3Rp
dmVEYXRlPgogICAgICAgICAgPG5zMTpjdXJyZW50Q29tcGxldGlvbkRhdGU+MjAx
OS0wNy0wNSAwMDowMDowMDwvbnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4KICAg
ICAgICAgIDxuczE6dWx0aW1hdGVDb21wbGV0aW9uRGF0ZT4yMDE5LTA3LTA1IDAw
OjAwOjAwPC9uczE6dWx0aW1hdGVDb21wbGV0aW9uRGF0ZT48L25zMTpyZWxldmFu
dENvbnRyYWN0RGF0ZXM+CiAgICAgICAgPG5zMTpkb2xsYXJWYWx1ZXM+CiAgICAg
ICAgICA8bnMxOm9ibGlnYXRlZEFtb3VudD4xOTgwMDAuMDA8L25zMTpvYmxpZ2F0
ZWRBbW91bnQ+CiAgICAgICAgICA8bnMxOmJhc2VBbmRFeGVyY2lzZWRPcHRpb25z
VmFsdWU+MTk4MDAwLjAwPC9uczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1
ZT4KICAgICAgICAgIDxuczE6YmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT44MzM1ODAu
MDA8L25zMTpiYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjwvbnMxOmRvbGxhclZhbHVl
cz4KICAgICAgICA8bnMxOnRvdGFsRG9sbGFyVmFsdWVzPgogICAgICAgICAgPG5z
MTp0b3RhbE9ibGlnYXRlZEFtb3VudD42MTQ3OTAuMDA8L25zMTp0b3RhbE9ibGln
YXRlZEFtb3VudD4KICAgICAgICAgIDxuczE6dG90YWxCYXNlQW5kRXhlcmNpc2Vk
T3B0aW9uc1ZhbHVlPjYxNDc5MC4wMDwvbnMxOnRvdGFsQmFzZUFuZEV4ZXJjaXNl
ZE9wdGlvbnNWYWx1ZT4KICAgICAgICAgIDxuczE6dG90YWxCYXNlQW5kQWxsT3B0
aW9uc1ZhbHVlPjgzMzU4MC4wMDwvbnMxOnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNW
YWx1ZT48L25zMTp0b3RhbERvbGxhclZhbHVlcz4KICAgICAgICA8bnMxOnB1cmNo
YXNlckluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmlj
ZUFnZW5jeUlEIG5hbWU9IkFHUklDVUxUVVJBTCBSRVNFQVJDSCBTRVJWSUNFIiBk
ZXBhcnRtZW50SUQ9IjEyMDAiIGRlcGFydG1lbnROYW1lPSJBR1JJQ1VMVFVSRSwg
REVQQVJUTUVOVCBPRiI+MTJIMjwvbnMxOmNvbnRyYWN0aW5nT2ZmaWNlQWdlbmN5
SUQ+CiAgICAgICAgICA8bnMxOmNvbnRyYWN0aW5nT2ZmaWNlSUQgbmFtZT0iVVNE
QSBBUlMgTkNSQlNDIDMyU0IiIHJlZ2lvbkNvZGU9IjEzIiBjb3VudHJ5PSJVU0Ei
PjMyU0I8L25zMTpjb250cmFjdGluZ09mZmljZUlEPgogICAgICAgICAgPG5zMTpm
dW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEIG5hbWU9IkFHUklDVUxUVVJBTCBSRVNF
QVJDSCBTRVJWSUNFIiBkZXBhcnRtZW50SUQ9IjEyMDAiIGRlcGFydG1lbnROYW1l
PSJBR1JJQ1VMVFVSRSwgREVQQVJUTUVOVCBPRiI+MTJIMjwvbnMxOmZ1bmRpbmdS
ZXF1ZXN0aW5nQWdlbmN5SUQ+CiAgICAgICAgICA8bnMxOmZ1bmRpbmdSZXF1ZXN0
aW5nT2ZmaWNlSUQgbmFtZT0iVVNEQSBBUlMgT0NJTyAzMVBFIj4zMVBFPC9uczE6
ZnVuZGluZ1JlcXVlc3RpbmdPZmZpY2VJRD4KICAgICAgICAgIDxuczE6Zm9yZWln
bkZ1bmRpbmcgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6Zm9y
ZWlnbkZ1bmRpbmc+PC9uczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAgICAgICAg
PG5zMTpjb250cmFjdE1hcmtldGluZ0RhdGE+CiAgICAgICAgICA8bnMxOmZlZVBh
aWRGb3JVc2VPZlNlcnZpY2U+MC4wMDwvbnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZp
Y2U+PC9uczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAgIDxuczE6Y29u
dHJhY3REYXRhPgogICAgICAgICAgPG5zMTpjb250cmFjdEFjdGlvblR5cGUgZGVz
Y3JpcHRpb249IkRFTElWRVJZIE9SREVSIj5DPC9uczE6Y29udHJhY3RBY3Rpb25U
eXBlPgogICAgICAgICAgPG5zMTp0eXBlT2ZDb250cmFjdFByaWNpbmcgZGVzY3Jp
cHRpb249IkZJUk0gRklYRUQgUFJJQ0UiPko8L25zMTp0eXBlT2ZDb250cmFjdFBy
aWNpbmc+CiAgICAgICAgICA8bnMxOm5hdGlvbmFsSW50ZXJlc3RBY3Rpb25Db2Rl
IGRlc2NyaXB0aW9uPSJOT05FIj5OT05FPC9uczE6bmF0aW9uYWxJbnRlcmVzdEFj
dGlvbkNvZGU+CiAgICAgICAgICA8bnMxOmRlc2NyaXB0aW9uT2ZDb250cmFjdFJl
cXVpcmVtZW50PlRIRSBQVVJQT1NFIE9GIFRISVMgREVMSVZFUlkgT1JERVIgSVMg
VE8gUFVSQ0hBU0UgT1JBQ0xFIFBML1NRTCBQUk9HUkFNTUVSIChEQVRBQkFTRSBB
TkFMWVNUL1BST0dSQU1NRVItU0VOSU9SKSBTRVJWSUNFUyBJTiBBQ0NPUkRBTkNF
IFdJVEggQVRUQUNIRUQgU1RBVEVNRU5UIE9GIFdPUksgREFURUQgNi8xLzIwMTUu
CgpUSElTIEFXQVJEIElTIEFOIE9QVElPTiBZRUFSIENPTlRSQUNULiBJVCBJTkNM
VURFUyBBIEJBU0UgWUVBUiBQTFVTLCBUSFJFRSAoMykgT05FIFlFQVIgT1BUSU9O
IFBFUklPRFMuIEJBU0UgWUVBUiBQRVJJT0QgT0YgUEVSRk9STUFOQ0UgSVMgNy82
LzIwMTUgVEhST1VHSCA3LzUvMjAxNi4gIAoKSUdGOjpDVDo6SUdGPC9uczE6ZGVz
Y3JpcHRpb25PZkNvbnRyYWN0UmVxdWlyZW1lbnQ+CiAgICAgICAgICA8bnMxOmlu
aGVyZW50bHlHb3Zlcm5tZW50YWxGdW5jdGlvbiBkZXNjcmlwdGlvbj0iQ1JJVElD
QUwgRlVOQ1RJT05TIj5DVDwvbnMxOmluaGVyZW50bHlHb3Zlcm5tZW50YWxGdW5j
dGlvbj4KICAgICAgICAgIDxuczE6R0ZFLUdGUCBkZXNjcmlwdGlvbj0iVHJhbnNh
Y3Rpb24gZG9lcyBub3QgdXNlIEdGRS9HRlAiPk48L25zMTpHRkUtR0ZQPgogICAg
ICAgICAgPG5zMTp1bmRlZmluaXRpemVkQWN0aW9uIGRlc2NyaXB0aW9uPSJOTyI+
WDwvbnMxOnVuZGVmaW5pdGl6ZWRBY3Rpb24+CiAgICAgICAgICA8bnMxOmNvbnNv
bGlkYXRlZENvbnRyYWN0IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbnNvbGlk
YXRlZENvbnRyYWN0PgogICAgICAgICAgPG5zMTpwZXJmb3JtYW5jZUJhc2VkU2Vy
dmljZUNvbnRyYWN0IGRlc2NyaXB0aW9uPSJOTyAtIFNFUlZJQ0UgV0hFUkUgUEJB
IElTIE5PVCBVU0VELiI+TjwvbnMxOnBlcmZvcm1hbmNlQmFzZWRTZXJ2aWNlQ29u
dHJhY3Q+CiAgICAgICAgICA8bnMxOmNvbnRpbmdlbmN5SHVtYW5pdGFyaWFuUGVh
Y2VrZWVwaW5nT3BlcmF0aW9uIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+
WDwvbnMxOmNvbnRpbmdlbmN5SHVtYW5pdGFyaWFuUGVhY2VrZWVwaW5nT3BlcmF0
aW9uPgogICAgICAgICAgPG5zMTpsaXN0T2ZUcmVhc3VyeUFjY291bnRzPgogICAg
ICAgICAgICA8bnMxOnRyZWFzdXJ5QWNjb3VudD4KICAgICAgICAgICAgICA8bnMx
OnRyZWFzdXJ5QWNjb3VudFN5bWJvbD4KICAgICAgICAgICAgICAgIDxuczE6YWdl
bmN5SWRlbnRpZmllcj4xMjwvbnMxOmFnZW5jeUlkZW50aWZpZXI+CiAgICAgICAg
ICAgICAgICA8bnMxOm1haW5BY2NvdW50Q29kZT4xNDAwPC9uczE6bWFpbkFjY291
bnRDb2RlPjwvbnMxOnRyZWFzdXJ5QWNjb3VudFN5bWJvbD48L25zMTp0cmVhc3Vy
eUFjY291bnQ+PC9uczE6bGlzdE9mVHJlYXN1cnlBY2NvdW50cz4KICAgICAgICAg
IDxuczE6cHVyY2hhc2VDYXJkQXNQYXltZW50TWV0aG9kIGRlc2NyaXB0aW9uPSJO
TyI+TjwvbnMxOnB1cmNoYXNlQ2FyZEFzUGF5bWVudE1ldGhvZD4KICAgICAgICAg
IDxuczE6bnVtYmVyT2ZBY3Rpb25zPjE8L25zMTpudW1iZXJPZkFjdGlvbnM+PC9u
czE6Y29udHJhY3REYXRhPgogICAgICAgIDxuczE6bGVnaXNsYXRpdmVNYW5kYXRl
cz4KICAgICAgICAgIDxuczE6Q2xpbmdlckNvaGVuQWN0IGRlc2NyaXB0aW9uPSJZ
RVMiPlk8L25zMTpDbGluZ2VyQ29oZW5BY3Q+CiAgICAgICAgICA8bnMxOm1hdGVy
aWFsc1N1cHBsaWVzQXJ0aWNsZXNFcXVpcG1lbnQgZGVzY3JpcHRpb249Ik5PVCBB
UFBMSUNBQkxFIj5YPC9uczE6bWF0ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlw
bWVudD4KICAgICAgICAgIDxuczE6bGFib3JTdGFuZGFyZHMgZGVzY3JpcHRpb249
Ik5PIj5OPC9uczE6bGFib3JTdGFuZGFyZHM+CiAgICAgICAgICA8bnMxOmNvbnN0
cnVjdGlvbldhZ2VSYXRlUmVxdWlyZW1lbnRzIGRlc2NyaXB0aW9uPSJOT1QgQVBQ
TElDQUJMRSI+WDwvbnMxOmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWlyZW1lbnRz
PgogICAgICAgICAgPG5zMTpsaXN0T2ZBZGRpdGlvbmFsUmVwb3J0aW5nVmFsdWVz
PjwvbnMxOmxpc3RPZkFkZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+CiAgICAgICAg
ICA8bnMxOmludGVyYWdlbmN5Q29udHJhY3RpbmdBdXRob3JpdHkgZGVzY3JpcHRp
b249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6aW50ZXJhZ2VuY3lDb250cmFjdGlu
Z0F1dGhvcml0eT48L25zMTpsZWdpc2xhdGl2ZU1hbmRhdGVzPgogICAgICAgIDxu
czE6cHJvZHVjdE9yU2VydmljZUluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpw
cm9kdWN0T3JTZXJ2aWNlQ29kZSBkZXNjcmlwdGlvbj0iSVQgQU5EIFRFTEVDT00t
IFBST0dSQU1NSU5HIiBwcm9kdWN0T3JTZXJ2aWNlVHlwZT0iU0VSVklDRSI+RDMw
ODwvbnMxOnByb2R1Y3RPclNlcnZpY2VDb2RlPgogICAgICAgICAgPG5zMTpjb250
cmFjdEJ1bmRsaW5nIGRlc2NyaXB0aW9uPSJOT1QgQSBCVU5ETEVEIFJFUVVJUkVN
RU5UIj5EPC9uczE6Y29udHJhY3RCdW5kbGluZz4KICAgICAgICAgIDxuczE6cHJp
bmNpcGFsTkFJQ1NDb2RlIGRlc2NyaXB0aW9uPSJDT01QVVRFUiBTWVNURU1TIERF
U0lHTiBTRVJWSUNFUyI+NTQxNTEyPC9uczE6cHJpbmNpcGFsTkFJQ1NDb2RlPgog
ICAgICAgICAgPG5zMTpyZWNvdmVyZWRNYXRlcmlhbENsYXVzZXMgZGVzY3JpcHRp
b249Ik5PIENMQVVTRVMgSU5DTFVERUQgQU5EIE5PIFNVU1RBSU5BQklMSVRZIElO
Q0xVREVEIj5DPC9uczE6cmVjb3ZlcmVkTWF0ZXJpYWxDbGF1c2VzPgogICAgICAg
ICAgPG5zMTptYW51ZmFjdHVyaW5nT3JnYW5pemF0aW9uVHlwZSBkZXNjcmlwdGlv
bj0iVS5TLiBPV05FRCBCVVNJTkVTUyI+QTwvbnMxOm1hbnVmYWN0dXJpbmdPcmdh
bml6YXRpb25UeXBlPgogICAgICAgICAgPG5zMTp1c2VPZkVQQURlc2lnbmF0ZWRQ
cm9kdWN0cyBkZXNjcmlwdGlvbj0iTk9UIFJFUVVJUkVEIj5FPC9uczE6dXNlT2ZF
UEFEZXNpZ25hdGVkUHJvZHVjdHM+CiAgICAgICAgICA8bnMxOmNvdW50cnlPZk9y
aWdpbiBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZPcmln
aW4+CiAgICAgICAgICA8bnMxOnBsYWNlT2ZNYW51ZmFjdHVyZSBkZXNjcmlwdGlv
bj0iTk9UIEEgTUFOVUZBQ1RVUkVEIEVORCBQUk9EVUNUIj5DPC9uczE6cGxhY2VP
Zk1hbnVmYWN0dXJlPjwvbnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1hdGlvbj4K
ICAgICAgICA8bnMxOnZlbmRvcj4KICAgICAgICAgIDxuczE6dmVuZG9ySGVhZGVy
PgogICAgICAgICAgICA8bnMxOnZlbmRvck5hbWU+QVBFWFRFQ0ggTExDPC9uczE6
dmVuZG9yTmFtZT48L25zMTp2ZW5kb3JIZWFkZXI+CiAgICAgICAgICA8bnMxOnZl
bmRvclNpdGVEZXRhaWxzPgogICAgICAgICAgICA8bnMxOnZlbmRvclNvY2lvRWNv
bm9taWNJbmRpY2F0b3JzPgogICAgICAgICAgICAgIDxuczE6aXNBbGFza2FuTmF0
aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT5mYWxzZTwvbnMxOmlzQWxhc2thbk5h
dGl2ZU93bmVkQ29ycG9yYXRpb25PckZpcm0+CiAgICAgICAgICAgICAgPG5zMTpp
c0FtZXJpY2FuSW5kaWFuT3duZWQ+ZmFsc2U8L25zMTppc0FtZXJpY2FuSW5kaWFu
T3duZWQ+CiAgICAgICAgICAgICAgPG5zMTppc0luZGlhblRyaWJlPmZhbHNlPC9u
czE6aXNJbmRpYW5UcmliZT4KICAgICAgICAgICAgICA8bnMxOmlzTmF0aXZlSGF3
YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT5mYWxzZTwvbnMxOmlzTmF0aXZl
SGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT4KICAgICAgICAgICAgICA8
bnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+ZmFsc2U8L25zMTppc1RyaWJhbGx5T3du
ZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNWZXRlcmFuT3duZWQ+ZmFsc2U8
L25zMTppc1ZldGVyYW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOmlzU2Vydmlj
ZVJlbGF0ZWREaXNhYmxlZFZldGVyYW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6
aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVkQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgPG5zMTppc1dvbWVuT3duZWQ+ZmFsc2U8L25zMTppc1dvbWVu
T3duZWQ+CiAgICAgICAgICAgICAgPG5zMTptaW5vcml0eU93bmVkPgogICAgICAg
ICAgICAgICAgPG5zMTppc01pbm9yaXR5T3duZWQ+dHJ1ZTwvbnMxOmlzTWlub3Jp
dHlPd25lZD4KICAgICAgICAgICAgICAgIDxuczE6aXNTdWJDb250aW5lbnRBc2lh
bkFtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU3ViQ29udGluZW50
QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8bnMx
OmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6
aXNBc2lhblBhY2lmaWNBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAg
ICAgICA8bnMxOmlzQmxhY2tBbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25z
MTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAgICAg
PG5zMTppc0hpc3BhbmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPnRydWU8L25zMTpp
c0hpc3BhbmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAgICAg
PG5zMTppc05hdGl2ZUFtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlz
TmF0aXZlQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAgICAgPG5z
MTppc090aGVyTWlub3JpdHlPd25lZD5mYWxzZTwvbnMxOmlzT3RoZXJNaW5vcml0
eU93bmVkPjwvbnMxOm1pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgPG5zMTpp
c1ZlcnlTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNWZXJ5U21hbGxCdXNpbmVz
cz4KICAgICAgICAgICAgICA8bnMxOmlzV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+
ZmFsc2U8L25zMTppc1dvbWVuT3duZWRTbWFsbEJ1c2luZXNzPgogICAgICAgICAg
ICAgIDxuczE6aXNFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNt
YWxsQnVzaW5lc3M+ZmFsc2U8L25zMTppc0Vjb25vbWljYWxseURpc2FkdmFudGFn
ZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlz
Sm9pbnRWZW50dXJlV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+ZmFsc2U8L25zMTpp
c0pvaW50VmVudHVyZVdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPgogICAgICAgICAg
ICAgIDxuczE6aXNKb2ludFZlbnR1cmVFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2Vk
V29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+ZmFsc2U8L25zMTppc0pvaW50VmVudHVy
ZUVjb25vbWljYWxseURpc2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVz
cz48L25zMTp2ZW5kb3JTb2Npb0Vjb25vbWljSW5kaWNhdG9ycz4KICAgICAgICAg
ICAgPG5zMTp2ZW5kb3JCdXNpbmVzc1R5cGVzPgogICAgICAgICAgICAgIDxuczE6
aXNDb21tdW5pdHlEZXZlbG9wZWRDb3Jwb3JhdGlvbk93bmVkRmlybT5mYWxzZTwv
bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcGVkQ29ycG9yYXRpb25Pd25lZEZpcm0+CiAg
ICAgICAgICAgICAgPG5zMTppc0xhYm9yU3VycGx1c0FyZWFGaXJtPmZhbHNlPC9u
czE6aXNMYWJvclN1cnBsdXNBcmVhRmlybT4KICAgICAgICAgICAgICA8bnMxOmZl
ZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVyYWxH
b3Zlcm5tZW50PmZhbHNlPC9uczE6aXNGZWRlcmFsR292ZXJubWVudD4KICAgICAg
ICAgICAgICAgIDxuczE6aXNGZWRlcmFsbHlGdW5kZWRSZXNlYXJjaEFuZERldmVs
b3BtZW50Q29ycD5mYWxzZTwvbnMxOmlzRmVkZXJhbGx5RnVuZGVkUmVzZWFyY2hB
bmREZXZlbG9wbWVudENvcnA+CiAgICAgICAgICAgICAgICA8bnMxOmlzRmVkZXJh
bEdvdmVybm1lbnRBZ2VuY3k+ZmFsc2U8L25zMTppc0ZlZGVyYWxHb3Zlcm5tZW50
QWdlbmN5PjwvbnMxOmZlZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxu
czE6aXNTdGF0ZUdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1N0YXRlR292ZXJubWVu
dD4KICAgICAgICAgICAgICA8bnMxOmxvY2FsR292ZXJubWVudD4KICAgICAgICAg
ICAgICAgIDxuczE6aXNMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0xvY2Fs
R292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNDaXR5TG9jYWxHb3Zl
cm5tZW50PmZhbHNlPC9uczE6aXNDaXR5TG9jYWxHb3Zlcm5tZW50PgogICAgICAg
ICAgICAgICAgPG5zMTppc0NvdW50eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMx
OmlzQ291bnR5TG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTpp
c0ludGVyTXVuaWNpcGFsTG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNJbnRl
ck11bmljaXBhbExvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6
aXNMb2NhbEdvdmVybm1lbnRPd25lZD5mYWxzZTwvbnMxOmlzTG9jYWxHb3Zlcm5t
ZW50T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTXVuaWNpcGFsaXR5TG9j
YWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNNdW5pY2lwYWxpdHlMb2NhbEdvdmVy
bm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzU2Nob29sRGlzdHJpY3RMb2Nh
bEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1NjaG9vbERpc3RyaWN0TG9jYWxHb3Zl
cm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc1Rvd25zaGlwTG9jYWxHb3Zl
cm5tZW50PmZhbHNlPC9uczE6aXNUb3duc2hpcExvY2FsR292ZXJubWVudD48L25z
MTpsb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTppc1RyaWJhbEdv
dmVybm1lbnQ+ZmFsc2U8L25zMTppc1RyaWJhbEdvdmVybm1lbnQ+CiAgICAgICAg
ICAgICAgPG5zMTppc0ZvcmVpZ25Hb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNGb3Jl
aWduR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOmJ1c2luZXNzT3JPcmdh
bml6YXRpb25UeXBlPgogICAgICAgICAgICAgICAgPG5zMTppc0NvcnBvcmF0ZUVu
dGl0eU5vdFRheEV4ZW1wdD5mYWxzZTwvbnMxOmlzQ29ycG9yYXRlRW50aXR5Tm90
VGF4RXhlbXB0PgogICAgICAgICAgICAgICAgPG5zMTppc0NvcnBvcmF0ZUVudGl0
eVRheEV4ZW1wdD5mYWxzZTwvbnMxOmlzQ29ycG9yYXRlRW50aXR5VGF4RXhlbXB0
PgogICAgICAgICAgICAgICAgPG5zMTppc1BhcnRuZXJzaGlwT3JMaW1pdGVkTGlh
YmlsaXR5UGFydG5lcnNoaXA+ZmFsc2U8L25zMTppc1BhcnRuZXJzaGlwT3JMaW1p
dGVkTGlhYmlsaXR5UGFydG5lcnNoaXA+CiAgICAgICAgICAgICAgICA8bnMxOmlz
U29sZVByb3ByZWl0b3JzaGlwPmZhbHNlPC9uczE6aXNTb2xlUHJvcHJlaXRvcnNo
aXA+CiAgICAgICAgICAgICAgICA8bnMxOmlzU21hbGxBZ3JpY3VsdHVyYWxDb29w
ZXJhdGl2ZT5mYWxzZTwvbnMxOmlzU21hbGxBZ3JpY3VsdHVyYWxDb29wZXJhdGl2
ZT4KICAgICAgICAgICAgICAgIDxuczE6aXNJbnRlcm5hdGlvbmFsT3JnYW5pemF0
aW9uPmZhbHNlPC9uczE6aXNJbnRlcm5hdGlvbmFsT3JnYW5pemF0aW9uPgogICAg
ICAgICAgICAgICAgPG5zMTppc1VTR292ZXJubWVudEVudGl0eT5mYWxzZTwvbnMx
OmlzVVNHb3Zlcm5tZW50RW50aXR5PjwvbnMxOmJ1c2luZXNzT3JPcmdhbml6YXRp
b25UeXBlPjwvbnMxOnZlbmRvckJ1c2luZXNzVHlwZXM+CiAgICAgICAgICAgIDxu
czE6dmVuZG9yTGluZU9mQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0Nv
bW11bml0eURldmVsb3BtZW50Q29ycG9yYXRpb24+ZmFsc2U8L25zMTppc0NvbW11
bml0eURldmVsb3BtZW50Q29ycG9yYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpp
c0RvbWVzdGljU2hlbHRlcj5mYWxzZTwvbnMxOmlzRG9tZXN0aWNTaGVsdGVyPgog
ICAgICAgICAgICAgIDxuczE6aXNFZHVjYXRpb25hbEluc3RpdHV0aW9uPmZhbHNl
PC9uczE6aXNFZHVjYXRpb25hbEluc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxu
czE6aXNGb3VuZGF0aW9uPmZhbHNlPC9uczE6aXNGb3VuZGF0aW9uPgogICAgICAg
ICAgICAgIDxuczE6aXNIb3NwaXRhbD5mYWxzZTwvbnMxOmlzSG9zcGl0YWw+CiAg
ICAgICAgICAgICAgPG5zMTppc01hbnVmYWN0dXJlck9mR29vZHM+ZmFsc2U8L25z
MTppc01hbnVmYWN0dXJlck9mR29vZHM+CiAgICAgICAgICAgICAgPG5zMTppc1Zl
dGVyaW5hcnlIb3NwaXRhbD5mYWxzZTwvbnMxOmlzVmV0ZXJpbmFyeUhvc3BpdGFs
PgogICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY1NlcnZpY2luZ0luc3RpdHV0
aW9uPmZhbHNlPC9uczE6aXNIaXNwYW5pY1NlcnZpY2luZ0luc3RpdHV0aW9uPjwv
bnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgogICAgICAgICAgICA8bnMxOnZlbmRv
clJlbGF0aW9uc2hpcFdpdGhGZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAg
ICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzPnRydWU8L25zMTpyZWNlaXZlc0NvbnRy
YWN0cz4KICAgICAgICAgICAgICA8bnMxOnJlY2VpdmVzR3JhbnRzPmZhbHNlPC9u
czE6cmVjZWl2ZXNHcmFudHM+CiAgICAgICAgICAgICAgPG5zMTpyZWNlaXZlc0Nv
bnRyYWN0c0FuZEdyYW50cz5mYWxzZTwvbnMxOnJlY2VpdmVzQ29udHJhY3RzQW5k
R3JhbnRzPjwvbnMxOnZlbmRvclJlbGF0aW9uc2hpcFdpdGhGZWRlcmFsR292ZXJu
bWVudD4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZHb3Zlcm5tZW50RW50aXR5Pgog
ICAgICAgICAgICAgIDxuczE6aXNBaXJwb3J0QXV0aG9yaXR5PmZhbHNlPC9uczE6
aXNBaXJwb3J0QXV0aG9yaXR5PgogICAgICAgICAgICAgIDxuczE6aXNDb3VuY2ls
T2ZHb3Zlcm5tZW50cz5mYWxzZTwvbnMxOmlzQ291bmNpbE9mR292ZXJubWVudHM+
CiAgICAgICAgICAgICAgPG5zMTppc0hvdXNpbmdBdXRob3JpdGllc1B1YmxpY09y
VHJpYmFsPmZhbHNlPC9uczE6aXNIb3VzaW5nQXV0aG9yaXRpZXNQdWJsaWNPclRy
aWJhbD4KICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJzdGF0ZUVudGl0eT5mYWxz
ZTwvbnMxOmlzSW50ZXJzdGF0ZUVudGl0eT4KICAgICAgICAgICAgICA8bnMxOmlz
UGxhbm5pbmdDb21taXNzaW9uPmZhbHNlPC9uczE6aXNQbGFubmluZ0NvbW1pc3Np
b24+CiAgICAgICAgICAgICAgPG5zMTppc1BvcnRBdXRob3JpdHk+ZmFsc2U8L25z
MTppc1BvcnRBdXRob3JpdHk+CiAgICAgICAgICAgICAgPG5zMTppc1RyYW5zaXRB
dXRob3JpdHk+ZmFsc2U8L25zMTppc1RyYW5zaXRBdXRob3JpdHk+PC9uczE6dHlw
ZU9mR292ZXJubWVudEVudGl0eT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JPcmdh
bml6YXRpb25GYWN0b3JzPgogICAgICAgICAgICAgIDxuczE6aXNTdWJjaGFwdGVy
U0NvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNTdWJjaGFwdGVyU0NvcnBvcmF0aW9u
PgogICAgICAgICAgICAgIDxuczE6aXNMaW1pdGVkTGlhYmlsaXR5Q29ycG9yYXRp
b24+dHJ1ZTwvbnMxOmlzTGltaXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPgogICAg
ICAgICAgICAgIDxuczE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPmZhbHNlPC9u
czE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPgogICAgICAgICAgICAgIDxuczE6
cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgICAgPG5zMTppc0ZvclByb2Zp
dE9yZ2FuaXphdGlvbj50cnVlPC9uczE6aXNGb3JQcm9maXRPcmdhbml6YXRpb24+
CiAgICAgICAgICAgICAgICA8bnMxOmlzTm9ucHJvZml0T3JnYW5pemF0aW9uPmZh
bHNlPC9uczE6aXNOb25wcm9maXRPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdhbml6YXRpb24+ZmFsc2U8L25z
MTppc090aGVyTm90Rm9yUHJvZml0T3JnYW5pemF0aW9uPjwvbnMxOnByb2ZpdFN0
cnVjdHVyZT4KICAgICAgICAgICAgICA8bnMxOmlzU2hlbHRlcmVkV29ya3Nob3A+
ZmFsc2U8L25zMTppc1NoZWx0ZXJlZFdvcmtzaG9wPgogICAgICAgICAgICAgIDxu
czE6b3JnYW5pemF0aW9uYWxUeXBlPk9USEVSPC9uczE6b3JnYW5pemF0aW9uYWxU
eXBlPgogICAgICAgICAgICAgIDxuczE6bnVtYmVyT2ZFbXBsb3llZXM+MTM8L25z
MTpudW1iZXJPZkVtcGxveWVlcz4KICAgICAgICAgICAgICA8bnMxOmFubnVhbFJl
dmVudWU+MjAwMDAwMDwvbnMxOmFubnVhbFJldmVudWU+PC9uczE6dmVuZG9yT3Jn
YW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZFZHVjYXRp
b25hbEVudGl0eT4KICAgICAgICAgICAgICA8bnMxOmlzMTg2MkxhbmRHcmFudENv
bGxlZ2U+ZmFsc2U8L25zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPgogICAgICAg
ICAgICAgIDxuczE6aXMxODkwTGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMxOmlz
MTg5MExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppczE5OTRM
YW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6aXMxOTk0TGFuZEdyYW50Q29sbGVn
ZT4KICAgICAgICAgICAgICA8bnMxOmlzSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdl
T3JVbml2ZXJzaXR5PmZhbHNlPC9uczE6aXNIaXN0b3JpY2FsbHlCbGFja0NvbGxl
Z2VPclVuaXZlcnNpdHk+CiAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5SW5z
dGl0dXRpb24+ZmFsc2U8L25zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTppc1ByaXZhdGVVbml2ZXJzaXR5T3JDb2xsZWdlPmZhbHNl
PC9uczE6aXNQcml2YXRlVW5pdmVyc2l0eU9yQ29sbGVnZT4KICAgICAgICAgICAg
ICA8bnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT5mYWxzZTwvbnMxOmlzU2Nob29sT2ZG
b3Jlc3RyeT4KICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVDb250cm9sbGVkSW5z
dGl0dXRpb25vZkhpZ2hlckxlYXJuaW5nPmZhbHNlPC9uczE6aXNTdGF0ZUNvbnRy
b2xsZWRJbnN0aXR1dGlvbm9mSGlnaGVyTGVhcm5pbmc+CiAgICAgICAgICAgICAg
PG5zMTppc1RyaWJhbENvbGxlZ2U+ZmFsc2U8L25zMTppc1RyaWJhbENvbGxlZ2U+
CiAgICAgICAgICAgICAgPG5zMTppc1ZldGVyaW5hcnlDb2xsZWdlPmZhbHNlPC9u
czE6aXNWZXRlcmluYXJ5Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzQWxh
c2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNBbGFza2Fu
TmF0aXZlU2VydmljaW5nSW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5zMTpp
c05hdGl2ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+ZmFsc2U8L25zMTpp
c05hdGl2ZUhhd2FpaWFuU2VydmljaW5nSW5zdGl0dXRpb24+PC9uczE6dHlwZU9m
RWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQ2VydGlm
aWNhdGlvbnM+CiAgICAgICAgICAgICAgPG5zMTppc0RPVENlcnRpZmllZERpc2Fk
dmFudGFnZWRCdXNpbmVzc0VudGVycHJpc2U+dHJ1ZTwvbnMxOmlzRE9UQ2VydGlm
aWVkRGlzYWR2YW50YWdlZEJ1c2luZXNzRW50ZXJwcmlzZT4KICAgICAgICAgICAg
ICA8bnMxOmlzU2VsZkNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNz
PmZhbHNlPC9uczE6aXNTZWxmQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRhZ2VkQnVz
aW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRpZmllZFNtYWxsRGlz
YWR2YW50YWdlZEJ1c2luZXNzPnRydWU8L25zMTppc1NCQUNlcnRpZmllZFNtYWxs
RGlzYWR2YW50YWdlZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNTQkFD
ZXJ0aWZpZWQ4QVByb2dyYW1QYXJ0aWNpcGFudD50cnVlPC9uczE6aXNTQkFDZXJ0
aWZpZWQ4QVByb2dyYW1QYXJ0aWNpcGFudD4KICAgICAgICAgICAgICA8bnMxOmlz
U2VsZkNlcnRpZmllZEhVQlpvbmVKb2ludFZlbnR1cmU+ZmFsc2U8L25zMTppc1Nl
bGZDZXJ0aWZpZWRIVUJab25lSm9pbnRWZW50dXJlPgogICAgICAgICAgICAgIDxu
czE6aXNTQkFDZXJ0aWZpZWRIVUJab25lPmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZp
ZWRIVUJab25lPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QUpv
aW50VmVudHVyZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1
cmU+PC9uczE6dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAgICAgICAgICAgIDxuczE6
dmVuZG9yTG9jYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpzdHJlZXRBZGRyZXNz
PjIyMDAgV0lMU09OIEJMVkQ8L25zMTpzdHJlZXRBZGRyZXNzPgogICAgICAgICAg
ICAgIDxuczE6Y2l0eT5BUkxJTkdUT048L25zMTpjaXR5PgogICAgICAgICAgICAg
IDxuczE6c3RhdGUgbmFtZT0iVklSR0lOSUEiPlZBPC9uczE6c3RhdGU+CiAgICAg
ICAgICAgICAgPG5zMTpaSVBDb2RlPjIyMjAxMzM5NzwvbnMxOlpJUENvZGU+CiAg
ICAgICAgICAgICAgPG5zMTpjb3VudHJ5Q29kZSBuYW1lPSJVTklURUQgU1RBVEVT
Ij5VU0E8L25zMTpjb3VudHJ5Q29kZT4KICAgICAgICAgICAgICA8bnMxOnBob25l
Tm8+NzAzMjUzOTcyMjwvbnMxOnBob25lTm8+CiAgICAgICAgICAgICAgPG5zMTpm
YXhObz43MDM1MjIyMDM3PC9uczE6ZmF4Tm8+CiAgICAgICAgICAgICAgPG5zMTpj
b25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjA4PC9uczE6Y29uZ3Jlc3Npb25hbERp
c3RyaWN0Q29kZT48L25zMTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JTaXRlQ29kZT4xMjYyNDIxNTA8L25zMTp2ZW5kb3JTaXRlQ29kZT4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4yMjIwMTMz
OTc8L25zMTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JEVU5TSW5mb3JtYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpEVU5T
TnVtYmVyPjEyNjI0MjE1MDwvbnMxOkRVTlNOdW1iZXI+CiAgICAgICAgICAgICAg
PG5zMTp2ZW5kb3JOYW1lPkFQRVhURUNIIExMQzwvbnMxOnZlbmRvck5hbWU+CiAg
ICAgICAgICAgICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTnVtYmVyPjEyNjI0MjE1
MDwvbnMxOmdsb2JhbFBhcmVudERVTlNOdW1iZXI+CiAgICAgICAgICAgICAgPG5z
MTpnbG9iYWxQYXJlbnREVU5TTmFtZT5BUEVYVEVDSCBMTEM8L25zMTpnbG9iYWxQ
YXJlbnREVU5TTmFtZT48L25zMTp2ZW5kb3JEVU5TSW5mb3JtYXRpb24+CiAgICAg
ICAgICAgIDxuczE6Y2NyUmVnaXN0cmF0aW9uRGV0YWlscz4KICAgICAgICAgICAg
ICA8bnMxOnJlZ2lzdHJhdGlvbkRhdGU+MjAwMy0wMS0xNSAwMDowMDowMDwvbnMx
OnJlZ2lzdHJhdGlvbkRhdGU+CiAgICAgICAgICAgICAgPG5zMTpyZW5ld2FsRGF0
ZT4yMDE0LTA3LTMxIDAwOjAwOjAwPC9uczE6cmVuZXdhbERhdGU+PC9uczE6Y2Ny
UmVnaXN0cmF0aW9uRGV0YWlscz48L25zMTp2ZW5kb3JTaXRlRGV0YWlscz4KICAg
ICAgICAgIDxuczE6Y29udHJhY3RpbmdPZmZpY2VyQnVzaW5lc3NTaXplRGV0ZXJt
aW5hdGlvbiBkZXNjcmlwdGlvbj0iU01BTEwgQlVTSU5FU1MiPlM8L25zMTpjb250
cmFjdGluZ09mZmljZXJCdXNpbmVzc1NpemVEZXRlcm1pbmF0aW9uPjwvbnMxOnZl
bmRvcj4KICAgICAgICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZT4KICAgICAgICAg
IDxuczE6cHJpbmNpcGFsUGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgICA8
bnMxOnN0YXRlQ29kZSBuYW1lPSJNQVJZTEFORCI+TUQ8L25zMTpzdGF0ZUNvZGU+
CiAgICAgICAgICAgIDxuczE6Y291bnRyeUNvZGUgbmFtZT0iVU5JVEVEIFNUQVRF
UyI+VVNBPC9uczE6Y291bnRyeUNvZGU+PC9uczE6cHJpbmNpcGFsUGxhY2VPZlBl
cmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpwbGFjZU9mUGVyZm9ybWFuY2VaSVBD
b2RlIGNvdW50eT0iUFJJTkNFIEdFT1JHRVMiIGNpdHk9IkJFTFRTVklMTEUiPjIw
NzA1MTAwMzwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZVpJUENvZGU+CiAgICAgICAg
ICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9uYWxEaXN0cmljdD4w
NDwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9uYWxEaXN0cmljdD48
L25zMTpwbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgPG5zMTpjb21wZXRpdGlv
bj4KICAgICAgICAgIDxuczE6ZXh0ZW50Q29tcGV0ZWQgZGVzY3JpcHRpb249IkZV
TEwgQU5EIE9QRU4gQ09NUEVUSVRJT04gQUZURVIgRVhDTFVTSU9OIE9GIFNPVVJD
RVMiPkQ8L25zMTpleHRlbnRDb21wZXRlZD4KICAgICAgICAgIDxuczE6c29saWNp
dGF0aW9uUHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iU1VCSkVDVCBUTyBNVUxUSVBM
RSBBV0FSRCBGQUlSIE9QUE9SVFVOSVRZIj5NQUZPPC9uczE6c29saWNpdGF0aW9u
UHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6dHlwZU9mU2V0QXNpZGUgZGVzY3Jp
cHRpb249IjhBIENPTVBFVEVEIj44QTwvbnMxOnR5cGVPZlNldEFzaWRlPgogICAg
ICAgICAgPG5zMTpldmFsdWF0ZWRQcmVmZXJlbmNlIGRlc2NyaXB0aW9uPSJOTyBQ
UkVGRVJFTkNFIFVTRUQiPk5PTkU8L25zMTpldmFsdWF0ZWRQcmVmZXJlbmNlPgog
ICAgICAgICAgPG5zMTpzdGF0dXRvcnlFeGNlcHRpb25Ub0ZhaXJPcHBvcnR1bml0
eSBkZXNjcmlwdGlvbj0iT1RIRVIgU1RBVFVUT1JZIEFVVEhPUklUWSI+T1NBPC9u
czE6c3RhdHV0b3J5RXhjZXB0aW9uVG9GYWlyT3Bwb3J0dW5pdHk+CiAgICAgICAg
ICA8bnMxOmNvbW1lcmNpYWxJdGVtQWNxdWlzaXRpb25Qcm9jZWR1cmVzIGRlc2Ny
aXB0aW9uPSJDT01NRVJDSUFMIElURU0iPkE8L25zMTpjb21tZXJjaWFsSXRlbUFj
cXVpc2l0aW9uUHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6Y29tbWVyY2lhbEl0
ZW1UZXN0UHJvZ3JhbSBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb21tZXJjaWFs
SXRlbVRlc3RQcm9ncmFtPgogICAgICAgICAgPG5zMTpBNzZBY3Rpb24gZGVzY3Jp
cHRpb249Ik5PIj5OPC9uczE6QTc2QWN0aW9uPgogICAgICAgICAgPG5zMTpmZWRC
aXpPcHBzIGRlc2NyaXB0aW9uPSJZRVMiPlk8L25zMTpmZWRCaXpPcHBzPgogICAg
ICAgICAgPG5zMTpsb2NhbEFyZWFTZXRBc2lkZSBkZXNjcmlwdGlvbj0iTk8iPk48
L25zMTpsb2NhbEFyZWFTZXRBc2lkZT48L25zMTpjb21wZXRpdGlvbj4KICAgICAg
ICA8bnMxOnByZWZlcmVuY2VQcm9ncmFtcz4KICAgICAgICAgIDxuczE6c3ViY29u
dHJhY3RQbGFuIGRlc2NyaXB0aW9uPSJQTEFOIE5PVCBSRVFVSVJFRCAiPkI8L25z
MTpzdWJjb250cmFjdFBsYW4+PC9uczE6cHJlZmVyZW5jZVByb2dyYW1zPgogICAg
ICAgIDxuczE6dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6
Y3JlYXRlZEJ5PkpFU1NJQ0EuTUFTU0VZQEFSUy5VU0RBLkdPVjwvbnMxOmNyZWF0
ZWRCeT4KICAgICAgICAgIDxuczE6Y3JlYXRlZERhdGU+MjAxNS0wNS0yMSAxNDow
MzozNTwvbnMxOmNyZWF0ZWREYXRlPgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZp
ZWRCeT5JRFZfQ09SUkVDVDwvbnMxOmxhc3RNb2RpZmllZEJ5PgogICAgICAgICAg
PG5zMTpsYXN0TW9kaWZpZWREYXRlPjIwMTctMTAtMDQgMTQ6MjA6NDg8L25zMTps
YXN0TW9kaWZpZWREYXRlPgogICAgICAgICAgPG5zMTpzdGF0dXMgZGVzY3JpcHRp
b249IkZJTkFMIj5GPC9uczE6c3RhdHVzPgogICAgICAgICAgPG5zMTphcHByb3Zl
ZEJ5PkpFU1NJQ0EuTUFTU0VZQEFSUy5VU0RBLkdPVjwvbnMxOmFwcHJvdmVkQnk+
CiAgICAgICAgICA8bnMxOmFwcHJvdmVkRGF0ZT4yMDE1LTA2LTAzIDEzOjE3OjM2
PC9uczE6YXBwcm92ZWREYXRlPgogICAgICAgICAgPG5zMTpjbG9zZWRTdGF0dXM+
TjwvbnMxOmNsb3NlZFN0YXR1cz48L25zMTp0cmFuc2FjdGlvbkluZm9ybWF0aW9u
PjwvbnMxOmF3YXJkPgogICAgPC9jb250ZW50PgogIDwvZW50cnk+CiAgPGVudHJ5
PgogICAgPHRpdGxlPjwhW0NEQVRBW05ldyBQVVJDSEFTRSBPUkRFUiBNNjczODYx
MFAxMDI3IGF3YXJkZWQgdG8gRElMVEVYIElOQyBmb3IgdGhlIGFtb3VudCBvZiAk
NzAwXV0+PC90aXRsZT4KICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0
ZXh0L2h0bWwiIGhyZWY9Imh0dHBzOi8vd3d3LmZwZHMuZ292L2V6c2VhcmNoL3Nl
YXJjaC5kbz9zPUZQRFMmYW1wO2luZGV4TmFtZT1hd2FyZGZ1bGwmYW1wO3RlbXBs
YXRlTmFtZT0xLjUuMSZhbXA7cT1NNjczODYxMFAxMDI3Kzk3MDArIj48L2xpbms+
CiAgICA8bW9kaWZpZWQ+MjAxNy0xMS0yOSAyMzozNjo0MjwvbW9kaWZpZWQ+CiAg
ICA8Y29udGVudCB4bWxuczpuczE9Imh0dHBzOi8vd3d3LmZwZHMuZ292L0ZQRFMi
IHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+CiAgICAgIDxuczE6YXdhcmQgeG1sbnM6
bnMxPSJodHRwOi8vd3d3LmZwZHNuZy5jb20vRlBEUyIgdmVyc2lvbj0iMS4zIj4K
ICAgICAgICA8bnMxOmF3YXJkSUQ+CiAgICAgICAgICA8bnMxOmF3YXJkQ29udHJh
Y3RJRD4KICAgICAgICAgICAgPG5zMTphZ2VuY3lJRCBuYW1lPSJERVBUIE9GIERF
RkVOU0UiPjk3MDA8L25zMTphZ2VuY3lJRD4KICAgICAgICAgICAgPG5zMTpQSUlE
Pk02NzM4NjEwUDEwMjc8L25zMTpQSUlEPgogICAgICAgICAgICA8bnMxOm1vZE51
bWJlcj4wPC9uczE6bW9kTnVtYmVyPgogICAgICAgICAgICA8bnMxOnRyYW5zYWN0
aW9uTnVtYmVyPjA8L25zMTp0cmFuc2FjdGlvbk51bWJlcj48L25zMTphd2FyZENv
bnRyYWN0SUQ+PC9uczE6YXdhcmRJRD4KICAgICAgICA8bnMxOnJlbGV2YW50Q29u
dHJhY3REYXRlcz4KICAgICAgICAgIDxuczE6c2lnbmVkRGF0ZT4yMDEwLTA1LTE4
IDAwOjAwOjAwPC9uczE6c2lnbmVkRGF0ZT4KICAgICAgICAgIDxuczE6ZWZmZWN0
aXZlRGF0ZT4yMDEwLTA1LTE4IDAwOjAwOjAwPC9uczE6ZWZmZWN0aXZlRGF0ZT4K
ICAgICAgICAgIDxuczE6Y3VycmVudENvbXBsZXRpb25EYXRlPjIwMTAtMDYtMTcg
MDA6MDA6MDA8L25zMTpjdXJyZW50Q29tcGxldGlvbkRhdGU+CiAgICAgICAgICA8
bnMxOnVsdGltYXRlQ29tcGxldGlvbkRhdGU+MjAxMC0wNi0xNyAwMDowMDowMDwv
bnMxOnVsdGltYXRlQ29tcGxldGlvbkRhdGU+PC9uczE6cmVsZXZhbnRDb250cmFj
dERhdGVzPgogICAgICAgIDxuczE6ZG9sbGFyVmFsdWVzPgogICAgICAgICAgPG5z
MTpvYmxpZ2F0ZWRBbW91bnQ+NzAwLjAwPC9uczE6b2JsaWdhdGVkQW1vdW50Pgog
ICAgICAgICAgPG5zMTpiYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPjcwMC4w
MDwvbnMxOmJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAgICA8
bnMxOmJhc2VBbmRBbGxPcHRpb25zVmFsdWU+NzAwLjAwPC9uczE6YmFzZUFuZEFs
bE9wdGlvbnNWYWx1ZT48L25zMTpkb2xsYXJWYWx1ZXM+CiAgICAgICAgPG5zMTp0
b3RhbERvbGxhclZhbHVlcz4KICAgICAgICAgIDxuczE6dG90YWxPYmxpZ2F0ZWRB
bW91bnQ+NzAwLjAwPC9uczE6dG90YWxPYmxpZ2F0ZWRBbW91bnQ+CiAgICAgICAg
ICA8bnMxOnRvdGFsQmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT43MDAuMDA8
L25zMTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAg
ICA8bnMxOnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT43MDAuMDA8L25zMTp0
b3RhbEJhc2VBbmRBbGxPcHRpb25zVmFsdWU+PC9uczE6dG90YWxEb2xsYXJWYWx1
ZXM+CiAgICAgICAgPG5zMTpwdXJjaGFzZXJJbmZvcm1hdGlvbj4KICAgICAgICAg
IDxuczE6Y29udHJhY3RpbmdPZmZpY2VBZ2VuY3lJRCBuYW1lPSJERVBUIE9GIFRI
RSBOQVZZIiBkZXBhcnRtZW50SUQ9Ijk3MDAiIGRlcGFydG1lbnROYW1lPSJERVBU
IE9GIERFRkVOU0UiPjE3MDA8L25zMTpjb250cmFjdGluZ09mZmljZUFnZW5jeUlE
PgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZUlEIG5hbWU9IkNPTlRS
QUNUSU5HIE9GRklDRVIiIGNvdW50cnk9IlVTQSI+TTY3Mzg2PC9uczE6Y29udHJh
Y3RpbmdPZmZpY2VJRD4KICAgICAgICAgIDxuczE6ZnVuZGluZ1JlcXVlc3RpbmdB
Z2VuY3lJRCBuYW1lPSJERVBUIE9GIFRIRSBOQVZZIiBkZXBhcnRtZW50SUQ9Ijk3
MDAiIGRlcGFydG1lbnROYW1lPSJERVBUIE9GIERFRkVOU0UiPjE3MDA8L25zMTpm
dW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEPgogICAgICAgICAgPG5zMTpmdW5kaW5n
UmVxdWVzdGluZ09mZmljZUlEIG5hbWU9IkNPTlRSQUNUSU5HIE9GRklDRVIiPk02
NzM4NjwvbnMxOmZ1bmRpbmdSZXF1ZXN0aW5nT2ZmaWNlSUQ+CiAgICAgICAgICA8
bnMxOmZvcmVpZ25GdW5kaW5nIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+
WDwvbnMxOmZvcmVpZ25GdW5kaW5nPjwvbnMxOnB1cmNoYXNlckluZm9ybWF0aW9u
PgogICAgICAgIDxuczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAgICAg
PG5zMTpmZWVQYWlkRm9yVXNlT2ZTZXJ2aWNlPjAuMDA8L25zMTpmZWVQYWlkRm9y
VXNlT2ZTZXJ2aWNlPjwvbnMxOmNvbnRyYWN0TWFya2V0aW5nRGF0YT4KICAgICAg
ICA8bnMxOmNvbnRyYWN0RGF0YT4KICAgICAgICAgIDxuczE6Y29udHJhY3RBY3Rp
b25UeXBlIGRlc2NyaXB0aW9uPSJQVVJDSEFTRSBPUkRFUiI+QjwvbnMxOmNvbnRy
YWN0QWN0aW9uVHlwZT4KICAgICAgICAgIDxuczE6dHlwZU9mQ29udHJhY3RQcmlj
aW5nIGRlc2NyaXB0aW9uPSJGSVJNIEZJWEVEIFBSSUNFIj5KPC9uczE6dHlwZU9m
Q29udHJhY3RQcmljaW5nPgogICAgICAgICAgPG5zMTpuYXRpb25hbEludGVyZXN0
QWN0aW9uQ29kZSBkZXNjcmlwdGlvbj0iTk9ORSI+Tk9ORTwvbnMxOm5hdGlvbmFs
SW50ZXJlc3RBY3Rpb25Db2RlPgogICAgICAgICAgPG5zMTpkZXNjcmlwdGlvbk9m
Q29udHJhY3RSZXF1aXJlbWVudD5QTC9TUUwgU09GVFdBUkUgREVWRUxPUEVSPC9u
czE6ZGVzY3JpcHRpb25PZkNvbnRyYWN0UmVxdWlyZW1lbnQ+CiAgICAgICAgICA8
bnMxOkdGRS1HRlAgZGVzY3JpcHRpb249IlRyYW5zYWN0aW9uIGRvZXMgbm90IHVz
ZSBHRkUvR0ZQIj5OPC9uczE6R0ZFLUdGUD4KICAgICAgICAgIDxuczE6c2VhVHJh
bnNwb3J0YXRpb24gZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6c2VhVHJhbnNwb3J0
YXRpb24+CiAgICAgICAgICA8bnMxOnVuZGVmaW5pdGl6ZWRBY3Rpb24gZGVzY3Jp
cHRpb249Ik5PIj5YPC9uczE6dW5kZWZpbml0aXplZEFjdGlvbj4KICAgICAgICAg
IDxuczE6Y29uc29saWRhdGVkQ29udHJhY3QgZGVzY3JpcHRpb249Ik5PIj5OPC9u
czE6Y29uc29saWRhdGVkQ29udHJhY3Q+CiAgICAgICAgICA8bnMxOnBlcmZvcm1h
bmNlQmFzZWRTZXJ2aWNlQ29udHJhY3QgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNB
QkxFIj5YPC9uczE6cGVyZm9ybWFuY2VCYXNlZFNlcnZpY2VDb250cmFjdD4KICAg
ICAgICAgIDxuczE6Y29udHJhY3RGaW5hbmNpbmcgZGVzY3JpcHRpb249Ik5PVCBB
UFBMSUNBQkxFIj5aPC9uczE6Y29udHJhY3RGaW5hbmNpbmc+CiAgICAgICAgICA8
bnMxOnB1cmNoYXNlQ2FyZEFzUGF5bWVudE1ldGhvZCBkZXNjcmlwdGlvbj0iTk8i
Pk48L25zMTpwdXJjaGFzZUNhcmRBc1BheW1lbnRNZXRob2Q+CiAgICAgICAgICA8
bnMxOm51bWJlck9mQWN0aW9ucz4xPC9uczE6bnVtYmVyT2ZBY3Rpb25zPjwvbnMx
OmNvbnRyYWN0RGF0YT4KICAgICAgICA8bnMxOmxlZ2lzbGF0aXZlTWFuZGF0ZXM+
CiAgICAgICAgICA8bnMxOkNsaW5nZXJDb2hlbkFjdCBkZXNjcmlwdGlvbj0iWUVT
Ij5ZPC9uczE6Q2xpbmdlckNvaGVuQWN0PgogICAgICAgICAgPG5zMTptYXRlcmlh
bHNTdXBwbGllc0FydGljbGVzRXF1aXBtZW50IGRlc2NyaXB0aW9uPSJOTyI+Tjwv
bnMxOm1hdGVyaWFsc1N1cHBsaWVzQXJ0aWNsZXNFcXVpcG1lbnQ+CiAgICAgICAg
ICA8bnMxOmxhYm9yU3RhbmRhcmRzIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmxh
Ym9yU3RhbmRhcmRzPgogICAgICAgICAgPG5zMTpjb25zdHJ1Y3Rpb25XYWdlUmF0
ZVJlcXVpcmVtZW50cyBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb25zdHJ1Y3Rp
b25XYWdlUmF0ZVJlcXVpcmVtZW50cz4KICAgICAgICAgIDxuczE6bGlzdE9mQWRk
aXRpb25hbFJlcG9ydGluZ1ZhbHVlcz48L25zMTpsaXN0T2ZBZGRpdGlvbmFsUmVw
b3J0aW5nVmFsdWVzPgogICAgICAgICAgPG5zMTppbnRlcmFnZW5jeUNvbnRyYWN0
aW5nQXV0aG9yaXR5IGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMx
OmludGVyYWdlbmN5Q29udHJhY3RpbmdBdXRob3JpdHk+PC9uczE6bGVnaXNsYXRp
dmVNYW5kYXRlcz4KICAgICAgICA8bnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1h
dGlvbj4KICAgICAgICAgIDxuczE6cHJvZHVjdE9yU2VydmljZUNvZGUgZGVzY3Jp
cHRpb249IkFEUCBTT0ZUV0FSRSIgcHJvZHVjdE9yU2VydmljZVR5cGU9IlBST0RV
Q1QiPjcwMzA8L25zMTpwcm9kdWN0T3JTZXJ2aWNlQ29kZT4KICAgICAgICAgIDxu
czE6Y29udHJhY3RCdW5kbGluZyBkZXNjcmlwdGlvbj0iTk9UIEEgQlVORExFRCBS
RVFVSVJFTUVOVCI+RDwvbnMxOmNvbnRyYWN0QnVuZGxpbmc+CiAgICAgICAgICA8
bnMxOmNsYWltYW50UHJvZ3JhbUNvZGUgZGVzY3JpcHRpb249IkFMTCBPVEhFUlMg
Tk9UIElERU5USUZJQUJMRSBUTyBBTlkgT1RIRVIgUFJPQ1VSRU1FTlQgUFJPR1JB
TSI+QzlFPC9uczE6Y2xhaW1hbnRQcm9ncmFtQ29kZT4KICAgICAgICAgIDxuczE6
cHJpbmNpcGFsTkFJQ1NDb2RlIGRlc2NyaXB0aW9uPSJDT01QVVRFUiBBTkQgQ09N
UFVURVIgUEVSSVBIRVJBTCBFUVVJUE1FTlQgQU5EIFNPRlRXQVJFIE1FUkNIQU5U
IFdIT0xFU0FMRVJTIj40MjM0MzA8L25zMTpwcmluY2lwYWxOQUlDU0NvZGU+CiAg
ICAgICAgICA8bnMxOnJlY292ZXJlZE1hdGVyaWFsQ2xhdXNlcyBkZXNjcmlwdGlv
bj0iTk8gQ0xBVVNFUyBJTkNMVURFRCBBTkQgTk8gU1VTVEFJTkFCSUxJVFkgSU5D
TFVERUQiPkM8L25zMTpyZWNvdmVyZWRNYXRlcmlhbENsYXVzZXM+CiAgICAgICAg
ICA8bnMxOm1hbnVmYWN0dXJpbmdPcmdhbml6YXRpb25UeXBlIGRlc2NyaXB0aW9u
PSJVLlMuIE9XTkVEIEJVU0lORVNTIj5BPC9uczE6bWFudWZhY3R1cmluZ09yZ2Fu
aXphdGlvblR5cGU+CiAgICAgICAgICA8bnMxOnN5c3RlbUVxdWlwbWVudENvZGUg
ZGVzY3JpcHRpb249Ik5PTkUiPjAwMDwvbnMxOnN5c3RlbUVxdWlwbWVudENvZGU+
CiAgICAgICAgICA8bnMxOmluZm9ybWF0aW9uVGVjaG5vbG9neUNvbW1lcmNpYWxJ
dGVtQ2F0ZWdvcnkgZGVzY3JpcHRpb249IkNPTU1FUkNJQUxMWSBBVkFJTEFCTEUi
PkE8L25zMTppbmZvcm1hdGlvblRlY2hub2xvZ3lDb21tZXJjaWFsSXRlbUNhdGVn
b3J5PgogICAgICAgICAgPG5zMTp1c2VPZkVQQURlc2lnbmF0ZWRQcm9kdWN0cyBk
ZXNjcmlwdGlvbj0iTUVFVFMgUkVRVUlSRU1FTlRTIj5BPC9uczE6dXNlT2ZFUEFE
ZXNpZ25hdGVkUHJvZHVjdHM+CiAgICAgICAgICA8bnMxOmNvdW50cnlPZk9yaWdp
biBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZPcmlnaW4+
CiAgICAgICAgICA8bnMxOnBsYWNlT2ZNYW51ZmFjdHVyZSBkZXNjcmlwdGlvbj0i
TUZHIElOIFUuUy4iPkQ8L25zMTpwbGFjZU9mTWFudWZhY3R1cmU+PC9uczE6cHJv
ZHVjdE9yU2VydmljZUluZm9ybWF0aW9uPgogICAgICAgIDxuczE6dmVuZG9yPgog
ICAgICAgICAgPG5zMTp2ZW5kb3JIZWFkZXI+CiAgICAgICAgICAgIDxuczE6dmVu
ZG9yTmFtZT5ESUxURVggSU5DPC9uczE6dmVuZG9yTmFtZT48L25zMTp2ZW5kb3JI
ZWFkZXI+CiAgICAgICAgICA8bnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAg
ICAgICA8bnMxOnZlbmRvclNvY2lvRWNvbm9taWNJbmRpY2F0b3JzPgogICAgICAg
ICAgICAgIDxuczE6aXNBbGFza2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmly
bT5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZU93bmVkQ29ycG9yYXRpb25PckZp
cm0+CiAgICAgICAgICAgICAgPG5zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+ZmFs
c2U8L25zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+CiAgICAgICAgICAgICAgPG5z
MTppc0luZGlhblRyaWJlPmZhbHNlPC9uczE6aXNJbmRpYW5UcmliZT4KICAgICAg
ICAgICAgICA8bnMxOmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9y
RmlybT5mYWxzZTwvbnMxOmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlv
bk9yRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+
ZmFsc2U8L25zMTppc1RyaWJhbGx5T3duZWRGaXJtPgogICAgICAgICAgICAgIDxu
czE6aXNWZXRlcmFuT3duZWQ+ZmFsc2U8L25zMTppc1ZldGVyYW5Pd25lZD4KICAg
ICAgICAgICAgICA8bnMxOmlzU2VydmljZVJlbGF0ZWREaXNhYmxlZFZldGVyYW5P
d25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVk
VmV0ZXJhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dvbWVu
T3duZWQ+dHJ1ZTwvbnMxOmlzV29tZW5Pd25lZD4KICAgICAgICAgICAgICA8bnMx
Om1pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTWlub3JpdHlP
d25lZD50cnVlPC9uczE6aXNNaW5vcml0eU93bmVkPgogICAgICAgICAgICAgICAg
PG5zMTppc1N1YkNvbnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNzPnRy
dWU8L25zMTppc1N1YkNvbnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNz
PgogICAgICAgICAgICAgICAgPG5zMTppc0FzaWFuUGFjaWZpY0FtZXJpY2FuT3du
ZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPgogICAgICAgICAgICAgICAgPG5zMTppc0JsYWNrQW1lcmljYW5P
d25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNCbGFja0FtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY0FtZXJpY2FuT3du
ZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzSGlzcGFuaWNBbWVyaWNhbk93bmVkQnVz
aW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzTmF0aXZlQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVzaW5l
c3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzT3RoZXJNaW5vcml0eU93bmVkPmZh
bHNlPC9uczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+PC9uczE6bWlub3JpdHlPd25l
ZD4KICAgICAgICAgICAgICA8bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+ZmFsc2U8
L25zMTppc1ZlcnlTbWFsbEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNX
b21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZFNt
YWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0Vjb25vbWljYWxseURp
c2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlz
RWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNz
PgogICAgICAgICAgICAgIDxuczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21h
bGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzSm9pbnRWZW50dXJlV29tZW5Pd25lZFNt
YWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZUVj
b25vbWljYWxseURpc2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5m
YWxzZTwvbnMxOmlzSm9pbnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50YWdl
ZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPjwvbnMxOnZlbmRvclNvY2lvRWNvbm9t
aWNJbmRpY2F0b3JzPgogICAgICAgICAgICA8bnMxOnZlbmRvckJ1c2luZXNzVHlw
ZXM+CiAgICAgICAgICAgICAgPG5zMTppc0NvbW11bml0eURldmVsb3BlZENvcnBv
cmF0aW9uT3duZWRGaXJtPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wZWRD
b3Jwb3JhdGlvbk93bmVkRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzTGFib3JT
dXJwbHVzQXJlYUZpcm0+ZmFsc2U8L25zMTppc0xhYm9yU3VycGx1c0FyZWFGaXJt
PgogICAgICAgICAgICAgIDxuczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzRmVkZXJhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0Zl
ZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVyYWxs
eUZ1bmRlZFJlc2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPmZhbHNlPC9uczE6aXNG
ZWRlcmFsbHlGdW5kZWRSZXNlYXJjaEFuZERldmVsb3BtZW50Q29ycD4KICAgICAg
ICAgICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT5mYWxzZTwv
bnMxOmlzRmVkZXJhbEdvdmVybm1lbnRBZ2VuY3k+PC9uczE6ZmVkZXJhbEdvdmVy
bm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTppc1N0YXRlR292ZXJubWVudD5mYWxz
ZTwvbnMxOmlzU3RhdGVHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6bG9j
YWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzTG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAg
ICAgPG5zMTppc0NpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NpdHlM
b2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ291bnR5TG9j
YWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNDb3VudHlMb2NhbEdvdmVybm1lbnQ+
CiAgICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVy
bm1lbnQ+ZmFsc2U8L25zMTppc0ludGVyTXVuaWNpcGFsTG9jYWxHb3Zlcm5tZW50
PgogICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJubWVudE93bmVkPmZh
bHNlPC9uczE6aXNMb2NhbEdvdmVybm1lbnRPd25lZD4KICAgICAgICAgICAgICAg
IDxuczE6aXNNdW5pY2lwYWxpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTpp
c011bmljaXBhbGl0eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxu
czE6aXNTY2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
U2Nob29sRGlzdHJpY3RMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8
bnMxOmlzVG93bnNoaXBMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1Rvd25z
aGlwTG9jYWxHb3Zlcm5tZW50PjwvbnMxOmxvY2FsR292ZXJubWVudD4KICAgICAg
ICAgICAgICA8bnMxOmlzVHJpYmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVHJp
YmFsR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbkdvdmVy
bm1lbnQ+ZmFsc2U8L25zMTppc0ZvcmVpZ25Hb3Zlcm5tZW50PgogICAgICAgICAg
ICAgIDxuczE6YnVzaW5lc3NPck9yZ2FuaXphdGlvblR5cGU+CiAgICAgICAgICAg
ICAgICA8bnMxOmlzQ29ycG9yYXRlRW50aXR5Tm90VGF4RXhlbXB0PmZhbHNlPC9u
czE6aXNDb3Jwb3JhdGVFbnRpdHlOb3RUYXhFeGVtcHQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzQ29ycG9yYXRlRW50aXR5VGF4RXhlbXB0PmZhbHNlPC9uczE6aXND
b3Jwb3JhdGVFbnRpdHlUYXhFeGVtcHQ+CiAgICAgICAgICAgICAgICA8bnMxOmlz
UGFydG5lcnNoaXBPckxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcD5mYWxzZTwv
bnMxOmlzUGFydG5lcnNoaXBPckxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcD4K
ICAgICAgICAgICAgICAgIDxuczE6aXNTb2xlUHJvcHJlaXRvcnNoaXA+ZmFsc2U8
L25zMTppc1NvbGVQcm9wcmVpdG9yc2hpcD4KICAgICAgICAgICAgICAgIDxuczE6
aXNTbWFsbEFncmljdWx0dXJhbENvb3BlcmF0aXZlPmZhbHNlPC9uczE6aXNTbWFs
bEFncmljdWx0dXJhbENvb3BlcmF0aXZlPgogICAgICAgICAgICAgICAgPG5zMTpp
c0ludGVybmF0aW9uYWxPcmdhbml6YXRpb24+ZmFsc2U8L25zMTppc0ludGVybmF0
aW9uYWxPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8bnMxOmlzVVNHb3Zl
cm5tZW50RW50aXR5PmZhbHNlPC9uczE6aXNVU0dvdmVybm1lbnRFbnRpdHk+PC9u
czE6YnVzaW5lc3NPck9yZ2FuaXphdGlvblR5cGU+PC9uczE6dmVuZG9yQnVzaW5l
c3NUeXBlcz4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4K
ICAgICAgICAgICAgICA8bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcG1lbnRDb3Jwb3Jh
dGlvbj5mYWxzZTwvbnMxOmlzQ29tbXVuaXR5RGV2ZWxvcG1lbnRDb3Jwb3JhdGlv
bj4KICAgICAgICAgICAgICA8bnMxOmlzRG9tZXN0aWNTaGVsdGVyPmZhbHNlPC9u
czE6aXNEb21lc3RpY1NoZWx0ZXI+CiAgICAgICAgICAgICAgPG5zMTppc0VkdWNh
dGlvbmFsSW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc0VkdWNhdGlvbmFsSW5zdGl0
dXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc0ZvdW5kYXRpb24+ZmFsc2U8L25z
MTppc0ZvdW5kYXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc0hvc3BpdGFsPmZh
bHNlPC9uczE6aXNIb3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzTWFudWZh
Y3R1cmVyT2ZHb29kcz5mYWxzZTwvbnMxOmlzTWFudWZhY3R1cmVyT2ZHb29kcz4K
ICAgICAgICAgICAgICA8bnMxOmlzVmV0ZXJpbmFyeUhvc3BpdGFsPmZhbHNlPC9u
czE6aXNWZXRlcmluYXJ5SG9zcGl0YWw+CiAgICAgICAgICAgICAgPG5zMTppc0hp
c3BhbmljU2VydmljaW5nSW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc0hpc3Bhbmlj
U2VydmljaW5nSW5zdGl0dXRpb24+PC9uczE6dmVuZG9yTGluZU9mQnVzaW5lc3M+
CiAgICAgICAgICAgIDxuczE6dmVuZG9yUmVsYXRpb25zaGlwV2l0aEZlZGVyYWxH
b3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6cmVjZWl2ZXNDb250cmFjdHM+
dHJ1ZTwvbnMxOnJlY2VpdmVzQ29udHJhY3RzPgogICAgICAgICAgICAgIDxuczE6
cmVjZWl2ZXNHcmFudHM+ZmFsc2U8L25zMTpyZWNlaXZlc0dyYW50cz4KICAgICAg
ICAgICAgICA8bnMxOnJlY2VpdmVzQ29udHJhY3RzQW5kR3JhbnRzPmZhbHNlPC9u
czE6cmVjZWl2ZXNDb250cmFjdHNBbmRHcmFudHM+PC9uczE6dmVuZG9yUmVsYXRp
b25zaGlwV2l0aEZlZGVyYWxHb3Zlcm5tZW50PgogICAgICAgICAgICA8bnMxOnR5
cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAgICAgICAgICAgPG5zMTppc0FpcnBv
cnRBdXRob3JpdHk+ZmFsc2U8L25zMTppc0FpcnBvcnRBdXRob3JpdHk+CiAgICAg
ICAgICAgICAgPG5zMTppc0NvdW5jaWxPZkdvdmVybm1lbnRzPmZhbHNlPC9uczE6
aXNDb3VuY2lsT2ZHb3Zlcm5tZW50cz4KICAgICAgICAgICAgICA8bnMxOmlzSG91
c2luZ0F1dGhvcml0aWVzUHVibGljT3JUcmliYWw+ZmFsc2U8L25zMTppc0hvdXNp
bmdBdXRob3JpdGllc1B1YmxpY09yVHJpYmFsPgogICAgICAgICAgICAgIDxuczE6
aXNJbnRlcnN0YXRlRW50aXR5PmZhbHNlPC9uczE6aXNJbnRlcnN0YXRlRW50aXR5
PgogICAgICAgICAgICAgIDxuczE6aXNQbGFubmluZ0NvbW1pc3Npb24+ZmFsc2U8
L25zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj4KICAgICAgICAgICAgICA8bnMxOmlz
UG9ydEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzUG9ydEF1dGhvcml0eT4KICAgICAg
ICAgICAgICA8bnMxOmlzVHJhbnNpdEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzVHJh
bnNpdEF1dGhvcml0eT48L25zMTp0eXBlT2ZHb3Zlcm5tZW50RW50aXR5PgogICAg
ICAgICAgICA8bnMxOnZlbmRvck9yZ2FuaXphdGlvbkZhY3RvcnM+CiAgICAgICAg
ICAgICAgPG5zMTppc1N1YmNoYXB0ZXJTQ29ycG9yYXRpb24+dHJ1ZTwvbnMxOmlz
U3ViY2hhcHRlclNDb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzTGlt
aXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNMaW1pdGVkTGlh
YmlsaXR5Q29ycG9yYXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc0ZvcmVpZ25P
d25lZEFuZExvY2F0ZWQ+ZmFsc2U8L25zMTppc0ZvcmVpZ25Pd25lZEFuZExvY2F0
ZWQ+CiAgICAgICAgICAgICAgPG5zMTpwcm9maXRTdHJ1Y3R1cmU+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzRm9yUHJvZml0T3JnYW5pemF0aW9uPnRydWU8L25zMTpp
c0ZvclByb2ZpdE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNO
b25wcm9maXRPcmdhbml6YXRpb24+ZmFsc2U8L25zMTppc05vbnByb2ZpdE9yZ2Fu
aXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck5vdEZvclByb2Zp
dE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdh
bml6YXRpb24+PC9uczE6cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgIDxu
czE6aXNTaGVsdGVyZWRXb3Jrc2hvcD5mYWxzZTwvbnMxOmlzU2hlbHRlcmVkV29y
a3Nob3A+CiAgICAgICAgICAgICAgPG5zMTpvcmdhbml6YXRpb25hbFR5cGU+T1RI
RVI8L25zMTpvcmdhbml6YXRpb25hbFR5cGU+CiAgICAgICAgICAgICAgPG5zMTpu
dW1iZXJPZkVtcGxveWVlcz40PC9uczE6bnVtYmVyT2ZFbXBsb3llZXM+CiAgICAg
ICAgICAgICAgPG5zMTphbm51YWxSZXZlbnVlPjIwMDAwMDA8L25zMTphbm51YWxS
ZXZlbnVlPjwvbnMxOnZlbmRvck9yZ2FuaXphdGlvbkZhY3RvcnM+CiAgICAgICAg
ICAgIDxuczE6dHlwZU9mRWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAgICAgICAgICAg
PG5zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6aXMxODYyTGFu
ZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzMTg5MExhbmRHcmFu
dENvbGxlZ2U+ZmFsc2U8L25zMTppczE4OTBMYW5kR3JhbnRDb2xsZWdlPgogICAg
ICAgICAgICAgIDxuczE6aXMxOTk0TGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMx
OmlzMTk5NExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc0hp
c3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eT5mYWxzZTwvbnMxOmlz
SGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5PgogICAgICAgICAg
ICAgIDxuczE6aXNNaW5vcml0eUluc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNNaW5v
cml0eUluc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNQcml2YXRlVW5p
dmVyc2l0eU9yQ29sbGVnZT5mYWxzZTwvbnMxOmlzUHJpdmF0ZVVuaXZlcnNpdHlP
ckNvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc1NjaG9vbE9mRm9yZXN0cnk+
ZmFsc2U8L25zMTppc1NjaG9vbE9mRm9yZXN0cnk+CiAgICAgICAgICAgICAgPG5z
MTppc1N0YXRlQ29udHJvbGxlZEluc3RpdHV0aW9ub2ZIaWdoZXJMZWFybmluZz5m
YWxzZTwvbnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25vZkhpZ2hlckxl
YXJuaW5nPgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxDb2xsZWdlPmZhbHNl
PC9uczE6aXNUcmliYWxDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXNWZXRl
cmluYXJ5Q29sbGVnZT5mYWxzZTwvbnMxOmlzVmV0ZXJpbmFyeUNvbGxlZ2U+CiAg
ICAgICAgICAgICAgPG5zMTppc0FsYXNrYW5OYXRpdmVTZXJ2aWNpbmdJbnN0aXR1
dGlvbj5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0
aW9uPgogICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPjwvbnMxOnR5cGVPZkVkdWNhdGlvbmFsRW50aXR5PgogICAg
ICAgICAgICA8bnMxOnZlbmRvckNlcnRpZmljYXRpb25zPgogICAgICAgICAgICAg
IDxuczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2VkQnVzaW5lc3NFbnRlcnBy
aXNlPmZhbHNlPC9uczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2VkQnVzaW5l
c3NFbnRlcnByaXNlPgogICAgICAgICAgICAgIDxuczE6aXNTZWxmQ2VydGlmaWVk
U21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+dHJ1ZTwvbnMxOmlzU2VsZkNlcnRp
ZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxu
czE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+
CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRpZmllZDhBUHJvZ3JhbVBhcnRp
Y2lwYW50PmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWQ4QVByb2dyYW1QYXJ0aWNp
cGFudD4KICAgICAgICAgICAgICA8bnMxOmlzU2VsZkNlcnRpZmllZEhVQlpvbmVK
b2ludFZlbnR1cmU+ZmFsc2U8L25zMTppc1NlbGZDZXJ0aWZpZWRIVUJab25lSm9p
bnRWZW50dXJlPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRIVUJa
b25lPmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWRIVUJab25lPgogICAgICAgICAg
ICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QUpvaW50VmVudHVyZT5mYWxzZTwvbnMx
OmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+PC9uczE6dmVuZG9yQ2VydGlm
aWNhdGlvbnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yTG9jYXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTpzdHJlZXRBZGRyZXNzPjE0NTMwIFBBQ0lGSUMgQVZFPC9u
czE6c3RyZWV0QWRkcmVzcz4KICAgICAgICAgICAgICA8bnMxOmNpdHk+QkFMRFdJ
TiBQQVJLPC9uczE6Y2l0eT4KICAgICAgICAgICAgICA8bnMxOnN0YXRlIG5hbWU9
IkNBTElGT1JOSUEiPkNBPC9uczE6c3RhdGU+CiAgICAgICAgICAgICAgPG5zMTpa
SVBDb2RlPjkxNzA2NTM0MDwvbnMxOlpJUENvZGU+CiAgICAgICAgICAgICAgPG5z
MTpjb3VudHJ5Q29kZSBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3Vu
dHJ5Q29kZT4KICAgICAgICAgICAgICA8bnMxOnBob25lTm8+NjI2OTYwMTMxNDwv
bnMxOnBob25lTm8+CiAgICAgICAgICAgICAgPG5zMTpmYXhObz42MjY5NTYwNjE1
PC9uczE6ZmF4Tm8+CiAgICAgICAgICAgICAgPG5zMTpjb25ncmVzc2lvbmFsRGlz
dHJpY3RDb2RlPjMyPC9uczE6Y29uZ3Jlc3Npb25hbERpc3RyaWN0Q29kZT48L25z
MTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JTaXRlQ29k
ZT45Njk5MDc5MTQ8L25zMTp2ZW5kb3JTaXRlQ29kZT4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT45MTcwNjUzNDA8L25zMTp2ZW5kb3JB
bHRlcm5hdGVTaXRlQ29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JEVU5TSW5m
b3JtYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpEVU5TTnVtYmVyPjk2OTkwNzkx
NDwvbnMxOkRVTlNOdW1iZXI+CiAgICAgICAgICAgICAgPG5zMTp2ZW5kb3JOYW1l
PkRJTFRFWCBJTkM8L25zMTp2ZW5kb3JOYW1lPgogICAgICAgICAgICAgIDxuczE6
Z2xvYmFsUGFyZW50RFVOU051bWJlcj45Njk5MDc5MTQ8L25zMTpnbG9iYWxQYXJl
bnREVU5TTnVtYmVyPgogICAgICAgICAgICAgIDxuczE6Z2xvYmFsUGFyZW50RFVO
U05hbWU+RElMVEVYIElOQzwvbnMxOmdsb2JhbFBhcmVudERVTlNOYW1lPjwvbnMx
OnZlbmRvckRVTlNJbmZvcm1hdGlvbj4KICAgICAgICAgICAgPG5zMTpjY3JSZWdp
c3RyYXRpb25EZXRhaWxzPgogICAgICAgICAgICAgIDxuczE6cmVnaXN0cmF0aW9u
RGF0ZT4yMDA1LTEwLTAyIDAwOjAwOjAwPC9uczE6cmVnaXN0cmF0aW9uRGF0ZT4K
ICAgICAgICAgICAgICA8bnMxOnJlbmV3YWxEYXRlPjIwMTEtMDEtMTIgMDA6MDA6
MDA8L25zMTpyZW5ld2FsRGF0ZT48L25zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxz
PjwvbnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAgICAgPG5zMTpjb250cmFj
dGluZ09mZmljZXJCdXNpbmVzc1NpemVEZXRlcm1pbmF0aW9uIGRlc2NyaXB0aW9u
PSJTTUFMTCBCVVNJTkVTUyI+UzwvbnMxOmNvbnRyYWN0aW5nT2ZmaWNlckJ1c2lu
ZXNzU2l6ZURldGVybWluYXRpb24+PC9uczE6dmVuZG9yPgogICAgICAgIDxuczE6
cGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpwcmluY2lwYWxQbGFj
ZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICAgIDxuczE6c3RhdGVDb2RlIG5hbWU9
Ik1JU1NPVVJJIj5NTzwvbnMxOnN0YXRlQ29kZT4KICAgICAgICAgICAgPG5zMTpj
b3VudHJ5Q29kZSBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5
Q29kZT48L25zMTpwcmluY2lwYWxQbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAg
ICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZVpJUENvZGUgY291bnR5PSJKQUNLU09O
IiBjaXR5PSJLQU5TQVMgQ0lUWSI+NjQxNDcxMjA4PC9uczE6cGxhY2VPZlBlcmZv
cm1hbmNlWklQQ29kZT4KICAgICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNl
Q29uZ3Jlc3Npb25hbERpc3RyaWN0PjA1PC9uczE6cGxhY2VPZlBlcmZvcm1hbmNl
Q29uZ3Jlc3Npb25hbERpc3RyaWN0PjwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZT4K
ICAgICAgICA8bnMxOmNvbXBldGl0aW9uPgogICAgICAgICAgPG5zMTpleHRlbnRD
b21wZXRlZCBkZXNjcmlwdGlvbj0iRlVMTCBBTkQgT1BFTiBDT01QRVRJVElPTiBB
RlRFUiBFWENMVVNJT04gT0YgU09VUkNFUyI+RDwvbnMxOmV4dGVudENvbXBldGVk
PgogICAgICAgICAgPG5zMTpzb2xpY2l0YXRpb25Qcm9jZWR1cmVzIGRlc2NyaXB0
aW9uPSJORUdPVElBVEVEIFBST1BPU0FML1FVT1RFIj5OUDwvbnMxOnNvbGljaXRh
dGlvblByb2NlZHVyZXM+CiAgICAgICAgICA8bnMxOnR5cGVPZlNldEFzaWRlIGRl
c2NyaXB0aW9uPSJTTUFMTCBCVVNJTkVTUyBTRVQgQVNJREUgLSBUT1RBTCI+U0JB
PC9uczE6dHlwZU9mU2V0QXNpZGU+CiAgICAgICAgICA8bnMxOmV2YWx1YXRlZFBy
ZWZlcmVuY2UgZGVzY3JpcHRpb249Ik5PIFBSRUZFUkVOQ0UgVVNFRCI+Tk9ORTwv
bnMxOmV2YWx1YXRlZFByZWZlcmVuY2U+CiAgICAgICAgICA8bnMxOm51bWJlck9m
T2ZmZXJzUmVjZWl2ZWQ+MjwvbnMxOm51bWJlck9mT2ZmZXJzUmVjZWl2ZWQ+CiAg
ICAgICAgICA8bnMxOmNvbW1lcmNpYWxJdGVtQWNxdWlzaXRpb25Qcm9jZWR1cmVz
IGRlc2NyaXB0aW9uPSJDT01NRVJDSUFMIElURU0iPkE8L25zMTpjb21tZXJjaWFs
SXRlbUFjcXVpc2l0aW9uUHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6Y29tbWVy
Y2lhbEl0ZW1UZXN0UHJvZ3JhbSBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb21t
ZXJjaWFsSXRlbVRlc3RQcm9ncmFtPgogICAgICAgICAgPG5zMTpzbWFsbEJ1c2lu
ZXNzQ29tcGV0aXRpdmVuZXNzRGVtb25zdHJhdGlvblByb2dyYW0+ZmFsc2U8L25z
MTpzbWFsbEJ1c2luZXNzQ29tcGV0aXRpdmVuZXNzRGVtb25zdHJhdGlvblByb2dyYW0+
CiAgICAgICAgICA8bnMxOkE3NkFjdGlvbiBkZXNjcmlwdGlvbj0iTk8iPk48L25z
MTpBNzZBY3Rpb24+CiAgICAgICAgICA8bnMxOmZlZEJpek9wcHMgZGVzY3JpcHRp
b249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6ZmVkQml6T3Bwcz4KICAgICAgICAg
IDxuczE6bG9jYWxBcmVhU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6
bG9jYWxBcmVhU2V0QXNpZGU+CiAgICAgICAgICA8bnMxOnByaWNlRXZhbHVhdGlv
blBlcmNlbnREaWZmZXJlbmNlPjAuMDA8L25zMTpwcmljZUV2YWx1YXRpb25QZXJj
ZW50RGlmZmVyZW5jZT48L25zMTpjb21wZXRpdGlvbj4KICAgICAgICA8bnMxOnBy
ZWZlcmVuY2VQcm9ncmFtcz4KICAgICAgICAgIDxuczE6c3ViY29udHJhY3RQbGFu
IGRlc2NyaXB0aW9uPSJQTEFOIE5PVCBSRVFVSVJFRCAiPkI8L25zMTpzdWJjb250
cmFjdFBsYW4+PC9uczE6cHJlZmVyZW5jZVByb2dyYW1zPgogICAgICAgIDxuczE6
dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6Y3JlYXRlZEJ5
PkpVRFkuUlVQQVJELk02NzM4NkBVU01DLk1JTDwvbnMxOmNyZWF0ZWRCeT4KICAg
ICAgICAgIDxuczE6Y3JlYXRlZERhdGU+MjAxMC0wNS0xOCAwODo1OTowNzwvbnMx
OmNyZWF0ZWREYXRlPgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZpZWRCeT5ET0Rf
Q0xPU0VPVVQ8L25zMTpsYXN0TW9kaWZpZWRCeT4KICAgICAgICAgIDxuczE6bGFz
dE1vZGlmaWVkRGF0ZT4yMDE3LTExLTI5IDIzOjM2OjQyPC9uczE6bGFzdE1vZGlm
aWVkRGF0ZT4KICAgICAgICAgIDxuczE6c3RhdHVzIGRlc2NyaXB0aW9uPSJGSU5B
TCI+RjwvbnMxOnN0YXR1cz4KICAgICAgICAgIDxuczE6YXBwcm92ZWRCeT5BTkRS
RUEuTEVBQ0guTTY3Mzg2QFVTTUMuTUlMPC9uczE6YXBwcm92ZWRCeT4KICAgICAg
ICAgIDxuczE6YXBwcm92ZWREYXRlPjIwMTAtMDUtMTggMTA6MDQ6MTI8L25zMTph
cHByb3ZlZERhdGU+CiAgICAgICAgICA8bnMxOmNsb3NlZEJ5PkRPRF9DTE9TRU9V
VDwvbnMxOmNsb3NlZEJ5PgogICAgICAgICAgPG5zMTpjbG9zZWREYXRlPjIwMTct
MTEtMjkgMjM6MzY6NDI8L25zMTpjbG9zZWREYXRlPgogICAgICAgICAgPG5zMTpj
bG9zZWRTdGF0dXM+WTwvbnMxOmNsb3NlZFN0YXR1cz48L25zMTp0cmFuc2FjdGlv
bkluZm9ybWF0aW9uPjwvbnMxOmF3YXJkPgogICAgPC9jb250ZW50PgogIDwvZW50
cnk+CiAgPGVudHJ5PgogICAgPHRpdGxlPjwhW0NEQVRBW05ldyBQVVJDSEFTRSBP
UkRFUiBBRzY0V0NQMTQwMDgzIGF3YXJkZWQgdG8gU09GVENIT0lDRSBDT1JQT1JB
VElPTiBmb3IgdGhlIGFtb3VudCBvZiAkMjE2XV0+PC90aXRsZT4KICAgIDxsaW5r
IHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiIGhyZWY9Imh0dHBzOi8v
d3d3LmZwZHMuZ292L2V6c2VhcmNoL3NlYXJjaC5kbz9zPUZQRFMmYW1wO2luZGV4
TmFtZT1hd2FyZGZ1bGwmYW1wO3RlbXBsYXRlTmFtZT0xLjUuMSZhbXA7cT1BRzY0
V0NQMTQwMDgzKzEyMDUrIj48L2xpbms+CiAgICA8bW9kaWZpZWQ+MjAxNC0wNi0y
OSAxMjozNzo1NzwvbW9kaWZpZWQ+CiAgICA8Y29udGVudCB4bWxuczpuczE9Imh0
dHBzOi8vd3d3LmZwZHMuZ292L0ZQRFMiIHR5cGU9ImFwcGxpY2F0aW9uL3htbCI+
CiAgICAgIDxuczE6YXdhcmQgeG1sbnM6bnMxPSJodHRwOi8vd3d3LmZwZHNuZy5j
b20vRlBEUyIgdmVyc2lvbj0iMS40Ij4KICAgICAgICA8bnMxOmF3YXJkSUQ+CiAg
ICAgICAgICA8bnMxOmF3YXJkQ29udHJhY3RJRD4KICAgICAgICAgICAgPG5zMTph
Z2VuY3lJRCBuYW1lPSJVU0RBLCBPRkZJQ0UgT0YgVEhFIENISUVGIEZJTkFOQ0lB
TCBPRkZJQ0VSIj4xMjA1PC9uczE6YWdlbmN5SUQ+CiAgICAgICAgICAgIDxuczE6
UElJRD5BRzY0V0NQMTQwMDgzPC9uczE6UElJRD4KICAgICAgICAgICAgPG5zMTpt
b2ROdW1iZXI+MDwvbnMxOm1vZE51bWJlcj4KICAgICAgICAgICAgPG5zMTp0cmFu
c2FjdGlvbk51bWJlcj4wPC9uczE6dHJhbnNhY3Rpb25OdW1iZXI+PC9uczE6YXdh
cmRDb250cmFjdElEPjwvbnMxOmF3YXJkSUQ+CiAgICAgICAgPG5zMTpyZWxldmFu
dENvbnRyYWN0RGF0ZXM+CiAgICAgICAgICA8bnMxOnNpZ25lZERhdGU+MjAxNC0w
Ni0yOSAwMDowMDowMDwvbnMxOnNpZ25lZERhdGU+CiAgICAgICAgICA8bnMxOmVm
ZmVjdGl2ZURhdGU+MjAxNC0wNi0yNyAwMDowMDowMDwvbnMxOmVmZmVjdGl2ZURh
dGU+CiAgICAgICAgICA8bnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4yMDE1LTA2
LTMwIDAwOjAwOjAwPC9uczE6Y3VycmVudENvbXBsZXRpb25EYXRlPgogICAgICAg
ICAgPG5zMTp1bHRpbWF0ZUNvbXBsZXRpb25EYXRlPjIwMTUtMDYtMzAgMDA6MDA6
MDA8L25zMTp1bHRpbWF0ZUNvbXBsZXRpb25EYXRlPjwvbnMxOnJlbGV2YW50Q29u
dHJhY3REYXRlcz4KICAgICAgICA8bnMxOmRvbGxhclZhbHVlcz4KICAgICAgICAg
IDxuczE6b2JsaWdhdGVkQW1vdW50PjIxNi4wMDwvbnMxOm9ibGlnYXRlZEFtb3Vu
dD4KICAgICAgICAgIDxuczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4y
MTYuMDA8L25zMTpiYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPgogICAgICAg
ICAgPG5zMTpiYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjIxNi4wMDwvbnMxOmJhc2VB
bmRBbGxPcHRpb25zVmFsdWU+PC9uczE6ZG9sbGFyVmFsdWVzPgogICAgICAgIDxu
czE6dG90YWxEb2xsYXJWYWx1ZXM+CiAgICAgICAgICA8bnMxOnRvdGFsT2JsaWdh
dGVkQW1vdW50PjIxNi4wMDwvbnMxOnRvdGFsT2JsaWdhdGVkQW1vdW50PgogICAg
ICAgICAgPG5zMTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+MjE2
LjAwPC9uczE6dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPgogICAg
ICAgICAgPG5zMTp0b3RhbEJhc2VBbmRBbGxPcHRpb25zVmFsdWU+MjE2LjAwPC9u
czE6dG90YWxCYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjwvbnMxOnRvdGFsRG9sbGFy
VmFsdWVzPgogICAgICAgIDxuczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAgICAg
ICAgICA8bnMxOmNvbnRyYWN0aW5nT2ZmaWNlQWdlbmN5SUQgbmFtZT0iVVNEQSwg
T0ZGSUNFIE9GIFRIRSBDSElFRiBGSU5BTkNJQUwgT0ZGSUNFUiIgZGVwYXJ0bWVu
dElEPSIxMjAwIiBkZXBhcnRtZW50TmFtZT0iQUdSSUNVTFRVUkUsIERFUEFSVE1F
TlQgT0YiPjEyMDU8L25zMTpjb250cmFjdGluZ09mZmljZUFnZW5jeUlEPgogICAg
ICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZUlEIG5hbWU9IlVTREEsIE9DSU8s
IE5BVElPTkFMIElORk9STUFUSU9OIFRFQ0hOT0xPR1kgQ0VOVEVSIiBjb3VudHJ5
PSJVU0EiPjY0V0M8L25zMTpjb250cmFjdGluZ09mZmljZUlEPgogICAgICAgICAg
PG5zMTpmdW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEIG5hbWU9IlVTREEsIE9GRklD
RSBPRiBUSEUgQ0hJRUYgSU5GT1JNQVRJT04gT0ZGSUNFUiIgZGVwYXJ0bWVudElE
PSIxMjAwIiBkZXBhcnRtZW50TmFtZT0iQUdSSUNVTFRVUkUsIERFUEFSVE1FTlQg
T0YiPjEyQTc8L25zMTpmdW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEPgogICAgICAg
ICAgPG5zMTpmdW5kaW5nUmVxdWVzdGluZ09mZmljZUlEIG5hbWU9IlVTREEsIE9D
SU8sIE5BVElPTkFMIElORk9STUFUSU9OIFRFQ0hOT0xPR1kgQ0VOVEVSIj42NFdD
PC9uczE6ZnVuZGluZ1JlcXVlc3RpbmdPZmZpY2VJRD4KICAgICAgICAgIDxuczE6
Zm9yZWlnbkZ1bmRpbmcgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9u
czE6Zm9yZWlnbkZ1bmRpbmc+PC9uczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAg
ICAgICAgPG5zMTpjb250cmFjdE1hcmtldGluZ0RhdGE+CiAgICAgICAgICA8bnMx
OmZlZVBhaWRGb3JVc2VPZlNlcnZpY2U+MC4wMDwvbnMxOmZlZVBhaWRGb3JVc2VP
ZlNlcnZpY2U+PC9uczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAgIDxu
czE6Y29udHJhY3REYXRhPgogICAgICAgICAgPG5zMTpjb250cmFjdEFjdGlvblR5
cGUgZGVzY3JpcHRpb249IlBVUkNIQVNFIE9SREVSIj5CPC9uczE6Y29udHJhY3RB
Y3Rpb25UeXBlPgogICAgICAgICAgPG5zMTp0eXBlT2ZDb250cmFjdFByaWNpbmcg
ZGVzY3JpcHRpb249IkZJUk0gRklYRUQgUFJJQ0UiPko8L25zMTp0eXBlT2ZDb250
cmFjdFByaWNpbmc+CiAgICAgICAgICA8bnMxOm1ham9yUHJvZ3JhbUNvZGU+UEwg
U1FMIERFVkVMT1BFUiBTRlRXIFJFTkVXQUw8L25zMTptYWpvclByb2dyYW1Db2Rl
PgogICAgICAgICAgPG5zMTpuYXRpb25hbEludGVyZXN0QWN0aW9uQ29kZSBkZXNj
cmlwdGlvbj0iTk9ORSI+Tk9ORTwvbnMxOm5hdGlvbmFsSW50ZXJlc3RBY3Rpb25D
b2RlPgogICAgICAgICAgPG5zMTpkZXNjcmlwdGlvbk9mQ29udHJhY3RSZXF1aXJl
bWVudD5JR0Y6Ok9UOjpJR0YKClBML1NRTCBERVZFTE9QRVIgTElDRU5TRVMgQU5O
VUFMIFNFUlZJQ0UgQ09OVFJBQ1QgLSA2IFVTRVJTIEUtRE9XTkxPQUQsIFBBUlQg
UlYxNTU1ICM1MjY2LjYKCldBSVZFUjogRlkxNC1SRU5FV0FMIFIxNDMxOCwgQ08t
SkFEQU1TLCBQVVJDSEFTRSBDQVJELCBTT0ZUQ0hPSUNFPC9uczE6ZGVzY3JpcHRp
b25PZkNvbnRyYWN0UmVxdWlyZW1lbnQ+CiAgICAgICAgICA8bnMxOmluaGVyZW50
bHlHb3Zlcm5tZW50YWxGdW5jdGlvbiBkZXNjcmlwdGlvbj0iT1RIRVIgRlVOQ1RJ
T05TIj5PVDwvbnMxOmluaGVyZW50bHlHb3Zlcm5tZW50YWxGdW5jdGlvbj4KICAg
ICAgICAgIDxuczE6R0ZFLUdGUCBkZXNjcmlwdGlvbj0iVHJhbnNhY3Rpb24gZG9l
cyBub3QgdXNlIEdGRS9HRlAiPk48L25zMTpHRkUtR0ZQPgogICAgICAgICAgPG5z
MTp1bmRlZmluaXRpemVkQWN0aW9uIGRlc2NyaXB0aW9uPSJOTyI+WDwvbnMxOnVu
ZGVmaW5pdGl6ZWRBY3Rpb24+CiAgICAgICAgICA8bnMxOmNvbnNvbGlkYXRlZENv
bnRyYWN0IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbnNvbGlkYXRlZENvbnRy
YWN0PgogICAgICAgICAgPG5zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNvbnRy
YWN0IGRlc2NyaXB0aW9uPSJOTyAtIFNFUlZJQ0UgV0hFUkUgUEJBIElTIE5PVCBV
U0VELiI+TjwvbnMxOnBlcmZvcm1hbmNlQmFzZWRTZXJ2aWNlQ29udHJhY3Q+CiAg
ICAgICAgICA8bnMxOmNvbnRpbmdlbmN5SHVtYW5pdGFyaWFuUGVhY2VrZWVwaW5n
T3BlcmF0aW9uIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmNv
bnRpbmdlbmN5SHVtYW5pdGFyaWFuUGVhY2VrZWVwaW5nT3BlcmF0aW9uPgogICAg
ICAgICAgPG5zMTpsaXN0T2ZUcmVhc3VyeUFjY291bnRzPgogICAgICAgICAgICA8
bnMxOnRyZWFzdXJ5QWNjb3VudD4KICAgICAgICAgICAgICA8bnMxOnRyZWFzdXJ5
QWNjb3VudFN5bWJvbD4KICAgICAgICAgICAgICAgIDxuczE6YWdlbmN5SWRlbnRp
Zmllcj4xMjwvbnMxOmFnZW5jeUlkZW50aWZpZXI+CiAgICAgICAgICAgICAgICA8
bnMxOm1haW5BY2NvdW50Q29kZT40NjA5PC9uczE6bWFpbkFjY291bnRDb2RlPjwv
bnMxOnRyZWFzdXJ5QWNjb3VudFN5bWJvbD48L25zMTp0cmVhc3VyeUFjY291bnQ+
PC9uczE6bGlzdE9mVHJlYXN1cnlBY2NvdW50cz4KICAgICAgICAgIDxuczE6cHVy
Y2hhc2VDYXJkQXNQYXltZW50TWV0aG9kIGRlc2NyaXB0aW9uPSJZRVMiPlk8L25z
MTpwdXJjaGFzZUNhcmRBc1BheW1lbnRNZXRob2Q+CiAgICAgICAgICA8bnMxOm51
bWJlck9mQWN0aW9ucz4xPC9uczE6bnVtYmVyT2ZBY3Rpb25zPjwvbnMxOmNvbnRy
YWN0RGF0YT4KICAgICAgICA8bnMxOmxlZ2lzbGF0aXZlTWFuZGF0ZXM+CiAgICAg
ICAgICA8bnMxOkNsaW5nZXJDb2hlbkFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25z
MTpDbGluZ2VyQ29oZW5BY3Q+CiAgICAgICAgICA8bnMxOm1hdGVyaWFsc1N1cHBs
aWVzQXJ0aWNsZXNFcXVpcG1lbnQgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6bWF0
ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudD4KICAgICAgICAgIDxuczE6
bGFib3JTdGFuZGFyZHMgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6bGFib3JTdGFu
ZGFyZHM+CiAgICAgICAgICA8bnMxOmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWly
ZW1lbnRzIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbnN0cnVjdGlvbldhZ2VS
YXRlUmVxdWlyZW1lbnRzPgogICAgICAgICAgPG5zMTpsaXN0T2ZBZGRpdGlvbmFs
UmVwb3J0aW5nVmFsdWVzPjwvbnMxOmxpc3RPZkFkZGl0aW9uYWxSZXBvcnRpbmdW
YWx1ZXM+CiAgICAgICAgICA8bnMxOmludGVyYWdlbmN5Q29udHJhY3RpbmdBdXRo
b3JpdHkgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6aW50ZXJh
Z2VuY3lDb250cmFjdGluZ0F1dGhvcml0eT48L25zMTpsZWdpc2xhdGl2ZU1hbmRh
dGVzPgogICAgICAgIDxuczE6cHJvZHVjdE9yU2VydmljZUluZm9ybWF0aW9uPgog
ICAgICAgICAgPG5zMTpwcm9kdWN0T3JTZXJ2aWNlQ29kZSBkZXNjcmlwdGlvbj0i
SVQgQU5EIFRFTEVDT00tIEFOTlVBTCBTT0ZUV0FSRSBNQUlOVEVOQU5DRSBTRVJW
SUNFIFBMQU5TIiBwcm9kdWN0T3JTZXJ2aWNlVHlwZT0iU0VSVklDRSI+RDMxOTwv
bnMxOnByb2R1Y3RPclNlcnZpY2VDb2RlPgogICAgICAgICAgPG5zMTpjb250cmFj
dEJ1bmRsaW5nIGRlc2NyaXB0aW9uPSJOT1QgQSBCVU5ETEVEIFJFUVVJUkVNRU5U
Ij5EPC9uczE6Y29udHJhY3RCdW5kbGluZz4KICAgICAgICAgIDxuczE6cHJpbmNp
cGFsTkFJQ1NDb2RlIGRlc2NyaXB0aW9uPSJPVEhFUiBDT01QVVRFUiBSRUxBVEVE
IFNFUlZJQ0VTIj41NDE1MTk8L25zMTpwcmluY2lwYWxOQUlDU0NvZGU+CiAgICAg
ICAgICA8bnMxOnJlY292ZXJlZE1hdGVyaWFsQ2xhdXNlcyBkZXNjcmlwdGlvbj0i
Tk8gQ0xBVVNFUyBJTkNMVURFRCBBTkQgTk8gU1VTVEFJTkFCSUxJVFkgSU5DTFVE
RUQiPkM8L25zMTpyZWNvdmVyZWRNYXRlcmlhbENsYXVzZXM+CiAgICAgICAgICA8
bnMxOm1hbnVmYWN0dXJpbmdPcmdhbml6YXRpb25UeXBlIGRlc2NyaXB0aW9uPSJV
LlMuIE9XTkVEIEJVU0lORVNTIj5BPC9uczE6bWFudWZhY3R1cmluZ09yZ2FuaXph
dGlvblR5cGU+CiAgICAgICAgICA8bnMxOnVzZU9mRVBBRGVzaWduYXRlZFByb2R1
Y3RzIGRlc2NyaXB0aW9uPSJOT1QgUkVRVUlSRUQiPkU8L25zMTp1c2VPZkVQQURl
c2lnbmF0ZWRQcm9kdWN0cz4KICAgICAgICAgIDxuczE6Y291bnRyeU9mT3JpZ2lu
IG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNvdW50cnlPZk9yaWdpbj4K
ICAgICAgICAgIDxuczE6cGxhY2VPZk1hbnVmYWN0dXJlIGRlc2NyaXB0aW9uPSJO
T1QgQSBNQU5VRkFDVFVSRUQgRU5EIFBST0RVQ1QiPkM8L25zMTpwbGFjZU9mTWFu
dWZhY3R1cmU+PC9uczE6cHJvZHVjdE9yU2VydmljZUluZm9ybWF0aW9uPgogICAg
ICAgIDxuczE6dmVuZG9yPgogICAgICAgICAgPG5zMTp2ZW5kb3JIZWFkZXI+CiAg
ICAgICAgICAgIDxuczE6dmVuZG9yTmFtZT5TT0ZUQ0hPSUNFIENPUlBPUkFUSU9O
PC9uczE6dmVuZG9yTmFtZT48L25zMTp2ZW5kb3JIZWFkZXI+CiAgICAgICAgICA8
bnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAgICAgICA8bnMxOnZlbmRvclNv
Y2lvRWNvbm9taWNJbmRpY2F0b3JzPgogICAgICAgICAgICAgIDxuczE6aXNBbGFz
a2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT5mYWxzZTwvbnMxOmlzQWxh
c2thbk5hdGl2ZU93bmVkQ29ycG9yYXRpb25PckZpcm0+CiAgICAgICAgICAgICAg
PG5zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+ZmFsc2U8L25zMTppc0FtZXJpY2Fu
SW5kaWFuT3duZWQ+CiAgICAgICAgICAgICAgPG5zMTppc0luZGlhblRyaWJlPmZh
bHNlPC9uczE6aXNJbmRpYW5UcmliZT4KICAgICAgICAgICAgICA8bnMxOmlzTmF0
aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT5mYWxzZTwvbnMxOmlz
TmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT4KICAgICAgICAg
ICAgICA8bnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+ZmFsc2U8L25zMTppc1RyaWJh
bGx5T3duZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNWZXRlcmFuT3duZWQ+
ZmFsc2U8L25zMTppc1ZldGVyYW5Pd25lZD4KICAgICAgICAgICAgICA8bnMxOmlz
U2VydmljZVJlbGF0ZWREaXNhYmxlZFZldGVyYW5Pd25lZEJ1c2luZXNzPmZhbHNl
PC9uczE6aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVkQnVzaW5l
c3M+CiAgICAgICAgICAgICAgPG5zMTppc1dvbWVuT3duZWQ+ZmFsc2U8L25zMTpp
c1dvbWVuT3duZWQ+CiAgICAgICAgICAgICAgPG5zMTptaW5vcml0eU93bmVkPgog
ICAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5T3duZWQ+ZmFsc2U8L25zMTpp
c01pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzU3ViQ29udGlu
ZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc1N1YkNv
bnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAg
ICAgPG5zMTppc0FzaWFuUGFjaWZpY0FtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAg
ICAgICAgICAgICAgPG5zMTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZh
bHNlPC9uczE6aXNCbGFja0FtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAgICAgICAg
ICAgICAgIDxuczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzSGlzcGFuaWNBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzTmF0aXZlQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNl
PC9uczE6aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAg
ICAgICA8bnMxOmlzT3RoZXJNaW5vcml0eU93bmVkPmZhbHNlPC9uczE6aXNPdGhl
ck1pbm9yaXR5T3duZWQ+PC9uczE6bWlub3JpdHlPd25lZD4KICAgICAgICAgICAg
ICA8bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+ZmFsc2U8L25zMTppc1ZlcnlTbWFs
bEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNXb21lbk93bmVkU21hbGxC
dXNpbmVzcz5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgPG5zMTppc0Vjb25vbWljYWxseURpc2FkdmFudGFnZWRXb21l
bk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzRWNvbm9taWNhbGx5RGlz
YWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPgogICAgICAgICAgICAg
IDxuczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzSm9pbnRWZW50dXJlV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZUVjb25vbWljYWxseURpc2Fk
dmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzSm9p
bnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFs
bEJ1c2luZXNzPjwvbnMxOnZlbmRvclNvY2lvRWNvbm9taWNJbmRpY2F0b3JzPgog
ICAgICAgICAgICA8bnMxOnZlbmRvckJ1c2luZXNzVHlwZXM+CiAgICAgICAgICAg
ICAgPG5zMTppc0NvbW11bml0eURldmVsb3BlZENvcnBvcmF0aW9uT3duZWRGaXJt
PmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wZWRDb3Jwb3JhdGlvbk93bmVk
RmlybT4KICAgICAgICAgICAgICA8bnMxOmlzTGFib3JTdXJwbHVzQXJlYUZpcm0+
ZmFsc2U8L25zMTppc0xhYm9yU3VycGx1c0FyZWFGaXJtPgogICAgICAgICAgICAg
IDxuczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlz
RmVkZXJhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0ZlZGVyYWxHb3Zlcm5tZW50
PgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVyYWxseUZ1bmRlZFJlc2VhcmNo
QW5kRGV2ZWxvcG1lbnRDb3JwPmZhbHNlPC9uczE6aXNGZWRlcmFsbHlGdW5kZWRS
ZXNlYXJjaEFuZERldmVsb3BtZW50Q29ycD4KICAgICAgICAgICAgICAgIDxuczE6
aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT5mYWxzZTwvbnMxOmlzRmVkZXJhbEdv
dmVybm1lbnRBZ2VuY3k+PC9uczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAg
ICAgICAgPG5zMTppc1N0YXRlR292ZXJubWVudD5mYWxzZTwvbnMxOmlzU3RhdGVH
b3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6bG9jYWxHb3Zlcm5tZW50Pgog
ICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJubWVudD5mYWxzZTwvbnMx
OmlzTG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0NpdHlM
b2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NpdHlMb2NhbEdvdmVybm1lbnQ+
CiAgICAgICAgICAgICAgICA8bnMxOmlzQ291bnR5TG9jYWxHb3Zlcm5tZW50PmZh
bHNlPC9uczE6aXNDb3VudHlMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25z
MTppc0ludGVyTXVuaWNpcGFsTG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAg
ICAgPG5zMTppc0xvY2FsR292ZXJubWVudE93bmVkPmZhbHNlPC9uczE6aXNMb2Nh
bEdvdmVybm1lbnRPd25lZD4KICAgICAgICAgICAgICAgIDxuczE6aXNNdW5pY2lw
YWxpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc011bmljaXBhbGl0eUxv
Y2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNTY2hvb2xEaXN0
cmljdExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzU2Nob29sRGlzdHJpY3RM
b2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzVG93bnNoaXBM
b2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1Rvd25zaGlwTG9jYWxHb3Zlcm5t
ZW50PjwvbnMxOmxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOmlz
VHJpYmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVHJpYmFsR292ZXJubWVudD4K
ICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbkdvdmVybm1lbnQ+ZmFsc2U8L25z
MTppc0ZvcmVpZ25Hb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6YnVzaW5l
c3NPck9yZ2FuaXphdGlvblR5cGU+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ29y
cG9yYXRlRW50aXR5Tm90VGF4RXhlbXB0PnRydWU8L25zMTppc0NvcnBvcmF0ZUVu
dGl0eU5vdFRheEV4ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3Jwb3Jh
dGVFbnRpdHlUYXhFeGVtcHQ+ZmFsc2U8L25zMTppc0NvcnBvcmF0ZUVudGl0eVRh
eEV4ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6aXNQYXJ0bmVyc2hpcE9yTGlt
aXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPmZhbHNlPC9uczE6aXNQYXJ0bmVyc2hp
cE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPgogICAgICAgICAgICAgICAg
PG5zMTppc1NvbGVQcm9wcmVpdG9yc2hpcD5mYWxzZTwvbnMxOmlzU29sZVByb3By
ZWl0b3JzaGlwPgogICAgICAgICAgICAgICAgPG5zMTppc1NtYWxsQWdyaWN1bHR1
cmFsQ29vcGVyYXRpdmU+ZmFsc2U8L25zMTppc1NtYWxsQWdyaWN1bHR1cmFsQ29v
cGVyYXRpdmU+CiAgICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJuYXRpb25hbE9y
Z2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlv
bj4KICAgICAgICAgICAgICAgIDxuczE6aXNVU0dvdmVybm1lbnRFbnRpdHk+ZmFs
c2U8L25zMTppc1VTR292ZXJubWVudEVudGl0eT48L25zMTpidXNpbmVzc09yT3Jn
YW5pemF0aW9uVHlwZT48L25zMTp2ZW5kb3JCdXNpbmVzc1R5cGVzPgogICAgICAg
ICAgICA8bnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgogICAgICAgICAgICAgIDxu
czE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0aW9uPmZhbHNlPC9uczE6
aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0aW9uPgogICAgICAgICAgICAg
IDxuczE6aXNEb21lc3RpY1NoZWx0ZXI+ZmFsc2U8L25zMTppc0RvbWVzdGljU2hl
bHRlcj4KICAgICAgICAgICAgICA8bnMxOmlzRWR1Y2F0aW9uYWxJbnN0aXR1dGlv
bj5mYWxzZTwvbnMxOmlzRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbj4KICAgICAgICAg
ICAgICA8bnMxOmlzRm91bmRhdGlvbj5mYWxzZTwvbnMxOmlzRm91bmRhdGlvbj4K
ICAgICAgICAgICAgICA8bnMxOmlzSG9zcGl0YWw+ZmFsc2U8L25zMTppc0hvc3Bp
dGFsPgogICAgICAgICAgICAgIDxuczE6aXNNYW51ZmFjdHVyZXJPZkdvb2RzPmZh
bHNlPC9uczE6aXNNYW51ZmFjdHVyZXJPZkdvb2RzPgogICAgICAgICAgICAgIDxu
czE6aXNWZXRlcmluYXJ5SG9zcGl0YWw+ZmFsc2U8L25zMTppc1ZldGVyaW5hcnlI
b3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzSGlzcGFuaWNTZXJ2aWNpbmdJ
bnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzSGlzcGFuaWNTZXJ2aWNpbmdJbnN0aXR1
dGlvbj48L25zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JSZWxhdGlvbnNoaXBXaXRoRmVkZXJhbEdvdmVybm1lbnQ+CiAgICAg
ICAgICAgICAgPG5zMTpyZWNlaXZlc0NvbnRyYWN0cz5mYWxzZTwvbnMxOnJlY2Vp
dmVzQ29udHJhY3RzPgogICAgICAgICAgICAgIDxuczE6cmVjZWl2ZXNHcmFudHM+
ZmFsc2U8L25zMTpyZWNlaXZlc0dyYW50cz4KICAgICAgICAgICAgICA8bnMxOnJl
Y2VpdmVzQ29udHJhY3RzQW5kR3JhbnRzPnRydWU8L25zMTpyZWNlaXZlc0NvbnRy
YWN0c0FuZEdyYW50cz48L25zMTp2ZW5kb3JSZWxhdGlvbnNoaXBXaXRoRmVkZXJh
bEdvdmVybm1lbnQ+CiAgICAgICAgICAgIDxuczE6dHlwZU9mR292ZXJubWVudEVu
dGl0eT4KICAgICAgICAgICAgICA8bnMxOmlzQWlycG9ydEF1dGhvcml0eT5mYWxz
ZTwvbnMxOmlzQWlycG9ydEF1dGhvcml0eT4KICAgICAgICAgICAgICA8bnMxOmlz
Q291bmNpbE9mR292ZXJubWVudHM+ZmFsc2U8L25zMTppc0NvdW5jaWxPZkdvdmVy
bm1lbnRzPgogICAgICAgICAgICAgIDxuczE6aXNIb3VzaW5nQXV0aG9yaXRpZXNQ
dWJsaWNPclRyaWJhbD5mYWxzZTwvbnMxOmlzSG91c2luZ0F1dGhvcml0aWVzUHVi
bGljT3JUcmliYWw+CiAgICAgICAgICAgICAgPG5zMTppc0ludGVyc3RhdGVFbnRp
dHk+ZmFsc2U8L25zMTppc0ludGVyc3RhdGVFbnRpdHk+CiAgICAgICAgICAgICAg
PG5zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj5mYWxzZTwvbnMxOmlzUGxhbm5pbmdD
b21taXNzaW9uPgogICAgICAgICAgICAgIDxuczE6aXNQb3J0QXV0aG9yaXR5PmZh
bHNlPC9uczE6aXNQb3J0QXV0aG9yaXR5PgogICAgICAgICAgICAgIDxuczE6aXNU
cmFuc2l0QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNUcmFuc2l0QXV0aG9yaXR5Pjwv
bnMxOnR5cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAgICAgICAgIDxuczE6dmVu
ZG9yT3JnYW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAgICAgICA8bnMxOmlzU3Vi
Y2hhcHRlclNDb3Jwb3JhdGlvbj5mYWxzZTwvbnMxOmlzU3ViY2hhcHRlclNDb3Jw
b3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzTGltaXRlZExpYWJpbGl0eUNv
cnBvcmF0aW9uPmZhbHNlPC9uczE6aXNMaW1pdGVkTGlhYmlsaXR5Q29ycG9yYXRp
b24+CiAgICAgICAgICAgICAgPG5zMTppc0ZvcmVpZ25Pd25lZEFuZExvY2F0ZWQ+
ZmFsc2U8L25zMTppc0ZvcmVpZ25Pd25lZEFuZExvY2F0ZWQ+CiAgICAgICAgICAg
ICAgPG5zMTpwcm9maXRTdHJ1Y3R1cmU+CiAgICAgICAgICAgICAgICA8bnMxOmlz
Rm9yUHJvZml0T3JnYW5pemF0aW9uPnRydWU8L25zMTppc0ZvclByb2ZpdE9yZ2Fu
aXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNOb25wcm9maXRPcmdhbml6
YXRpb24+ZmFsc2U8L25zMTppc05vbnByb2ZpdE9yZ2FuaXphdGlvbj4KICAgICAg
ICAgICAgICAgIDxuczE6aXNPdGhlck5vdEZvclByb2ZpdE9yZ2FuaXphdGlvbj5m
YWxzZTwvbnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdhbml6YXRpb24+PC9uczE6
cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgIDxuczE6aXNTaGVsdGVyZWRX
b3Jrc2hvcD5mYWxzZTwvbnMxOmlzU2hlbHRlcmVkV29ya3Nob3A+CiAgICAgICAg
ICAgICAgPG5zMTpzdGF0ZU9mSW5jb3Jwb3JhdGlvbiBuYW1lPSJORVcgWU9SSyI+
Tlk8L25zMTpzdGF0ZU9mSW5jb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMx
OmNvdW50cnlPZkluY29ycG9yYXRpb24gbmFtZT0iVU5JVEVEIFNUQVRFUyI+VVNB
PC9uczE6Y291bnRyeU9mSW5jb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMx
Om9yZ2FuaXphdGlvbmFsVHlwZT5DT1JQT1JBVEUgTk9UIFRBWCBFWEVNUFQ8L25z
MTpvcmdhbml6YXRpb25hbFR5cGU+CiAgICAgICAgICAgICAgPG5zMTpudW1iZXJP
ZkVtcGxveWVlcz4xMjAwPC9uczE6bnVtYmVyT2ZFbXBsb3llZXM+CiAgICAgICAg
ICAgICAgPG5zMTphbm51YWxSZXZlbnVlPjEwMDAwMDAwMDA8L25zMTphbm51YWxS
ZXZlbnVlPjwvbnMxOnZlbmRvck9yZ2FuaXphdGlvbkZhY3RvcnM+CiAgICAgICAg
ICAgIDxuczE6dHlwZU9mRWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAgICAgICAgICAg
PG5zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6aXMxODYyTGFu
ZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzMTg5MExhbmRHcmFu
dENvbGxlZ2U+ZmFsc2U8L25zMTppczE4OTBMYW5kR3JhbnRDb2xsZWdlPgogICAg
ICAgICAgICAgIDxuczE6aXMxOTk0TGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMx
OmlzMTk5NExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc0hp
c3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eT5mYWxzZTwvbnMxOmlz
SGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5PgogICAgICAgICAg
ICAgIDxuczE6aXNNaW5vcml0eUluc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNNaW5v
cml0eUluc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNQcml2YXRlVW5p
dmVyc2l0eU9yQ29sbGVnZT5mYWxzZTwvbnMxOmlzUHJpdmF0ZVVuaXZlcnNpdHlP
ckNvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc1NjaG9vbE9mRm9yZXN0cnk+
ZmFsc2U8L25zMTppc1NjaG9vbE9mRm9yZXN0cnk+CiAgICAgICAgICAgICAgPG5z
MTppc1N0YXRlQ29udHJvbGxlZEluc3RpdHV0aW9ub2ZIaWdoZXJMZWFybmluZz5m
YWxzZTwvbnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25vZkhpZ2hlckxl
YXJuaW5nPgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxDb2xsZWdlPmZhbHNl
PC9uczE6aXNUcmliYWxDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXNWZXRl
cmluYXJ5Q29sbGVnZT5mYWxzZTwvbnMxOmlzVmV0ZXJpbmFyeUNvbGxlZ2U+CiAg
ICAgICAgICAgICAgPG5zMTppc0FsYXNrYW5OYXRpdmVTZXJ2aWNpbmdJbnN0aXR1
dGlvbj5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0
aW9uPgogICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPjwvbnMxOnR5cGVPZkVkdWNhdGlvbmFsRW50aXR5PgogICAg
ICAgICAgICA8bnMxOnZlbmRvckNlcnRpZmljYXRpb25zPgogICAgICAgICAgICAg
IDxuczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2VkQnVzaW5lc3NFbnRlcnBy
aXNlPmZhbHNlPC9uczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2VkQnVzaW5l
c3NFbnRlcnByaXNlPgogICAgICAgICAgICAgIDxuczE6aXNTZWxmQ2VydGlmaWVk
U21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+ZmFsc2U8L25zMTppc1NlbGZDZXJ0
aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz4KICAgICAgICAgICAgICA8
bnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+ZmFs
c2U8L25zMTppc1NCQUNlcnRpZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNz
PgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QVByb2dyYW1QYXJ0
aWNpcGFudD5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFQcm9ncmFtUGFydGlj
aXBhbnQ+CiAgICAgICAgICAgICAgPG5zMTppc1NlbGZDZXJ0aWZpZWRIVUJab25l
Sm9pbnRWZW50dXJlPmZhbHNlPC9uczE6aXNTZWxmQ2VydGlmaWVkSFVCWm9uZUpv
aW50VmVudHVyZT4KICAgICAgICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkSFVC
Wm9uZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkSFVCWm9uZT4KICAgICAgICAg
ICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+ZmFsc2U8L25z
MTppc1NCQUNlcnRpZmllZDhBSm9pbnRWZW50dXJlPjwvbnMxOnZlbmRvckNlcnRp
ZmljYXRpb25zPgogICAgICAgICAgICA8bnMxOnZlbmRvckxvY2F0aW9uPgogICAg
ICAgICAgICAgIDxuczE6c3RyZWV0QWRkcmVzcz4zMTQgVyBTVVBFUklPUiBTVCBT
VEUgMzAxPC9uczE6c3RyZWV0QWRkcmVzcz4KICAgICAgICAgICAgICA8bnMxOmNp
dHk+Q0hJQ0FHTzwvbnMxOmNpdHk+CiAgICAgICAgICAgICAgPG5zMTpzdGF0ZSBu
YW1lPSJJTExJTk9JUyI+SUw8L25zMTpzdGF0ZT4KICAgICAgICAgICAgICA8bnMx
OlpJUENvZGU+NjA2NTQzNTM4PC9uczE6WklQQ29kZT4KICAgICAgICAgICAgICA8
bnMxOmNvdW50cnlDb2RlIG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNv
dW50cnlDb2RlPgogICAgICAgICAgICAgIDxuczE6cGhvbmVObz43MDM0ODAxOTY5
PC9uczE6cGhvbmVObz4KICAgICAgICAgICAgICA8bnMxOmZheE5vPjcwMzQ4MDE5
NTY8L25zMTpmYXhObz4KICAgICAgICAgICAgICA8bnMxOmNvbmdyZXNzaW9uYWxE
aXN0cmljdENvZGU+MDc8L25zMTpjb25ncmVzc2lvbmFsRGlzdHJpY3RDb2RlPjwv
bnMxOnZlbmRvckxvY2F0aW9uPgogICAgICAgICAgICA8bnMxOnZlbmRvclNpdGVD
b2RlPjkyOTAyMjAyODwvbnMxOnZlbmRvclNpdGVDb2RlPgogICAgICAgICAgICA8
bnMxOnZlbmRvckFsdGVybmF0ZVNpdGVDb2RlPjYwNjU0MzUzODwvbnMxOnZlbmRv
ckFsdGVybmF0ZVNpdGVDb2RlPgogICAgICAgICAgICA8bnMxOnZlbmRvckRVTlNJ
bmZvcm1hdGlvbj4KICAgICAgICAgICAgICA8bnMxOkRVTlNOdW1iZXI+OTI5MDIy
MDI4PC9uczE6RFVOU051bWJlcj4KICAgICAgICAgICAgICA8bnMxOnZlbmRvck5h
bWU+U09GVENIT0lDRSBDT1JQT1JBVElPTjwvbnMxOnZlbmRvck5hbWU+CiAgICAg
ICAgICAgICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTnVtYmVyPjI0ODg2NDQxNTwv
bnMxOmdsb2JhbFBhcmVudERVTlNOdW1iZXI+CiAgICAgICAgICAgICAgPG5zMTpn
bG9iYWxQYXJlbnREVU5TTmFtZT5TT0ZUQ0hPSUNFIENPUlBPUkFUSU9OPC9uczE6
Z2xvYmFsUGFyZW50RFVOU05hbWU+PC9uczE6dmVuZG9yRFVOU0luZm9ybWF0aW9u
PgogICAgICAgICAgICA8bnMxOmNjclJlZ2lzdHJhdGlvbkRldGFpbHM+CiAgICAg
ICAgICAgICAgPG5zMTpyZWdpc3RyYXRpb25EYXRlPjIwMDMtMDItMDYgMDA6MDA6
MDA8L25zMTpyZWdpc3RyYXRpb25EYXRlPgogICAgICAgICAgICAgIDxuczE6cmVu
ZXdhbERhdGU+MjAxNS0wMi0wMyAwMDowMDowMDwvbnMxOnJlbmV3YWxEYXRlPjwv
bnMxOmNjclJlZ2lzdHJhdGlvbkRldGFpbHM+PC9uczE6dmVuZG9yU2l0ZURldGFp
bHM+CiAgICAgICAgICA8bnMxOmNvbnRyYWN0aW5nT2ZmaWNlckJ1c2luZXNzU2l6
ZURldGVybWluYXRpb24gZGVzY3JpcHRpb249Ik9USEVSIFRIQU4gU01BTEwgQlVT
SU5FU1MiPk88L25zMTpjb250cmFjdGluZ09mZmljZXJCdXNpbmVzc1NpemVEZXRl
cm1pbmF0aW9uPjwvbnMxOnZlbmRvcj4KICAgICAgICA8bnMxOnBsYWNlT2ZQZXJm
b3JtYW5jZT4KICAgICAgICAgIDxuczE6cHJpbmNpcGFsUGxhY2VPZlBlcmZvcm1h
bmNlPgogICAgICAgICAgICA8bnMxOnN0YXRlQ29kZSBuYW1lPSJNSVNTT1VSSSI+
TU88L25zMTpzdGF0ZUNvZGU+CiAgICAgICAgICAgIDxuczE6Y291bnRyeUNvZGUg
bmFtZT0iVU5JVEVEIFNUQVRFUyI+VVNBPC9uczE6Y291bnRyeUNvZGU+PC9uczE6
cHJpbmNpcGFsUGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgPG5zMTpwbGFj
ZU9mUGVyZm9ybWFuY2VaSVBDb2RlIGNvdW50eT0iSkFDS1NPTiIgY2l0eT0iS0FO
U0FTIENJVFkiPjY0MTE0MzM2MzwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZVpJUENv
ZGU+CiAgICAgICAgICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9u
YWxEaXN0cmljdD4wNTwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5jZUNvbmdyZXNzaW9u
YWxEaXN0cmljdD48L25zMTpwbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgPG5z
MTpjb21wZXRpdGlvbj4KICAgICAgICAgIDxuczE6ZXh0ZW50Q29tcGV0ZWQgZGVz
Y3JpcHRpb249IkNPTVBFVEVEIFVOREVSIFNBUCI+RjwvbnMxOmV4dGVudENvbXBl
dGVkPgogICAgICAgICAgPG5zMTpzb2xpY2l0YXRpb25Qcm9jZWR1cmVzIGRlc2Ny
aXB0aW9uPSJTSU1QTElGSUVEIEFDUVVJU0lUSU9OIj5TUDE8L25zMTpzb2xpY2l0
YXRpb25Qcm9jZWR1cmVzPgogICAgICAgICAgPG5zMTp0eXBlT2ZTZXRBc2lkZSBk
ZXNjcmlwdGlvbj0iTk8gU0VUIEFTSURFIFVTRUQuIj5OT05FPC9uczE6dHlwZU9m
U2V0QXNpZGU+CiAgICAgICAgICA8bnMxOmV2YWx1YXRlZFByZWZlcmVuY2UgZGVz
Y3JpcHRpb249Ik5PIFBSRUZFUkVOQ0UgVVNFRCI+Tk9ORTwvbnMxOmV2YWx1YXRl
ZFByZWZlcmVuY2U+CiAgICAgICAgICA8bnMxOm51bWJlck9mT2ZmZXJzUmVjZWl2
ZWQ+MjwvbnMxOm51bWJlck9mT2ZmZXJzUmVjZWl2ZWQ+CiAgICAgICAgICA8bnMx
OmNvbW1lcmNpYWxJdGVtQWNxdWlzaXRpb25Qcm9jZWR1cmVzIGRlc2NyaXB0aW9u
PSJDT01NRVJDSUFMIElURU0iPkE8L25zMTpjb21tZXJjaWFsSXRlbUFjcXVpc2l0
aW9uUHJvY2VkdXJlcz4KICAgICAgICAgIDxuczE6Y29tbWVyY2lhbEl0ZW1UZXN0
UHJvZ3JhbSBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb21tZXJjaWFsSXRlbVRl
c3RQcm9ncmFtPgogICAgICAgICAgPG5zMTpBNzZBY3Rpb24gZGVzY3JpcHRpb249
Ik5PIj5OPC9uczE6QTc2QWN0aW9uPgogICAgICAgICAgPG5zMTpmZWRCaXpPcHBz
IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmZlZEJpek9wcHM+CiAgICAgICAgICA8
bnMxOmxvY2FsQXJlYVNldEFzaWRlIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmxv
Y2FsQXJlYVNldEFzaWRlPjwvbnMxOmNvbXBldGl0aW9uPgogICAgICAgIDxuczE6
cHJlZmVyZW5jZVByb2dyYW1zPgogICAgICAgICAgPG5zMTpzdWJjb250cmFjdFBs
YW4gZGVzY3JpcHRpb249IlBMQU4gTk9UIFJFUVVJUkVEICI+QjwvbnMxOnN1YmNv
bnRyYWN0UGxhbj48L25zMTpwcmVmZXJlbmNlUHJvZ3JhbXM+CiAgICAgICAgPG5z
MTp0cmFuc2FjdGlvbkluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpjcmVhdGVk
Qnk+SkVOTklGRVIuQURBTVNAVVNEQS5HT1Y8L25zMTpjcmVhdGVkQnk+CiAgICAg
ICAgICA8bnMxOmNyZWF0ZWREYXRlPjIwMTQtMDYtMjkgMTI6MDI6MzI8L25zMTpj
cmVhdGVkRGF0ZT4KICAgICAgICAgIDxuczE6bGFzdE1vZGlmaWVkQnk+SkVOTklG
RVIuQURBTVNAVVNEQS5HT1Y8L25zMTpsYXN0TW9kaWZpZWRCeT4KICAgICAgICAg
IDxuczE6bGFzdE1vZGlmaWVkRGF0ZT4yMDE0LTA2LTI5IDEyOjM3OjU3PC9uczE6
bGFzdE1vZGlmaWVkRGF0ZT4KICAgICAgICAgIDxuczE6c3RhdHVzIGRlc2NyaXB0
aW9uPSJGSU5BTCI+RjwvbnMxOnN0YXR1cz4KICAgICAgICAgIDxuczE6YXBwcm92
ZWRCeT5KRU5OSUZFUi5BREFNU0BVU0RBLkdPVjwvbnMxOmFwcHJvdmVkQnk+CiAg
ICAgICAgICA8bnMxOmFwcHJvdmVkRGF0ZT4yMDE0LTA2LTI5IDEyOjM3OjU3PC9u
czE6YXBwcm92ZWREYXRlPjwvbnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+PC9u
czE6YXdhcmQ+CiAgICA8L2NvbnRlbnQ+CiAgPC9lbnRyeT4KICA8ZW50cnk+CiAg
ICA8dGl0bGU+PCFbQ0RBVEFbTmV3IERFTElWRVJZIE9SREVSIEFHMzJTQkQxNzAy
NjYgYXdhcmRlZCB0byBBUEVYVEVDSCBMTEMgZm9yIHRoZSBhbW91bnQgb2YgJDIx
MSw4NjBdXT48L3RpdGxlPgogICAgPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHR5cGU9
InRleHQvaHRtbCIgaHJlZj0iaHR0cHM6Ly93d3cuZnBkcy5nb3YvZXpzZWFyY2gv
c2VhcmNoLmRvP3M9RlBEUyZhbXA7aW5kZXhOYW1lPWF3YXJkZnVsbCZhbXA7dGVt
cGxhdGVOYW1lPTEuNS4xJmFtcDtxPUFHMzJTQkQxNzAyNjYrMTJIMisiPjwvbGlu
az4KICAgIDxtb2RpZmllZD4yMDE3LTEwLTA0IDE0OjIwOjQ4PC9tb2RpZmllZD4K
ICAgIDxjb250ZW50IHhtbG5zOm5zMT0iaHR0cHM6Ly93d3cuZnBkcy5nb3YvRlBE
UyIgdHlwZT0iYXBwbGljYXRpb24veG1sIj4KICAgICAgPG5zMTphd2FyZCB4bWxu
czpuczE9Imh0dHA6Ly93d3cuZnBkc25nLmNvbS9GUERTIiB2ZXJzaW9uPSIxLjQi
PgogICAgICAgIDxuczE6YXdhcmRJRD4KICAgICAgICAgIDxuczE6YXdhcmRDb250
cmFjdElEPgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9IkFHUklDVUxU
VVJBTCBSRVNFQVJDSCBTRVJWSUNFIj4xMkgyPC9uczE6YWdlbmN5SUQ+CiAgICAg
ICAgICAgIDxuczE6UElJRD5BRzMyU0JEMTcwMjY2PC9uczE6UElJRD4KICAgICAg
ICAgICAgPG5zMTptb2ROdW1iZXI+MDwvbnMxOm1vZE51bWJlcj4KICAgICAgICAg
ICAgPG5zMTp0cmFuc2FjdGlvbk51bWJlcj4wPC9uczE6dHJhbnNhY3Rpb25OdW1i
ZXI+PC9uczE6YXdhcmRDb250cmFjdElEPgogICAgICAgICAgPG5zMTpyZWZlcmVu
Y2VkSURWSUQ+CiAgICAgICAgICAgIDxuczE6YWdlbmN5SUQgbmFtZT0iRkVERVJB
TCBBQ1FVSVNJVElPTiBTRVJWSUNFIj40NzMyPC9uczE6YWdlbmN5SUQ+CiAgICAg
ICAgICAgIDxuczE6UElJRD5HUzA2RjA4MjFaPC9uczE6UElJRD4KICAgICAgICAg
ICAgPG5zMTptb2ROdW1iZXI+UEEwMDAzQUREUkVTU0NIRzwvbnMxOm1vZE51bWJl
cj48L25zMTpyZWZlcmVuY2VkSURWSUQ+PC9uczE6YXdhcmRJRD4KICAgICAgICA8
bnMxOnJlbGV2YW50Q29udHJhY3REYXRlcz4KICAgICAgICAgIDxuczE6c2lnbmVk
RGF0ZT4yMDE3LTA5LTIyIDAwOjAwOjAwPC9uczE6c2lnbmVkRGF0ZT4KICAgICAg
ICAgIDxuczE6ZWZmZWN0aXZlRGF0ZT4yMDE3LTA5LTIyIDAwOjAwOjAwPC9uczE6
ZWZmZWN0aXZlRGF0ZT4KICAgICAgICAgIDxuczE6Y3VycmVudENvbXBsZXRpb25E
YXRlPjIwMTktMDktMjggMDA6MDA6MDA8L25zMTpjdXJyZW50Q29tcGxldGlvbkRh
dGU+CiAgICAgICAgICA8bnMxOnVsdGltYXRlQ29tcGxldGlvbkRhdGU+MjAxOS0w
OS0yOCAwMDowMDowMDwvbnMxOnVsdGltYXRlQ29tcGxldGlvbkRhdGU+PC9uczE6
cmVsZXZhbnRDb250cmFjdERhdGVzPgogICAgICAgIDxuczE6ZG9sbGFyVmFsdWVz
PgogICAgICAgICAgPG5zMTpvYmxpZ2F0ZWRBbW91bnQ+MjExODYwLjAwPC9uczE6
b2JsaWdhdGVkQW1vdW50PgogICAgICAgICAgPG5zMTpiYXNlQW5kRXhlcmNpc2Vk
T3B0aW9uc1ZhbHVlPjIxMTg2MC4wMDwvbnMxOmJhc2VBbmRFeGVyY2lzZWRPcHRp
b25zVmFsdWU+CiAgICAgICAgICA8bnMxOmJhc2VBbmRBbGxPcHRpb25zVmFsdWU+
NDMwNjUwLjAwPC9uczE6YmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT48L25zMTpkb2xs
YXJWYWx1ZXM+CiAgICAgICAgPG5zMTp0b3RhbERvbGxhclZhbHVlcz4KICAgICAg
ICAgIDxuczE6dG90YWxPYmxpZ2F0ZWRBbW91bnQ+MjExODYwLjAwPC9uczE6dG90
YWxPYmxpZ2F0ZWRBbW91bnQ+CiAgICAgICAgICA8bnMxOnRvdGFsQmFzZUFuZEV4
ZXJjaXNlZE9wdGlvbnNWYWx1ZT4yMTE4NjAuMDA8L25zMTp0b3RhbEJhc2VBbmRF
eGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAgICA8bnMxOnRvdGFsQmFzZUFuZEFs
bE9wdGlvbnNWYWx1ZT40MzA2NTAuMDA8L25zMTp0b3RhbEJhc2VBbmRBbGxPcHRp
b25zVmFsdWU+PC9uczE6dG90YWxEb2xsYXJWYWx1ZXM+CiAgICAgICAgPG5zMTpw
dXJjaGFzZXJJbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6Y29udHJhY3RpbmdP
ZmZpY2VBZ2VuY3lJRCBuYW1lPSJBR1JJQ1VMVFVSQUwgUkVTRUFSQ0ggU0VSVklD
RSIgZGVwYXJ0bWVudElEPSIxMjAwIiBkZXBhcnRtZW50TmFtZT0iQUdSSUNVTFRV
UkUsIERFUEFSVE1FTlQgT0YiPjEySDI8L25zMTpjb250cmFjdGluZ09mZmljZUFn
ZW5jeUlEPgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZUlEIG5hbWU9
IlVTREEgQVJTIE5DUkJTQyBBQ1EgQlJBTkNIIiByZWdpb25Db2RlPSIxMyIgY291
bnRyeT0iVVNBIj4xMjMyU0I8L25zMTpjb250cmFjdGluZ09mZmljZUlEPgogICAg
ICAgICAgPG5zMTpmdW5kaW5nUmVxdWVzdGluZ0FnZW5jeUlEIG5hbWU9IkFHUklD
VUxUVVJBTCBSRVNFQVJDSCBTRVJWSUNFIiBkZXBhcnRtZW50SUQ9IjEyMDAiIGRl
cGFydG1lbnROYW1lPSJBR1JJQ1VMVFVSRSwgREVQQVJUTUVOVCBPRiI+MTJIMjwv
bnMxOmZ1bmRpbmdSZXF1ZXN0aW5nQWdlbmN5SUQ+CiAgICAgICAgICA8bnMxOmZ1
bmRpbmdSZXF1ZXN0aW5nT2ZmaWNlSUQgbmFtZT0iVVNEQSBBUlMgQUZNIEZNQUQi
PjEyMzQ0UDwvbnMxOmZ1bmRpbmdSZXF1ZXN0aW5nT2ZmaWNlSUQ+CiAgICAgICAg
ICA8bnMxOmZvcmVpZ25GdW5kaW5nIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJM
RSI+WDwvbnMxOmZvcmVpZ25GdW5kaW5nPjwvbnMxOnB1cmNoYXNlckluZm9ybWF0
aW9uPgogICAgICAgIDxuczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAg
ICAgPG5zMTpmZWVQYWlkRm9yVXNlT2ZTZXJ2aWNlPjAuMDA8L25zMTpmZWVQYWlk
Rm9yVXNlT2ZTZXJ2aWNlPjwvbnMxOmNvbnRyYWN0TWFya2V0aW5nRGF0YT4KICAg
ICAgICA8bnMxOmNvbnRyYWN0RGF0YT4KICAgICAgICAgIDxuczE6Y29udHJhY3RB
Y3Rpb25UeXBlIGRlc2NyaXB0aW9uPSJERUxJVkVSWSBPUkRFUiI+QzwvbnMxOmNv
bnRyYWN0QWN0aW9uVHlwZT4KICAgICAgICAgIDxuczE6dHlwZU9mQ29udHJhY3RQ
cmljaW5nIGRlc2NyaXB0aW9uPSJGSVJNIEZJWEVEIFBSSUNFIj5KPC9uczE6dHlw
ZU9mQ29udHJhY3RQcmljaW5nPgogICAgICAgICAgPG5zMTpuYXRpb25hbEludGVy
ZXN0QWN0aW9uQ29kZSBkZXNjcmlwdGlvbj0iTk9ORSI+Tk9ORTwvbnMxOm5hdGlv
bmFsSW50ZXJlc3RBY3Rpb25Db2RlPgogICAgICAgICAgPG5zMTpkZXNjcmlwdGlv
bk9mQ29udHJhY3RSZXF1aXJlbWVudD5JR0Y6Ok9UOjpJR0YKT1JBQ0xFIFBML1NR
TCBQUk9HUkFNTUVSUzwvbnMxOmRlc2NyaXB0aW9uT2ZDb250cmFjdFJlcXVpcmVt
ZW50PgogICAgICAgICAgPG5zMTppbmhlcmVudGx5R292ZXJubWVudGFsRnVuY3Rp
b24gZGVzY3JpcHRpb249Ik9USEVSIEZVTkNUSU9OUyI+T1Q8L25zMTppbmhlcmVu
dGx5R292ZXJubWVudGFsRnVuY3Rpb24+CiAgICAgICAgICA8bnMxOkdGRS1HRlAg
ZGVzY3JpcHRpb249IlRyYW5zYWN0aW9uIGRvZXMgbm90IHVzZSBHRkUvR0ZQIj5O
PC9uczE6R0ZFLUdGUD4KICAgICAgICAgIDxuczE6dW5kZWZpbml0aXplZEFjdGlv
biBkZXNjcmlwdGlvbj0iTk8iPlg8L25zMTp1bmRlZmluaXRpemVkQWN0aW9uPgog
ICAgICAgICAgPG5zMTpjb25zb2xpZGF0ZWRDb250cmFjdCBkZXNjcmlwdGlvbj0i
Tk9UIENPTlNPTElEQVRFRCI+RDwvbnMxOmNvbnNvbGlkYXRlZENvbnRyYWN0Pgog
ICAgICAgICAgPG5zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNvbnRyYWN0IGRl
c2NyaXB0aW9uPSJOTyAtIFNFUlZJQ0UgV0hFUkUgUEJBIElTIE5PVCBVU0VELiI+
TjwvbnMxOnBlcmZvcm1hbmNlQmFzZWRTZXJ2aWNlQ29udHJhY3Q+CiAgICAgICAg
ICA8bnMxOmNvbnRpbmdlbmN5SHVtYW5pdGFyaWFuUGVhY2VrZWVwaW5nT3BlcmF0
aW9uIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmNvbnRpbmdl
bmN5SHVtYW5pdGFyaWFuUGVhY2VrZWVwaW5nT3BlcmF0aW9uPgogICAgICAgICAg
PG5zMTpsaXN0T2ZUcmVhc3VyeUFjY291bnRzPgogICAgICAgICAgICA8bnMxOnRy
ZWFzdXJ5QWNjb3VudD4KICAgICAgICAgICAgICA8bnMxOnRyZWFzdXJ5QWNjb3Vu
dFN5bWJvbD4KICAgICAgICAgICAgICAgIDxuczE6YWdlbmN5SWRlbnRpZmllcj4x
MjwvbnMxOmFnZW5jeUlkZW50aWZpZXI+CiAgICAgICAgICAgICAgICA8bnMxOm1h
aW5BY2NvdW50Q29kZT4xNDAwPC9uczE6bWFpbkFjY291bnRDb2RlPjwvbnMxOnRy
ZWFzdXJ5QWNjb3VudFN5bWJvbD48L25zMTp0cmVhc3VyeUFjY291bnQ+PC9uczE6
bGlzdE9mVHJlYXN1cnlBY2NvdW50cz4KICAgICAgICAgIDxuczE6cHVyY2hhc2VD
YXJkQXNQYXltZW50TWV0aG9kIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOnB1cmNo
YXNlQ2FyZEFzUGF5bWVudE1ldGhvZD4KICAgICAgICAgIDxuczE6bnVtYmVyT2ZB
Y3Rpb25zPjE8L25zMTpudW1iZXJPZkFjdGlvbnM+PC9uczE6Y29udHJhY3REYXRh
PgogICAgICAgIDxuczE6bGVnaXNsYXRpdmVNYW5kYXRlcz4KICAgICAgICAgIDxu
czE6Q2xpbmdlckNvaGVuQWN0IGRlc2NyaXB0aW9uPSJZRVMiPlk8L25zMTpDbGlu
Z2VyQ29oZW5BY3Q+CiAgICAgICAgICA8bnMxOm1hdGVyaWFsc1N1cHBsaWVzQXJ0
aWNsZXNFcXVpcG1lbnQgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9u
czE6bWF0ZXJpYWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudD4KICAgICAgICAg
IDxuczE6bGFib3JTdGFuZGFyZHMgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6bGFi
b3JTdGFuZGFyZHM+CiAgICAgICAgICA8bnMxOmNvbnN0cnVjdGlvbldhZ2VSYXRl
UmVxdWlyZW1lbnRzIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMx
OmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWlyZW1lbnRzPgogICAgICAgICAgPG5z
MTpsaXN0T2ZBZGRpdGlvbmFsUmVwb3J0aW5nVmFsdWVzPjwvbnMxOmxpc3RPZkFk
ZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+CiAgICAgICAgICA8bnMxOmludGVyYWdl
bmN5Q29udHJhY3RpbmdBdXRob3JpdHkgZGVzY3JpcHRpb249Ik9USEVSIFNUQVRV
VE9SWSBBVVRIT1JJVFkiPkI8L25zMTppbnRlcmFnZW5jeUNvbnRyYWN0aW5nQXV0
aG9yaXR5PgogICAgICAgICAgPG5zMTpvdGhlclN0YXR1dG9yeUF1dGhvcml0eT40
MCBVLlMuQy4gMTEzMDIoRSk8L25zMTpvdGhlclN0YXR1dG9yeUF1dGhvcml0eT48
L25zMTpsZWdpc2xhdGl2ZU1hbmRhdGVzPgogICAgICAgIDxuczE6cHJvZHVjdE9y
U2VydmljZUluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpwcm9kdWN0T3JTZXJ2
aWNlQ29kZSBkZXNjcmlwdGlvbj0iSVQgQU5EIFRFTEVDT00tIFBST0dSQU1NSU5H
IiBwcm9kdWN0T3JTZXJ2aWNlVHlwZT0iU0VSVklDRSI+RDMwODwvbnMxOnByb2R1
Y3RPclNlcnZpY2VDb2RlPgogICAgICAgICAgPG5zMTpjb250cmFjdEJ1bmRsaW5n
IGRlc2NyaXB0aW9uPSJOT1QgQlVORExFRCI+SDwvbnMxOmNvbnRyYWN0QnVuZGxp
bmc+CiAgICAgICAgICA8bnMxOnByaW5jaXBhbE5BSUNTQ29kZSBkZXNjcmlwdGlv
bj0iQ09NUFVURVIgU1lTVEVNUyBERVNJR04gU0VSVklDRVMiPjU0MTUxMjwvbnMx
OnByaW5jaXBhbE5BSUNTQ29kZT4KICAgICAgICAgIDxuczE6cmVjb3ZlcmVkTWF0
ZXJpYWxDbGF1c2VzIGRlc2NyaXB0aW9uPSJOTyBDTEFVU0VTIElOQ0xVREVEIEFO
RCBOTyBTVVNUQUlOQUJJTElUWSBJTkNMVURFRCI+QzwvbnMxOnJlY292ZXJlZE1h
dGVyaWFsQ2xhdXNlcz4KICAgICAgICAgIDxuczE6bWFudWZhY3R1cmluZ09yZ2Fu
aXphdGlvblR5cGUgZGVzY3JpcHRpb249IlUuUy4gT1dORUQgQlVTSU5FU1MiPkE8
L25zMTptYW51ZmFjdHVyaW5nT3JnYW5pemF0aW9uVHlwZT4KICAgICAgICAgIDxu
czE6dXNlT2ZFUEFEZXNpZ25hdGVkUHJvZHVjdHMgZGVzY3JpcHRpb249Ik5PVCBS
RVFVSVJFRCI+RTwvbnMxOnVzZU9mRVBBRGVzaWduYXRlZFByb2R1Y3RzPgogICAg
ICAgICAgPG5zMTpjb3VudHJ5T2ZPcmlnaW4gbmFtZT0iVU5JVEVEIFNUQVRFUyI+
VVNBPC9uczE6Y291bnRyeU9mT3JpZ2luPgogICAgICAgICAgPG5zMTpwbGFjZU9m
TWFudWZhY3R1cmUgZGVzY3JpcHRpb249Ik5PVCBBIE1BTlVGQUNUVVJFRCBFTkQg
UFJPRFVDVCI+QzwvbnMxOnBsYWNlT2ZNYW51ZmFjdHVyZT48L25zMTpwcm9kdWN0
T3JTZXJ2aWNlSW5mb3JtYXRpb24+CiAgICAgICAgPG5zMTp2ZW5kb3I+CiAgICAg
ICAgICA8bnMxOnZlbmRvckhlYWRlcj4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JO
YW1lPkFQRVhURUNIIExMQzwvbnMxOnZlbmRvck5hbWU+PC9uczE6dmVuZG9ySGVh
ZGVyPgogICAgICAgICAgPG5zMTp2ZW5kb3JTaXRlRGV0YWlscz4KICAgICAgICAg
ICAgPG5zMTp2ZW5kb3JTb2Npb0Vjb25vbWljSW5kaWNhdG9ycz4KICAgICAgICAg
ICAgICA8bnMxOmlzQWxhc2thbk5hdGl2ZU93bmVkQ29ycG9yYXRpb25PckZpcm0+
ZmFsc2U8L25zMTppc0FsYXNrYW5OYXRpdmVPd25lZENvcnBvcmF0aW9uT3JGaXJt
PgogICAgICAgICAgICAgIDxuczE6aXNBbWVyaWNhbkluZGlhbk93bmVkPmZhbHNl
PC9uczE6aXNBbWVyaWNhbkluZGlhbk93bmVkPgogICAgICAgICAgICAgIDxuczE6
aXNJbmRpYW5UcmliZT5mYWxzZTwvbnMxOmlzSW5kaWFuVHJpYmU+CiAgICAgICAg
ICAgICAgPG5zMTppc05hdGl2ZUhhd2FpaWFuT3duZWRPcmdhbml6YXRpb25PckZp
cm0+ZmFsc2U8L25zMTppc05hdGl2ZUhhd2FpaWFuT3duZWRPcmdhbml6YXRpb25P
ckZpcm0+CiAgICAgICAgICAgICAgPG5zMTppc1RyaWJhbGx5T3duZWRGaXJtPmZh
bHNlPC9uczE6aXNUcmliYWxseU93bmVkRmlybT4KICAgICAgICAgICAgICA8bnMx
OmlzVmV0ZXJhbk93bmVkPmZhbHNlPC9uczE6aXNWZXRlcmFuT3duZWQ+CiAgICAg
ICAgICAgICAgPG5zMTppc1NlcnZpY2VSZWxhdGVkRGlzYWJsZWRWZXRlcmFuT3du
ZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU2VydmljZVJlbGF0ZWREaXNhYmxlZFZl
dGVyYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNXb21lbk93
bmVkPmZhbHNlPC9uczE6aXNXb21lbk93bmVkPgogICAgICAgICAgICAgIDxuczE6
bWlub3JpdHlPd25lZD4KICAgICAgICAgICAgICAgIDxuczE6aXNNaW5vcml0eU93
bmVkPnRydWU8L25zMTppc01pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8
bnMxOmlzU3ViQ29udGluZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFs
c2U8L25zMTppc1N1YkNvbnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNz
PgogICAgICAgICAgICAgICAgPG5zMTppc0FzaWFuUGFjaWZpY0FtZXJpY2FuT3du
ZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25l
ZEJ1c2luZXNzPgogICAgICAgICAgICAgICAgPG5zMTppc0JsYWNrQW1lcmljYW5P
d25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNCbGFja0FtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY0FtZXJpY2FuT3du
ZWRCdXNpbmVzcz50cnVlPC9uczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNp
bmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVBbWVyaWNhbk93bmVk
QnVzaW5lc3M+ZmFsc2U8L25zMTppc05hdGl2ZUFtZXJpY2FuT3duZWRCdXNpbmVz
cz4KICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck1pbm9yaXR5T3duZWQ+ZmFs
c2U8L25zMTppc090aGVyTWlub3JpdHlPd25lZD48L25zMTptaW5vcml0eU93bmVk
PgogICAgICAgICAgICAgIDxuczE6aXNWZXJ5U21hbGxCdXNpbmVzcz5mYWxzZTwv
bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dv
bWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzRWNvbm9taWNhbGx5RGlz
YWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNF
Y29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+
CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZVdvbWVuT3duZWRTbWFs
bEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21h
bGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8bnMxOmlzSm9pbnRWZW50dXJlRWNv
bm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZh
bHNlPC9uczE6aXNKb2ludFZlbnR1cmVFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2Vk
V29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+PC9uczE6dmVuZG9yU29jaW9FY29ub21p
Y0luZGljYXRvcnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQnVzaW5lc3NUeXBl
cz4KICAgICAgICAgICAgICA8bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcGVkQ29ycG9y
YXRpb25Pd25lZEZpcm0+ZmFsc2U8L25zMTppc0NvbW11bml0eURldmVsb3BlZENv
cnBvcmF0aW9uT3duZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNMYWJvclN1
cnBsdXNBcmVhRmlybT5mYWxzZTwvbnMxOmlzTGFib3JTdXJwbHVzQXJlYUZpcm0+
CiAgICAgICAgICAgICAgPG5zMTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAg
ICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzRmVk
ZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzRmVkZXJhbGx5
RnVuZGVkUmVzZWFyY2hBbmREZXZlbG9wbWVudENvcnA+ZmFsc2U8L25zMTppc0Zl
ZGVyYWxseUZ1bmRlZFJlc2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPgogICAgICAg
ICAgICAgICAgPG5zMTppc0ZlZGVyYWxHb3Zlcm5tZW50QWdlbmN5PmZhbHNlPC9u
czE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT48L25zMTpmZWRlcmFsR292ZXJu
bWVudD4KICAgICAgICAgICAgICA8bnMxOmlzU3RhdGVHb3Zlcm5tZW50PmZhbHNl
PC9uczE6aXNTdGF0ZUdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpsb2Nh
bEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5t
ZW50PmZhbHNlPC9uczE6aXNMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzQ2l0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzQ2l0eUxv
Y2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3VudHlMb2Nh
bEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NvdW50eUxvY2FsR292ZXJubWVudD4K
ICAgICAgICAgICAgICAgIDxuczE6aXNJbnRlck11bmljaXBhbExvY2FsR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+
CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9jYWxHb3Zlcm5tZW50T3duZWQ+ZmFs
c2U8L25zMTppc0xvY2FsR292ZXJubWVudE93bmVkPgogICAgICAgICAgICAgICAg
PG5zMTppc011bmljaXBhbGl0eUxvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
TXVuaWNpcGFsaXR5TG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5z
MTppc1NjaG9vbERpc3RyaWN0TG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNT
Y2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxu
czE6aXNUb3duc2hpcExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVG93bnNo
aXBMb2NhbEdvdmVybm1lbnQ+PC9uczE6bG9jYWxHb3Zlcm5tZW50PgogICAgICAg
ICAgICAgIDxuczE6aXNUcmliYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNUcmli
YWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6aXNGb3JlaWduR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzRm9yZWlnbkdvdmVybm1lbnQ+CiAgICAgICAgICAg
ICAgPG5zMTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT4KICAgICAgICAgICAg
ICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlOb3RUYXhFeGVtcHQ+ZmFsc2U8L25z
MTppc0NvcnBvcmF0ZUVudGl0eU5vdFRheEV4ZW1wdD4KICAgICAgICAgICAgICAg
IDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlUYXhFeGVtcHQ+ZmFsc2U8L25zMTppc0Nv
cnBvcmF0ZUVudGl0eVRheEV4ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6aXNQ
YXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPmZhbHNlPC9u
czE6aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwPgog
ICAgICAgICAgICAgICAgPG5zMTppc1NvbGVQcm9wcmVpdG9yc2hpcD5mYWxzZTwv
bnMxOmlzU29sZVByb3ByZWl0b3JzaGlwPgogICAgICAgICAgICAgICAgPG5zMTpp
c1NtYWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+ZmFsc2U8L25zMTppc1NtYWxs
QWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+CiAgICAgICAgICAgICAgICA8bnMxOmlz
SW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzSW50ZXJuYXRp
b25hbE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNVU0dvdmVy
bm1lbnRFbnRpdHk+ZmFsc2U8L25zMTppc1VTR292ZXJubWVudEVudGl0eT48L25z
MTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlwZT48L25zMTp2ZW5kb3JCdXNpbmVz
c1R5cGVzPgogICAgICAgICAgICA8bnMxOnZlbmRvckxpbmVPZkJ1c2luZXNzPgog
ICAgICAgICAgICAgIDxuczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0
aW9uPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wbWVudENvcnBvcmF0aW9u
PgogICAgICAgICAgICAgIDxuczE6aXNEb21lc3RpY1NoZWx0ZXI+ZmFsc2U8L25z
MTppc0RvbWVzdGljU2hlbHRlcj4KICAgICAgICAgICAgICA8bnMxOmlzRWR1Y2F0
aW9uYWxJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzRWR1Y2F0aW9uYWxJbnN0aXR1
dGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzRm91bmRhdGlvbj5mYWxzZTwvbnMx
OmlzRm91bmRhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzSG9zcGl0YWw+ZmFs
c2U8L25zMTppc0hvc3BpdGFsPgogICAgICAgICAgICAgIDxuczE6aXNNYW51ZmFj
dHVyZXJPZkdvb2RzPmZhbHNlPC9uczE6aXNNYW51ZmFjdHVyZXJPZkdvb2RzPgog
ICAgICAgICAgICAgIDxuczE6aXNWZXRlcmluYXJ5SG9zcGl0YWw+ZmFsc2U8L25z
MTppc1ZldGVyaW5hcnlIb3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzSGlz
cGFuaWNTZXJ2aWNpbmdJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzSGlzcGFuaWNT
ZXJ2aWNpbmdJbnN0aXR1dGlvbj48L25zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JSZWxhdGlvbnNoaXBXaXRoRmVkZXJhbEdv
dmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpyZWNlaXZlc0NvbnRyYWN0cz50
cnVlPC9uczE6cmVjZWl2ZXNDb250cmFjdHM+CiAgICAgICAgICAgICAgPG5zMTpy
ZWNlaXZlc0dyYW50cz5mYWxzZTwvbnMxOnJlY2VpdmVzR3JhbnRzPgogICAgICAg
ICAgICAgIDxuczE6cmVjZWl2ZXNDb250cmFjdHNBbmRHcmFudHM+ZmFsc2U8L25z
MTpyZWNlaXZlc0NvbnRyYWN0c0FuZEdyYW50cz48L25zMTp2ZW5kb3JSZWxhdGlv
bnNoaXBXaXRoRmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgIDxuczE6dHlw
ZU9mR292ZXJubWVudEVudGl0eT4KICAgICAgICAgICAgICA8bnMxOmlzQWlycG9y
dEF1dGhvcml0eT5mYWxzZTwvbnMxOmlzQWlycG9ydEF1dGhvcml0eT4KICAgICAg
ICAgICAgICA8bnMxOmlzQ291bmNpbE9mR292ZXJubWVudHM+ZmFsc2U8L25zMTpp
c0NvdW5jaWxPZkdvdmVybm1lbnRzPgogICAgICAgICAgICAgIDxuczE6aXNIb3Vz
aW5nQXV0aG9yaXRpZXNQdWJsaWNPclRyaWJhbD5mYWxzZTwvbnMxOmlzSG91c2lu
Z0F1dGhvcml0aWVzUHVibGljT3JUcmliYWw+CiAgICAgICAgICAgICAgPG5zMTpp
c0ludGVyc3RhdGVFbnRpdHk+ZmFsc2U8L25zMTppc0ludGVyc3RhdGVFbnRpdHk+
CiAgICAgICAgICAgICAgPG5zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj5mYWxzZTwv
bnMxOmlzUGxhbm5pbmdDb21taXNzaW9uPgogICAgICAgICAgICAgIDxuczE6aXNQ
b3J0QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNQb3J0QXV0aG9yaXR5PgogICAgICAg
ICAgICAgIDxuczE6aXNUcmFuc2l0QXV0aG9yaXR5PmZhbHNlPC9uczE6aXNUcmFu
c2l0QXV0aG9yaXR5PjwvbnMxOnR5cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAg
ICAgICAgIDxuczE6dmVuZG9yT3JnYW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAg
ICAgICA8bnMxOmlzU3ViY2hhcHRlclNDb3Jwb3JhdGlvbj5mYWxzZTwvbnMxOmlz
U3ViY2hhcHRlclNDb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzTGlt
aXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPnRydWU8L25zMTppc0xpbWl0ZWRMaWFi
aWxpdHlDb3Jwb3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbk93
bmVkQW5kTG9jYXRlZD5mYWxzZTwvbnMxOmlzRm9yZWlnbk93bmVkQW5kTG9jYXRl
ZD4KICAgICAgICAgICAgICA8bnMxOnByb2ZpdFN0cnVjdHVyZT4KICAgICAgICAg
ICAgICAgIDxuczE6aXNGb3JQcm9maXRPcmdhbml6YXRpb24+dHJ1ZTwvbnMxOmlz
Rm9yUHJvZml0T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPG5zMTppc05v
bnByb2ZpdE9yZ2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzTm9ucHJvZml0T3JnYW5p
emF0aW9uPgogICAgICAgICAgICAgICAgPG5zMTppc090aGVyTm90Rm9yUHJvZml0
T3JnYW5pemF0aW9uPmZhbHNlPC9uczE6aXNPdGhlck5vdEZvclByb2ZpdE9yZ2Fu
aXphdGlvbj48L25zMTpwcm9maXRTdHJ1Y3R1cmU+CiAgICAgICAgICAgICAgPG5z
MTppc1NoZWx0ZXJlZFdvcmtzaG9wPmZhbHNlPC9uczE6aXNTaGVsdGVyZWRXb3Jr
c2hvcD4KICAgICAgICAgICAgICA8bnMxOm9yZ2FuaXphdGlvbmFsVHlwZT5PVEhF
UjwvbnMxOm9yZ2FuaXphdGlvbmFsVHlwZT4KICAgICAgICAgICAgICA8bnMxOm51
bWJlck9mRW1wbG95ZWVzPjEzPC9uczE6bnVtYmVyT2ZFbXBsb3llZXM+CiAgICAg
ICAgICAgICAgPG5zMTphbm51YWxSZXZlbnVlPjIwMDAwMDA8L25zMTphbm51YWxS
ZXZlbnVlPjwvbnMxOnZlbmRvck9yZ2FuaXphdGlvbkZhY3RvcnM+CiAgICAgICAg
ICAgIDxuczE6dHlwZU9mRWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAgICAgICAgICAg
PG5zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6aXMxODYyTGFu
ZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzMTg5MExhbmRHcmFu
dENvbGxlZ2U+ZmFsc2U8L25zMTppczE4OTBMYW5kR3JhbnRDb2xsZWdlPgogICAg
ICAgICAgICAgIDxuczE6aXMxOTk0TGFuZEdyYW50Q29sbGVnZT5mYWxzZTwvbnMx
OmlzMTk5NExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc0hp
c3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eT5mYWxzZTwvbnMxOmlz
SGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5PgogICAgICAgICAg
ICAgIDxuczE6aXNNaW5vcml0eUluc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNNaW5v
cml0eUluc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNQcml2YXRlVW5p
dmVyc2l0eU9yQ29sbGVnZT5mYWxzZTwvbnMxOmlzUHJpdmF0ZVVuaXZlcnNpdHlP
ckNvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc1NjaG9vbE9mRm9yZXN0cnk+
ZmFsc2U8L25zMTppc1NjaG9vbE9mRm9yZXN0cnk+CiAgICAgICAgICAgICAgPG5z
MTppc1N0YXRlQ29udHJvbGxlZEluc3RpdHV0aW9ub2ZIaWdoZXJMZWFybmluZz5m
YWxzZTwvbnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25vZkhpZ2hlckxl
YXJuaW5nPgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxDb2xsZWdlPmZhbHNl
PC9uczE6aXNUcmliYWxDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXNWZXRl
cmluYXJ5Q29sbGVnZT5mYWxzZTwvbnMxOmlzVmV0ZXJpbmFyeUNvbGxlZ2U+CiAg
ICAgICAgICAgICAgPG5zMTppc0FsYXNrYW5OYXRpdmVTZXJ2aWNpbmdJbnN0aXR1
dGlvbj5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0
aW9uPgogICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlhblNlcnZpY2lu
Z0luc3RpdHV0aW9uPjwvbnMxOnR5cGVPZkVkdWNhdGlvbmFsRW50aXR5PgogICAg
ICAgICAgICA8bnMxOnZlbmRvckNlcnRpZmljYXRpb25zPgogICAgICAgICAgICAg
IDxuczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2VkQnVzaW5lc3NFbnRlcnBy
aXNlPnRydWU8L25zMTppc0RPVENlcnRpZmllZERpc2FkdmFudGFnZWRCdXNpbmVz
c0VudGVycHJpc2U+CiAgICAgICAgICAgICAgPG5zMTppc1NlbGZDZXJ0aWZpZWRT
bWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU2VsZkNlcnRp
ZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxu
czE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz50cnVl
PC9uczE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz4K
ICAgICAgICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkOEFQcm9ncmFtUGFydGlj
aXBhbnQ+dHJ1ZTwvbnMxOmlzU0JBQ2VydGlmaWVkOEFQcm9ncmFtUGFydGljaXBh
bnQ+CiAgICAgICAgICAgICAgPG5zMTppc1NlbGZDZXJ0aWZpZWRIVUJab25lSm9p
bnRWZW50dXJlPmZhbHNlPC9uczE6aXNTZWxmQ2VydGlmaWVkSFVCWm9uZUpvaW50
VmVudHVyZT4KICAgICAgICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkSFVCWm9u
ZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkSFVCWm9uZT4KICAgICAgICAgICAg
ICA8bnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+ZmFsc2U8L25zMTpp
c1NCQUNlcnRpZmllZDhBSm9pbnRWZW50dXJlPjwvbnMxOnZlbmRvckNlcnRpZmlj
YXRpb25zPgogICAgICAgICAgICA8bnMxOnZlbmRvckxvY2F0aW9uPgogICAgICAg
ICAgICAgIDxuczE6c3RyZWV0QWRkcmVzcz4yMjAwIFdJTFNPTiBCTFZEIFNURSA4
MTA8L25zMTpzdHJlZXRBZGRyZXNzPgogICAgICAgICAgICAgIDxuczE6Y2l0eT5B
UkxJTkdUT048L25zMTpjaXR5PgogICAgICAgICAgICAgIDxuczE6c3RhdGUgbmFt
ZT0iVklSR0lOSUEiPlZBPC9uczE6c3RhdGU+CiAgICAgICAgICAgICAgPG5zMTpa
SVBDb2RlPjIyMjAxMzM2MTwvbnMxOlpJUENvZGU+CiAgICAgICAgICAgICAgPG5z
MTpjb3VudHJ5Q29kZSBuYW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3Vu
dHJ5Q29kZT4KICAgICAgICAgICAgICA8bnMxOnBob25lTm8+NzAzMjUzOTcyMjwv
bnMxOnBob25lTm8+CiAgICAgICAgICAgICAgPG5zMTpmYXhObz43MDM1MjIyMDM3
PC9uczE6ZmF4Tm8+CiAgICAgICAgICAgICAgPG5zMTpjb25ncmVzc2lvbmFsRGlz
dHJpY3RDb2RlPjA4PC9uczE6Y29uZ3Jlc3Npb25hbERpc3RyaWN0Q29kZT48L25z
MTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JTaXRlQ29k
ZT4xMjYyNDIxNTA8L25zMTp2ZW5kb3JTaXRlQ29kZT4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4yMjIwMTMzOTc8L25zMTp2ZW5kb3JB
bHRlcm5hdGVTaXRlQ29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JEVU5TSW5m
b3JtYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpEVU5TTnVtYmVyPjEyNjI0MjE1
MDwvbnMxOkRVTlNOdW1iZXI+CiAgICAgICAgICAgICAgPG5zMTpjYWdlQ29kZT4z
QzdSMTwvbnMxOmNhZ2VDb2RlPgogICAgICAgICAgICAgIDxuczE6dmVuZG9yTmFt
ZT5BUEVYVEVDSCBMTEM8L25zMTp2ZW5kb3JOYW1lPgogICAgICAgICAgICAgIDxu
czE6Z2xvYmFsUGFyZW50RFVOU051bWJlcj4xMjYyNDIxNTA8L25zMTpnbG9iYWxQ
YXJlbnREVU5TTnVtYmVyPgogICAgICAgICAgICAgIDxuczE6Z2xvYmFsUGFyZW50
RFVOU05hbWU+QVBFWFRFQ0ggTExDPC9uczE6Z2xvYmFsUGFyZW50RFVOU05hbWU+
PC9uczE6dmVuZG9yRFVOU0luZm9ybWF0aW9uPgogICAgICAgICAgICA8bnMxOmNj
clJlZ2lzdHJhdGlvbkRldGFpbHM+CiAgICAgICAgICAgICAgPG5zMTpyZWdpc3Ry
YXRpb25EYXRlPjIwMDMtMDEtMTUgMDA6MDA6MDA8L25zMTpyZWdpc3RyYXRpb25E
YXRlPgogICAgICAgICAgICAgIDxuczE6cmVuZXdhbERhdGU+MjAxNC0wNy0zMSAw
MDowMDowMDwvbnMxOnJlbmV3YWxEYXRlPjwvbnMxOmNjclJlZ2lzdHJhdGlvbkRl
dGFpbHM+PC9uczE6dmVuZG9yU2l0ZURldGFpbHM+CiAgICAgICAgICA8bnMxOmNv
bnRyYWN0aW5nT2ZmaWNlckJ1c2luZXNzU2l6ZURldGVybWluYXRpb24gZGVzY3Jp
cHRpb249IlNNQUxMIEJVU0lORVNTIj5TPC9uczE6Y29udHJhY3RpbmdPZmZpY2Vy
QnVzaW5lc3NTaXplRGV0ZXJtaW5hdGlvbj48L25zMTp2ZW5kb3I+CiAgICAgICAg
PG5zMTpwbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICA8bnMxOnByaW5jaXBh
bFBsYWNlT2ZQZXJmb3JtYW5jZT4KICAgICAgICAgICAgPG5zMTpzdGF0ZUNvZGUg
bmFtZT0iTUFSWUxBTkQiPk1EPC9uczE6c3RhdGVDb2RlPgogICAgICAgICAgICA8
bnMxOmNvdW50cnlDb2RlIG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNv
dW50cnlDb2RlPjwvbnMxOnByaW5jaXBhbFBsYWNlT2ZQZXJmb3JtYW5jZT4KICAg
ICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNlWklQQ29kZSBjb3VudHk9IlBS
SU5DRSBHRU9SR0VTIiBjaXR5PSJCRUxUU1ZJTExFIj4yMDcwNTEwMDM8L25zMTpw
bGFjZU9mUGVyZm9ybWFuY2VaSVBDb2RlPgogICAgICAgICAgPG5zMTpwbGFjZU9m
UGVyZm9ybWFuY2VDb25ncmVzc2lvbmFsRGlzdHJpY3Q+MDQ8L25zMTpwbGFjZU9m
UGVyZm9ybWFuY2VDb25ncmVzc2lvbmFsRGlzdHJpY3Q+PC9uczE6cGxhY2VPZlBl
cmZvcm1hbmNlPgogICAgICAgIDxuczE6Y29tcGV0aXRpb24+CiAgICAgICAgICA8
bnMxOmV4dGVudENvbXBldGVkIGRlc2NyaXB0aW9uPSJGVUxMIEFORCBPUEVOIENP
TVBFVElUSU9OIEFGVEVSIEVYQ0xVU0lPTiBPRiBTT1VSQ0VTIj5EPC9uczE6ZXh0
ZW50Q29tcGV0ZWQ+CiAgICAgICAgICA8bnMxOnNvbGljaXRhdGlvblByb2NlZHVy
ZXMgZGVzY3JpcHRpb249IlNVQkpFQ1QgVE8gTVVMVElQTEUgQVdBUkQgRkFJUiBP
UFBPUlRVTklUWSI+TUFGTzwvbnMxOnNvbGljaXRhdGlvblByb2NlZHVyZXM+CiAg
ICAgICAgICA8bnMxOnR5cGVPZlNldEFzaWRlIGRlc2NyaXB0aW9uPSI4QSBDT01Q
RVRFRCI+OEE8L25zMTp0eXBlT2ZTZXRBc2lkZT4KICAgICAgICAgIDxuczE6ZXZh
bHVhdGVkUHJlZmVyZW5jZSBkZXNjcmlwdGlvbj0iTk8gUFJFRkVSRU5DRSBVU0VE
Ij5OT05FPC9uczE6ZXZhbHVhdGVkUHJlZmVyZW5jZT4KICAgICAgICAgIDxuczE6
c3RhdHV0b3J5RXhjZXB0aW9uVG9GYWlyT3Bwb3J0dW5pdHkgZGVzY3JpcHRpb249
Ik9USEVSIFNUQVRVVE9SWSBBVVRIT1JJVFkiPk9TQTwvbnMxOnN0YXR1dG9yeUV4
Y2VwdGlvblRvRmFpck9wcG9ydHVuaXR5PgogICAgICAgICAgPG5zMTpjb21tZXJj
aWFsSXRlbUFjcXVpc2l0aW9uUHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iQ09NTUVS
Q0lBTCBJVEVNIj5BPC9uczE6Y29tbWVyY2lhbEl0ZW1BY3F1aXNpdGlvblByb2Nl
ZHVyZXM+CiAgICAgICAgICA8bnMxOmNvbW1lcmNpYWxJdGVtVGVzdFByb2dyYW0g
ZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6Y29tbWVyY2lhbEl0ZW1UZXN0UHJvZ3Jh
bT4KICAgICAgICAgIDxuczE6QTc2QWN0aW9uIGRlc2NyaXB0aW9uPSJOTyI+Tjwv
bnMxOkE3NkFjdGlvbj4KICAgICAgICAgIDxuczE6ZmVkQml6T3BwcyBkZXNjcmlw
dGlvbj0iWUVTIj5ZPC9uczE6ZmVkQml6T3Bwcz4KICAgICAgICAgIDxuczE6bG9j
YWxBcmVhU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6bG9jYWxBcmVh
U2V0QXNpZGU+PC9uczE6Y29tcGV0aXRpb24+CiAgICAgICAgPG5zMTpwcmVmZXJl
bmNlUHJvZ3JhbXM+PC9uczE6cHJlZmVyZW5jZVByb2dyYW1zPgogICAgICAgIDxu
czE6dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6Y3JlYXRl
ZEJ5PlBBVUwuTUVSUklUVEBBUlMuVVNEQS5HT1Y8L25zMTpjcmVhdGVkQnk+CiAg
ICAgICAgICA8bnMxOmNyZWF0ZWREYXRlPjIwMTctMDktMTkgMTA6MTk6MTE8L25z
MTpjcmVhdGVkRGF0ZT4KICAgICAgICAgIDxuczE6bGFzdE1vZGlmaWVkQnk+SURW
X0NPUlJFQ1Q8L25zMTpsYXN0TW9kaWZpZWRCeT4KICAgICAgICAgIDxuczE6bGFz
dE1vZGlmaWVkRGF0ZT4yMDE3LTEwLTA0IDE0OjIwOjQ4PC9uczE6bGFzdE1vZGlm
aWVkRGF0ZT4KICAgICAgICAgIDxuczE6c3RhdHVzIGRlc2NyaXB0aW9uPSJGSU5B
TCI+RjwvbnMxOnN0YXR1cz4KICAgICAgICAgIDxuczE6YXBwcm92ZWRCeT5QQVVM
Lk1FUlJJVFRAQVJTLlVTREEuR09WPC9uczE6YXBwcm92ZWRCeT4KICAgICAgICAg
IDxuczE6YXBwcm92ZWREYXRlPjIwMTctMDktMjIgMTQ6MzE6MDI8L25zMTphcHBy
b3ZlZERhdGU+CiAgICAgICAgICA8bnMxOmNsb3NlZFN0YXR1cz5OPC9uczE6Y2xv
c2VkU3RhdHVzPjwvbnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+PC9uczE6YXdh
cmQ+CiAgICA8L2NvbnRlbnQ+CiAgPC9lbnRyeT4KICA8ZW50cnk+CiAgICA8dGl0
bGU+PCFbQ0RBVEFbTmV3IERFTElWRVJZIE9SREVSIEhRMDQyMzA3RjAwMDkgYXdh
cmRlZCB0byBETFQgU09MVVRJT05TIElOQ09SUE9SQVRFRCBmb3IgdGhlIGFtb3Vu
dCBvZiAkMywxOTldXT48L3RpdGxlPgogICAgPGxpbmsgcmVsPSJhbHRlcm5hdGUi
IHR5cGU9InRleHQvaHRtbCIgaHJlZj0iaHR0cHM6Ly93d3cuZnBkcy5nb3YvZXpz
ZWFyY2gvc2VhcmNoLmRvP3M9RlBEUyZhbXA7aW5kZXhOYW1lPWF3YXJkZnVsbCZh
bXA7dGVtcGxhdGVOYW1lPTEuNS4xJmFtcDtxPUhRMDQyMzA3RjAwMDkrOTcwMCsi
PjwvbGluaz4KICAgIDxtb2RpZmllZD4yMDE2LTAyLTE2IDEzOjEwOjA1PC9tb2Rp
ZmllZD4KICAgIDxjb250ZW50IHhtbG5zOm5zMT0iaHR0cHM6Ly93d3cuZnBkcy5n
b3YvRlBEUyIgdHlwZT0iYXBwbGljYXRpb24veG1sIj4KICAgICAgPG5zMTphd2Fy
ZCB4bWxuczpuczE9Imh0dHA6Ly93d3cuZnBkc25nLmNvbS9GUERTIiB2ZXJzaW9u
PSIxLjIiPgogICAgICAgIDxuczE6YXdhcmRJRD4KICAgICAgICAgIDxuczE6YXdh
cmRDb250cmFjdElEPgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9IkRF
UFQgT0YgREVGRU5TRSI+OTcwMDwvbnMxOmFnZW5jeUlEPgogICAgICAgICAgICA8
bnMxOlBJSUQ+SFEwNDIzMDdGMDAwOTwvbnMxOlBJSUQ+CiAgICAgICAgICAgIDxu
czE6bW9kTnVtYmVyPjA8L25zMTptb2ROdW1iZXI+CiAgICAgICAgICAgIDxuczE6
dHJhbnNhY3Rpb25OdW1iZXI+MDwvbnMxOnRyYW5zYWN0aW9uTnVtYmVyPjwvbnMx
OmF3YXJkQ29udHJhY3RJRD4KICAgICAgICAgIDxuczE6cmVmZXJlbmNlZElEVklE
PgogICAgICAgICAgICA8bnMxOmFnZW5jeUlEIG5hbWU9IkZFREVSQUwgQUNRVUlT
SVRJT04gU0VSVklDRSI+NDczMDwvbnMxOmFnZW5jeUlEPgogICAgICAgICAgICA8
bnMxOlBJSUQ+R1MzNUY0NTQzRzwvbnMxOlBJSUQ+CiAgICAgICAgICAgIDxuczE6
bW9kTnVtYmVyPjA8L25zMTptb2ROdW1iZXI+PC9uczE6cmVmZXJlbmNlZElEVklE
PjwvbnMxOmF3YXJkSUQ+CiAgICAgICAgPG5zMTpyZWxldmFudENvbnRyYWN0RGF0
ZXM+CiAgICAgICAgICA8bnMxOnNpZ25lZERhdGU+MjAwNi0xMC0wMSAwMDowMDow
MDwvbnMxOnNpZ25lZERhdGU+CiAgICAgICAgICA8bnMxOmVmZmVjdGl2ZURhdGU+
MjAwNi0xMC0wMSAwMDowMDowMDwvbnMxOmVmZmVjdGl2ZURhdGU+CiAgICAgICAg
ICA8bnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4yMDA3LTA5LTMwIDAwOjAwOjAw
PC9uczE6Y3VycmVudENvbXBsZXRpb25EYXRlPgogICAgICAgICAgPG5zMTp1bHRp
bWF0ZUNvbXBsZXRpb25EYXRlPjIwMDctMDktMzAgMDA6MDA6MDA8L25zMTp1bHRp
bWF0ZUNvbXBsZXRpb25EYXRlPjwvbnMxOnJlbGV2YW50Q29udHJhY3REYXRlcz4K
ICAgICAgICA8bnMxOmRvbGxhclZhbHVlcz4KICAgICAgICAgIDxuczE6b2JsaWdh
dGVkQW1vdW50PjMxOTkuMDA8L25zMTpvYmxpZ2F0ZWRBbW91bnQ+CiAgICAgICAg
ICA8bnMxOmJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+MzE5OS4wMDwvbnMx
OmJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAgICA8bnMxOmJh
c2VBbmRBbGxPcHRpb25zVmFsdWU+MzE5OS4wMDwvbnMxOmJhc2VBbmRBbGxPcHRp
b25zVmFsdWU+PC9uczE6ZG9sbGFyVmFsdWVzPgogICAgICAgIDxuczE6dG90YWxE
b2xsYXJWYWx1ZXM+CiAgICAgICAgICA8bnMxOnRvdGFsT2JsaWdhdGVkQW1vdW50
PjMxOTkuMDA8L25zMTp0b3RhbE9ibGlnYXRlZEFtb3VudD4KICAgICAgICAgIDxu
czE6dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPjMxOTkuMDA8L25z
MTp0b3RhbEJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+CiAgICAgICAgICA8
bnMxOnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT4zMTk5LjAwPC9uczE6dG90
YWxCYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjwvbnMxOnRvdGFsRG9sbGFyVmFsdWVz
PgogICAgICAgIDxuczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAgICAgICAgICA8
bnMxOmNvbnRyYWN0aW5nT2ZmaWNlQWdlbmN5SUQgbmFtZT0iREVGRU5TRSBGSU5B
TkNFIEFORCBBQ0NPVU5USU5HIFNFUlZJQ0UgKERGQVMpIiBkZXBhcnRtZW50SUQ9
Ijk3MDAiIGRlcGFydG1lbnROYW1lPSJERVBUIE9GIERFRkVOU0UiPjk3Qlo8L25z
MTpjb250cmFjdGluZ09mZmljZUFnZW5jeUlEPgogICAgICAgICAgPG5zMTpjb250
cmFjdGluZ09mZmljZUlEIG5hbWU9IkRFRkVOU0UgRklOQU5DRSBBTkQgQUNDT1VO
VElORyBTVkMiIGNvdW50cnk9IlVTQSI+SFEwNDIzPC9uczE6Y29udHJhY3RpbmdP
ZmZpY2VJRD4KICAgICAgICAgIDxuczE6ZnVuZGluZ1JlcXVlc3RpbmdBZ2VuY3lJ
RCBuYW1lPSJERUZFTlNFIEZJTkFOQ0UgQU5EIEFDQ09VTlRJTkcgU0VSVklDRSAo
REZBUykiIGRlcGFydG1lbnRJRD0iOTcwMCIgZGVwYXJ0bWVudE5hbWU9IkRFUFQg
T0YgREVGRU5TRSI+OTdCWjwvbnMxOmZ1bmRpbmdSZXF1ZXN0aW5nQWdlbmN5SUQ+
CiAgICAgICAgICA8bnMxOmZ1bmRpbmdSZXF1ZXN0aW5nT2ZmaWNlSUQgbmFtZT0i
REVGRU5TRSBGSU5BTkNFIEFORCBBQ0NPVU5USU5HIFNWQyI+SFEwNDIyPC9uczE6
ZnVuZGluZ1JlcXVlc3RpbmdPZmZpY2VJRD4KICAgICAgICAgIDxuczE6Zm9yZWln
bkZ1bmRpbmcgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6Zm9y
ZWlnbkZ1bmRpbmc+PC9uczE6cHVyY2hhc2VySW5mb3JtYXRpb24+CiAgICAgICAg
PG5zMTpjb250cmFjdE1hcmtldGluZ0RhdGE+CiAgICAgICAgICA8bnMxOmZlZVBh
aWRGb3JVc2VPZlNlcnZpY2U+MC4wMDwvbnMxOmZlZVBhaWRGb3JVc2VPZlNlcnZp
Y2U+PC9uczE6Y29udHJhY3RNYXJrZXRpbmdEYXRhPgogICAgICAgIDxuczE6Y29u
dHJhY3REYXRhPgogICAgICAgICAgPG5zMTpjb250cmFjdEFjdGlvblR5cGUgZGVz
Y3JpcHRpb249IkRFTElWRVJZIE9SREVSIj5DPC9uczE6Y29udHJhY3RBY3Rpb25U
eXBlPgogICAgICAgICAgPG5zMTp0eXBlT2ZDb250cmFjdFByaWNpbmcgZGVzY3Jp
cHRpb249IkZJWEVEIFBSSUNFIj5KPC9uczE6dHlwZU9mQ29udHJhY3RQcmljaW5n
PgogICAgICAgICAgPG5zMTpuYXRpb25hbEludGVyZXN0QWN0aW9uQ29kZSBkZXNj
cmlwdGlvbj0iTk9ORSI+Tk9ORTwvbnMxOm5hdGlvbmFsSW50ZXJlc3RBY3Rpb25D
b2RlPgogICAgICAgICAgPG5zMTpjb3N0QWNjb3VudGluZ1N0YW5kYXJkc0NsYXVz
ZSBkZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUgRVhFTVBUIEZST00gQ0FTIj5Y
PC9uczE6Y29zdEFjY291bnRpbmdTdGFuZGFyZHNDbGF1c2U+CiAgICAgICAgICA8
bnMxOmRlc2NyaXB0aW9uT2ZDb250cmFjdFJlcXVpcmVtZW50PlNRTCBOQVZJR0FU
T1IgRk9SIE9SQUNMRSBTT0ZUV0FSRSBMSUNFTlNFIE1BSU5URU5BTkNFIFJFTkVX
QUw7IFNRTCBOQVZJR0FUT1IgRk9SIE9SQUNMRSBYUEVSVCBUVU5JTkcgTU9EVUxF
IFNPRlRXQVJFIExJQ0VOU0UgTUFJTlRFTkFOQ0UgUkVORVdBTDsgUEwgRk9STUFU
IE9QVElPTiBGT1IgU1FMIE5BVklHQVRPUiBTT0ZUV0FSRSBMSUNFTlNFIE1BSU5U
RU5BTkNFIFJFTkVXQUw7IERFQlVHR0VSIE9QVElPTiBGT1IgU1FMIE5BVklHQVRP
UiBTT0ZUV0FSRSBMSUNFTlNFIE1BSU5URU5BTkNFIFJFTkVXQUw7IEFORCBLTk9X
TEVER0UgWFBFUlQgRk9SIFBML1NRTCBERVZFTE9QTUVOVCBTT0ZUV0FSRSBNQUlO
VEVOQU5DRSBMSUNFTlNFIFJFTkVXQUw8L25zMTpkZXNjcmlwdGlvbk9mQ29udHJh
Y3RSZXF1aXJlbWVudD4KICAgICAgICAgIDxuczE6R0ZFLUdGUCBkZXNjcmlwdGlv
bj0iVHJhbnNhY3Rpb24gZG9lcyBub3QgdXNlIEdGRS9HRlAiPk48L25zMTpHRkUt
R0ZQPgogICAgICAgICAgPG5zMTpzZWFUcmFuc3BvcnRhdGlvbiBkZXNjcmlwdGlv
bj0iTk8iPk48L25zMTpzZWFUcmFuc3BvcnRhdGlvbj4KICAgICAgICAgIDxuczE6
dW5kZWZpbml0aXplZEFjdGlvbiBkZXNjcmlwdGlvbj0iTk8iPlg8L25zMTp1bmRl
ZmluaXRpemVkQWN0aW9uPgogICAgICAgICAgPG5zMTpjb25zb2xpZGF0ZWRDb250
cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpjb25zb2xpZGF0ZWRDb250cmFj
dD4KICAgICAgICAgIDxuczE6cGVyZm9ybWFuY2VCYXNlZFNlcnZpY2VDb250cmFj
dCBkZXNjcmlwdGlvbj0iTk8gLSBTRVJWSUNFIFdIRVJFIFBCQSBJUyBOT1QgVVNF
RC4iPk48L25zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNvbnRyYWN0PgogICAg
ICAgICAgPG5zMTptdWx0aVllYXJDb250cmFjdCBkZXNjcmlwdGlvbj0iTk8iPk48
L25zMTptdWx0aVllYXJDb250cmFjdD4KICAgICAgICAgIDxuczE6Y29udHJhY3RG
aW5hbmNpbmcgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5aPC9uczE6Y29u
dHJhY3RGaW5hbmNpbmc+CiAgICAgICAgICA8bnMxOnB1cmNoYXNlQ2FyZEFzUGF5
bWVudE1ldGhvZCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpwdXJjaGFzZUNhcmRB
c1BheW1lbnRNZXRob2Q+CiAgICAgICAgICA8bnMxOm51bWJlck9mQWN0aW9ucz4x
PC9uczE6bnVtYmVyT2ZBY3Rpb25zPjwvbnMxOmNvbnRyYWN0RGF0YT4KICAgICAg
ICA8bnMxOmxlZ2lzbGF0aXZlTWFuZGF0ZXM+CiAgICAgICAgICA8bnMxOkNsaW5n
ZXJDb2hlbkFjdCBkZXNjcmlwdGlvbj0iTk8iPk48L25zMTpDbGluZ2VyQ29oZW5B
Y3Q+CiAgICAgICAgICA8bnMxOm1hdGVyaWFsc1N1cHBsaWVzQXJ0aWNsZXNFcXVp
cG1lbnQgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6bWF0ZXJp
YWxzU3VwcGxpZXNBcnRpY2xlc0VxdWlwbWVudD4KICAgICAgICAgIDxuczE6bGFi
b3JTdGFuZGFyZHMgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNBQkxFIj5YPC9uczE6
bGFib3JTdGFuZGFyZHM+CiAgICAgICAgICA8bnMxOmNvbnN0cnVjdGlvbldhZ2VS
YXRlUmVxdWlyZW1lbnRzIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwv
bnMxOmNvbnN0cnVjdGlvbldhZ2VSYXRlUmVxdWlyZW1lbnRzPgogICAgICAgICAg
PG5zMTpsaXN0T2ZBZGRpdGlvbmFsUmVwb3J0aW5nVmFsdWVzPjwvbnMxOmxpc3RP
ZkFkZGl0aW9uYWxSZXBvcnRpbmdWYWx1ZXM+CiAgICAgICAgICA8bnMxOmludGVy
YWdlbmN5Q29udHJhY3RpbmdBdXRob3JpdHkgZGVzY3JpcHRpb249Ik5PVCBBUFBMSUNB
QkxFIj5YPC9uczE6aW50ZXJhZ2VuY3lDb250cmFjdGluZ0F1dGhvcml0eT48L25z
MTpsZWdpc2xhdGl2ZU1hbmRhdGVzPgogICAgICAgIDxuczE6cHJvZHVjdE9yU2Vy
dmljZUluZm9ybWF0aW9uPgogICAgICAgICAgPG5zMTpwcm9kdWN0T3JTZXJ2aWNl
Q29kZSBkZXNjcmlwdGlvbj0iQURQIEZBQ0lMSVRZIE1BTkFHRU1FTlQiIHByb2R1
Y3RPclNlcnZpY2VUeXBlPSJTRVJWSUNFIj5EMzAxPC9uczE6cHJvZHVjdE9yU2Vy
dmljZUNvZGU+CiAgICAgICAgICA8bnMxOmNvbnRyYWN0QnVuZGxpbmcgZGVzY3Jp
cHRpb249Ik5PVCBBIEJVTkRMRUQgUkVRVUlSRU1FTlQiPkQ8L25zMTpjb250cmFj
dEJ1bmRsaW5nPgogICAgICAgICAgPG5zMTpjbGFpbWFudFByb2dyYW1Db2RlIGRl
c2NyaXB0aW9uPSJFTEVDVFJPTklDUyBBTkQgQ09NTVVOSUNBVElPTiBFUVVJUE1F
TlQiPkE3PC9uczE6Y2xhaW1hbnRQcm9ncmFtQ29kZT4KICAgICAgICAgIDxuczE6
cHJpbmNpcGFsTkFJQ1NDb2RlIGRlc2NyaXB0aW9uPSJPVEhFUiBDT01QVVRFUiBS
RUxBVEVEIFNFUlZJQ0VTIj41NDE1MTk8L25zMTpwcmluY2lwYWxOQUlDU0NvZGU+
CiAgICAgICAgICA8bnMxOnN5c3RlbUVxdWlwbWVudENvZGUgZGVzY3JpcHRpb249
Ik5PTkUiPjAwMDwvbnMxOnN5c3RlbUVxdWlwbWVudENvZGU+CiAgICAgICAgICA8
bnMxOmluZm9ybWF0aW9uVGVjaG5vbG9neUNvbW1lcmNpYWxJdGVtQ2F0ZWdvcnkg
ZGVzY3JpcHRpb249IkNPTU1FUkNJQUxMWSBBVkFJTEFCTEUiPkE8L25zMTppbmZv
cm1hdGlvblRlY2hub2xvZ3lDb21tZXJjaWFsSXRlbUNhdGVnb3J5PgogICAgICAg
ICAgPG5zMTp1c2VPZkVQQURlc2lnbmF0ZWRQcm9kdWN0cyBkZXNjcmlwdGlvbj0i
Tk9UIFJFUVVJUkVEIj5FPC9uczE6dXNlT2ZFUEFEZXNpZ25hdGVkUHJvZHVjdHM+
CiAgICAgICAgICA8bnMxOmNvdW50cnlPZk9yaWdpbiBuYW1lPSJVTklURUQgU1RB
VEVTIj5VU0E8L25zMTpjb3VudHJ5T2ZPcmlnaW4+CiAgICAgICAgICA8bnMxOnBs
YWNlT2ZNYW51ZmFjdHVyZSBkZXNjcmlwdGlvbj0iTk9UIEEgTUFOVUZBQ1RVUkVE
IEVORCBQUk9EVUNUIj5DPC9uczE6cGxhY2VPZk1hbnVmYWN0dXJlPjwvbnMxOnBy
b2R1Y3RPclNlcnZpY2VJbmZvcm1hdGlvbj4KICAgICAgICA8bnMxOnZlbmRvcj4K
ICAgICAgICAgIDxuczE6dmVuZG9ySGVhZGVyPgogICAgICAgICAgICA8bnMxOnZl
bmRvck5hbWU+RExUIFNPTFVUSU9OUyBJTkNPUlBPUkFURUQ8L25zMTp2ZW5kb3JO
YW1lPjwvbnMxOnZlbmRvckhlYWRlcj4KICAgICAgICAgIDxuczE6dmVuZG9yU2l0
ZURldGFpbHM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yU29jaW9FY29ub21pY0lu
ZGljYXRvcnM+CiAgICAgICAgICAgICAgPG5zMTppc0FsYXNrYW5OYXRpdmVPd25l
ZENvcnBvcmF0aW9uT3JGaXJtPmZhbHNlPC9uczE6aXNBbGFza2FuTmF0aXZlT3du
ZWRDb3Jwb3JhdGlvbk9yRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzQW1lcmlj
YW5JbmRpYW5Pd25lZD5mYWxzZTwvbnMxOmlzQW1lcmljYW5JbmRpYW5Pd25lZD4K
ICAgICAgICAgICAgICA8bnMxOmlzSW5kaWFuVHJpYmU+ZmFsc2U8L25zMTppc0lu
ZGlhblRyaWJlPgogICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVIYXdhaWlhbk93
bmVkT3JnYW5pemF0aW9uT3JGaXJtPmZhbHNlPC9uczE6aXNOYXRpdmVIYXdhaWlh
bk93bmVkT3JnYW5pemF0aW9uT3JGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNU
cmliYWxseU93bmVkRmlybT5mYWxzZTwvbnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+
CiAgICAgICAgICAgICAgPG5zMTppc1ZldGVyYW5Pd25lZD5mYWxzZTwvbnMxOmlz
VmV0ZXJhbk93bmVkPgogICAgICAgICAgICAgIDxuczE6aXNTZXJ2aWNlUmVsYXRl
ZERpc2FibGVkVmV0ZXJhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc1NlcnZp
Y2VSZWxhdGVkRGlzYWJsZWRWZXRlcmFuT3duZWRCdXNpbmVzcz4KICAgICAgICAg
ICAgICA8bnMxOmlzV29tZW5Pd25lZD5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZD4K
ICAgICAgICAgICAgICA8bnMxOm1pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzTWlub3JpdHlPd25lZD5mYWxzZTwvbnMxOmlzTWlub3JpdHlPd25l
ZD4KICAgICAgICAgICAgICAgIDxuczE6aXNTdWJDb250aW5lbnRBc2lhbkFtZXJp
Y2FuT3duZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU3ViQ29udGluZW50QXNpYW5B
bWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8bnMxOmlzQXNp
YW5QYWNpZmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNBc2lh
blBhY2lmaWNBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAgICAgICAgICAgICA8
bnMxOmlzQmxhY2tBbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc0Js
YWNrQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAgICAgICAgICAgPG5zMTpp
c0hpc3BhbmljQW1lcmljYW5Pd25lZEJ1c2luZXNzPmZhbHNlPC9uczE6aXNIaXNw
YW5pY0FtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAgICAgICAgICAgICAgIDxuczE6
aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTppc05hdGl2
ZUFtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAgICAgICAgICAgICAgIDxuczE6aXNP
dGhlck1pbm9yaXR5T3duZWQ+ZmFsc2U8L25zMTppc090aGVyTWlub3JpdHlPd25l
ZD48L25zMTptaW5vcml0eU93bmVkPgogICAgICAgICAgICAgIDxuczE6aXNWZXJ5
U21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgPG5zMTppc1dvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNl
PC9uczE6aXNXb21lbk93bmVkU21hbGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8
bnMxOmlzRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1
c2luZXNzPmZhbHNlPC9uczE6aXNFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkV29t
ZW5Pd25lZFNtYWxsQnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50
VmVudHVyZVdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2lu
dFZlbnR1cmVXb21lbk93bmVkU21hbGxCdXNpbmVzcz4KICAgICAgICAgICAgICA8
bnMxOmlzSm9pbnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVu
T3duZWRTbWFsbEJ1c2luZXNzPmZhbHNlPC9uczE6aXNKb2ludFZlbnR1cmVFY29u
b21pY2FsbHlEaXNhZHZhbnRhZ2VkV29tZW5Pd25lZFNtYWxsQnVzaW5lc3M+PC9u
czE6dmVuZG9yU29jaW9FY29ub21pY0luZGljYXRvcnM+CiAgICAgICAgICAgIDxu
czE6dmVuZG9yQnVzaW5lc3NUeXBlcz4KICAgICAgICAgICAgICA8bnMxOmlzQ29t
bXVuaXR5RGV2ZWxvcGVkQ29ycG9yYXRpb25Pd25lZEZpcm0+ZmFsc2U8L25zMTpp
c0NvbW11bml0eURldmVsb3BlZENvcnBvcmF0aW9uT3duZWRGaXJtPgogICAgICAg
ICAgICAgIDxuczE6aXNMYWJvclN1cnBsdXNBcmVhRmlybT5mYWxzZTwvbnMxOmlz
TGFib3JTdXJwbHVzQXJlYUZpcm0+CiAgICAgICAgICAgICAgPG5zMTpmZWRlcmFs
R292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNGZWRlcmFsR292ZXJu
bWVudD5mYWxzZTwvbnMxOmlzRmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAg
ICAgICA8bnMxOmlzRmVkZXJhbGx5RnVuZGVkUmVzZWFyY2hBbmREZXZlbG9wbWVu
dENvcnA+ZmFsc2U8L25zMTppc0ZlZGVyYWxseUZ1bmRlZFJlc2VhcmNoQW5kRGV2
ZWxvcG1lbnRDb3JwPgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVyYWxHb3Zl
cm5tZW50QWdlbmN5PmZhbHNlPC9uczE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5j
eT48L25zMTpmZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMxOmlz
U3RhdGVHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNTdGF0ZUdvdmVybm1lbnQ+CiAg
ICAgICAgICAgICAgPG5zMTpsb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAg
ICA8bnMxOmlzTG9jYWxHb3Zlcm5tZW50PmZhbHNlPC9uczE6aXNMb2NhbEdvdmVy
bm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ2l0eUxvY2FsR292ZXJubWVu
dD5mYWxzZTwvbnMxOmlzQ2l0eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAg
ICAgIDxuczE6aXNDb3VudHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0Nv
dW50eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNJbnRl
ck11bmljaXBhbExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzSW50ZXJNdW5p
Y2lwYWxMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzTG9j
YWxHb3Zlcm5tZW50T3duZWQ+ZmFsc2U8L25zMTppc0xvY2FsR292ZXJubWVudE93
bmVkPgogICAgICAgICAgICAgICAgPG5zMTppc011bmljaXBhbGl0eUxvY2FsR292
ZXJubWVudD5mYWxzZTwvbnMxOmlzTXVuaWNpcGFsaXR5TG9jYWxHb3Zlcm5tZW50
PgogICAgICAgICAgICAgICAgPG5zMTppc1NjaG9vbERpc3RyaWN0TG9jYWxHb3Zl
cm5tZW50PmZhbHNlPC9uczE6aXNTY2hvb2xEaXN0cmljdExvY2FsR292ZXJubWVu
dD4KICAgICAgICAgICAgICAgIDxuczE6aXNUb3duc2hpcExvY2FsR292ZXJubWVu
dD5mYWxzZTwvbnMxOmlzVG93bnNoaXBMb2NhbEdvdmVybm1lbnQ+PC9uczE6bG9j
YWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6aXNUcmliYWxHb3Zlcm5t
ZW50PmZhbHNlPC9uczE6aXNUcmliYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAg
IDxuczE6aXNGb3JlaWduR292ZXJubWVudD5mYWxzZTwvbnMxOmlzRm9yZWlnbkdv
dmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5zMTpidXNpbmVzc09yT3JnYW5pemF0
aW9uVHlwZT4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlO
b3RUYXhFeGVtcHQ+ZmFsc2U8L25zMTppc0NvcnBvcmF0ZUVudGl0eU5vdFRheEV4
ZW1wdD4KICAgICAgICAgICAgICAgIDxuczE6aXNDb3Jwb3JhdGVFbnRpdHlUYXhF
eGVtcHQ+ZmFsc2U8L25zMTppc0NvcnBvcmF0ZUVudGl0eVRheEV4ZW1wdD4KICAg
ICAgICAgICAgICAgIDxuczE6aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExpYWJpbGl0
eVBhcnRuZXJzaGlwPmZhbHNlPC9uczE6aXNQYXJ0bmVyc2hpcE9yTGltaXRlZExp
YWJpbGl0eVBhcnRuZXJzaGlwPgogICAgICAgICAgICAgICAgPG5zMTppc1NvbGVQ
cm9wcmVpdG9yc2hpcD5mYWxzZTwvbnMxOmlzU29sZVByb3ByZWl0b3JzaGlwPgog
ICAgICAgICAgICAgICAgPG5zMTppc1NtYWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRp
dmU+ZmFsc2U8L25zMTppc1NtYWxsQWdyaWN1bHR1cmFsQ29vcGVyYXRpdmU+CiAg
ICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbj5m
YWxzZTwvbnMxOmlzSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbj4KICAgICAgICAg
ICAgICAgIDxuczE6aXNVU0dvdmVybm1lbnRFbnRpdHk+ZmFsc2U8L25zMTppc1VT
R292ZXJubWVudEVudGl0eT48L25zMTpidXNpbmVzc09yT3JnYW5pemF0aW9uVHlw
ZT48L25zMTp2ZW5kb3JCdXNpbmVzc1R5cGVzPgogICAgICAgICAgICA8bnMxOnZl
bmRvckxpbmVPZkJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNDb21tdW5p
dHlEZXZlbG9wbWVudENvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNDb21tdW5pdHlE
ZXZlbG9wbWVudENvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNEb21l
c3RpY1NoZWx0ZXI+ZmFsc2U8L25zMTppc0RvbWVzdGljU2hlbHRlcj4KICAgICAg
ICAgICAgICA8bnMxOmlzRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbj5mYWxzZTwvbnMx
OmlzRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbj4KICAgICAgICAgICAgICA8bnMxOmlz
Rm91bmRhdGlvbj5mYWxzZTwvbnMxOmlzRm91bmRhdGlvbj4KICAgICAgICAgICAg
ICA8bnMxOmlzSG9zcGl0YWw+ZmFsc2U8L25zMTppc0hvc3BpdGFsPgogICAgICAg
ICAgICAgIDxuczE6aXNNYW51ZmFjdHVyZXJPZkdvb2RzPmZhbHNlPC9uczE6aXNN
YW51ZmFjdHVyZXJPZkdvb2RzPgogICAgICAgICAgICAgIDxuczE6aXNWZXRlcmlu
YXJ5SG9zcGl0YWw+ZmFsc2U8L25zMTppc1ZldGVyaW5hcnlIb3NwaXRhbD4KICAg
ICAgICAgICAgICA8bnMxOmlzSGlzcGFuaWNTZXJ2aWNpbmdJbnN0aXR1dGlvbj5m
YWxzZTwvbnMxOmlzSGlzcGFuaWNTZXJ2aWNpbmdJbnN0aXR1dGlvbj48L25zMTp2
ZW5kb3JMaW5lT2ZCdXNpbmVzcz4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JSZWxh
dGlvbnNoaXBXaXRoRmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgPG5z
MTpyZWNlaXZlc0NvbnRyYWN0cz5mYWxzZTwvbnMxOnJlY2VpdmVzQ29udHJhY3Rz
PgogICAgICAgICAgICAgIDxuczE6cmVjZWl2ZXNHcmFudHM+ZmFsc2U8L25zMTpy
ZWNlaXZlc0dyYW50cz4KICAgICAgICAgICAgICA8bnMxOnJlY2VpdmVzQ29udHJh
Y3RzQW5kR3JhbnRzPmZhbHNlPC9uczE6cmVjZWl2ZXNDb250cmFjdHNBbmRHcmFu
dHM+PC9uczE6dmVuZG9yUmVsYXRpb25zaGlwV2l0aEZlZGVyYWxHb3Zlcm5tZW50
PgogICAgICAgICAgICA8bnMxOnR5cGVPZkdvdmVybm1lbnRFbnRpdHk+CiAgICAg
ICAgICAgICAgPG5zMTppc0FpcnBvcnRBdXRob3JpdHk+ZmFsc2U8L25zMTppc0Fp
cnBvcnRBdXRob3JpdHk+CiAgICAgICAgICAgICAgPG5zMTppc0NvdW5jaWxPZkdv
dmVybm1lbnRzPmZhbHNlPC9uczE6aXNDb3VuY2lsT2ZHb3Zlcm5tZW50cz4KICAg
ICAgICAgICAgICA8bnMxOmlzSG91c2luZ0F1dGhvcml0aWVzUHVibGljT3JUcmli
YWw+ZmFsc2U8L25zMTppc0hvdXNpbmdBdXRob3JpdGllc1B1YmxpY09yVHJpYmFs
PgogICAgICAgICAgICAgIDxuczE6aXNJbnRlcnN0YXRlRW50aXR5PmZhbHNlPC9u
czE6aXNJbnRlcnN0YXRlRW50aXR5PgogICAgICAgICAgICAgIDxuczE6aXNQbGFu
bmluZ0NvbW1pc3Npb24+ZmFsc2U8L25zMTppc1BsYW5uaW5nQ29tbWlzc2lvbj4K
ICAgICAgICAgICAgICA8bnMxOmlzUG9ydEF1dGhvcml0eT5mYWxzZTwvbnMxOmlz
UG9ydEF1dGhvcml0eT4KICAgICAgICAgICAgICA8bnMxOmlzVHJhbnNpdEF1dGhv
cml0eT5mYWxzZTwvbnMxOmlzVHJhbnNpdEF1dGhvcml0eT48L25zMTp0eXBlT2ZH
b3Zlcm5tZW50RW50aXR5PgogICAgICAgICAgICA8bnMxOnZlbmRvck9yZ2FuaXph
dGlvbkZhY3RvcnM+CiAgICAgICAgICAgICAgPG5zMTppc1N1YmNoYXB0ZXJTQ29y
cG9yYXRpb24+ZmFsc2U8L25zMTppc1N1YmNoYXB0ZXJTQ29ycG9yYXRpb24+CiAg
ICAgICAgICAgICAgPG5zMTppc0xpbWl0ZWRMaWFiaWxpdHlDb3Jwb3JhdGlvbj5m
YWxzZTwvbnMxOmlzTGltaXRlZExpYWJpbGl0eUNvcnBvcmF0aW9uPgogICAgICAg
ICAgICAgIDxuczE6aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPmZhbHNlPC9uczE6
aXNGb3JlaWduT3duZWRBbmRMb2NhdGVkPgogICAgICAgICAgICAgIDxuczE6cHJv
Zml0U3RydWN0dXJlPgogICAgICAgICAgICAgICAgPG5zMTppc0ZvclByb2ZpdE9y
Z2FuaXphdGlvbj5mYWxzZTwvbnMxOmlzRm9yUHJvZml0T3JnYW5pemF0aW9uPgog
ICAgICAgICAgICAgICAgPG5zMTppc05vbnByb2ZpdE9yZ2FuaXphdGlvbj5mYWxz
ZTwvbnMxOmlzTm9ucHJvZml0T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAg
PG5zMTppc090aGVyTm90Rm9yUHJvZml0T3JnYW5pemF0aW9uPmZhbHNlPC9uczE6
aXNPdGhlck5vdEZvclByb2ZpdE9yZ2FuaXphdGlvbj48L25zMTpwcm9maXRTdHJ1
Y3R1cmU+CiAgICAgICAgICAgICAgPG5zMTppc1NoZWx0ZXJlZFdvcmtzaG9wPmZh
bHNlPC9uczE6aXNTaGVsdGVyZWRXb3Jrc2hvcD4KICAgICAgICAgICAgICA8bnMx
Om51bWJlck9mRW1wbG95ZWVzPjE3MzwvbnMxOm51bWJlck9mRW1wbG95ZWVzPgog
ICAgICAgICAgICAgIDxuczE6YW5udWFsUmV2ZW51ZT4yNjwvbnMxOmFubnVhbFJl
dmVudWU+PC9uczE6dmVuZG9yT3JnYW5pemF0aW9uRmFjdG9ycz4KICAgICAgICAg
ICAgPG5zMTp0eXBlT2ZFZHVjYXRpb25hbEVudGl0eT4KICAgICAgICAgICAgICA8
bnMxOmlzMTg2MkxhbmRHcmFudENvbGxlZ2U+ZmFsc2U8L25zMTppczE4NjJMYW5k
R3JhbnRDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXMxODkwTGFuZEdyYW50
Q29sbGVnZT5mYWxzZTwvbnMxOmlzMTg5MExhbmRHcmFudENvbGxlZ2U+CiAgICAg
ICAgICAgICAgPG5zMTppczE5OTRMYW5kR3JhbnRDb2xsZWdlPmZhbHNlPC9uczE6
aXMxOTk0TGFuZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzSGlz
dG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJzaXR5PmZhbHNlPC9uczE6aXNI
aXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHk+CiAgICAgICAgICAg
ICAgPG5zMTppc01pbm9yaXR5SW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc01pbm9y
aXR5SW5zdGl0dXRpb24+CiAgICAgICAgICAgICAgPG5zMTppc1ByaXZhdGVVbml2
ZXJzaXR5T3JDb2xsZWdlPmZhbHNlPC9uczE6aXNQcml2YXRlVW5pdmVyc2l0eU9y
Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT5m
YWxzZTwvbnMxOmlzU2Nob29sT2ZGb3Jlc3RyeT4KICAgICAgICAgICAgICA8bnMx
OmlzU3RhdGVDb250cm9sbGVkSW5zdGl0dXRpb25vZkhpZ2hlckxlYXJuaW5nPmZh
bHNlPC9uczE6aXNTdGF0ZUNvbnRyb2xsZWRJbnN0aXR1dGlvbm9mSGlnaGVyTGVh
cm5pbmc+CiAgICAgICAgICAgICAgPG5zMTppc1RyaWJhbENvbGxlZ2U+ZmFsc2U8
L25zMTppc1RyaWJhbENvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc1ZldGVy
aW5hcnlDb2xsZWdlPmZhbHNlPC9uczE6aXNWZXRlcmluYXJ5Q29sbGVnZT4KICAg
ICAgICAgICAgICA8bnMxOmlzQWxhc2thbk5hdGl2ZVNlcnZpY2luZ0luc3RpdHV0
aW9uPmZhbHNlPC9uczE6aXNBbGFza2FuTmF0aXZlU2VydmljaW5nSW5zdGl0dXRp
b24+CiAgICAgICAgICAgICAgPG5zMTppc05hdGl2ZUhhd2FpaWFuU2VydmljaW5n
SW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc05hdGl2ZUhhd2FpaWFuU2VydmljaW5n
SW5zdGl0dXRpb24+PC9uczE6dHlwZU9mRWR1Y2F0aW9uYWxFbnRpdHk+CiAgICAg
ICAgICAgIDxuczE6dmVuZG9yQ2VydGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAg
PG5zMTppc0RPVENlcnRpZmllZERpc2FkdmFudGFnZWRCdXNpbmVzc0VudGVycHJp
c2U+ZmFsc2U8L25zMTppc0RPVENlcnRpZmllZERpc2FkdmFudGFnZWRCdXNpbmVz
c0VudGVycHJpc2U+CiAgICAgICAgICAgICAgPG5zMTppc1NlbGZDZXJ0aWZpZWRT
bWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxzZTwvbnMxOmlzU2VsZkNlcnRp
ZmllZFNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxu
czE6aXNTQkFDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz5mYWxz
ZTwvbnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+
CiAgICAgICAgICAgICAgPG5zMTppc1NCQUNlcnRpZmllZDhBUHJvZ3JhbVBhcnRp
Y2lwYW50PmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWQ4QVByb2dyYW1QYXJ0aWNp
cGFudD4KICAgICAgICAgICAgICA8bnMxOmlzU2VsZkNlcnRpZmllZEhVQlpvbmVK
b2ludFZlbnR1cmU+ZmFsc2U8L25zMTppc1NlbGZDZXJ0aWZpZWRIVUJab25lSm9p
bnRWZW50dXJlPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZpZWRIVUJa
b25lPmZhbHNlPC9uczE6aXNTQkFDZXJ0aWZpZWRIVUJab25lPgogICAgICAgICAg
ICAgIDxuczE6aXNTQkFDZXJ0aWZpZWQ4QUpvaW50VmVudHVyZT5mYWxzZTwvbnMx
OmlzU0JBQ2VydGlmaWVkOEFKb2ludFZlbnR1cmU+PC9uczE6dmVuZG9yQ2VydGlm
aWNhdGlvbnM+CiAgICAgICAgICAgIDxuczE6dmVuZG9yTG9jYXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTpzdHJlZXRBZGRyZXNzPjEzODYxIFNVTlJJU0UgVkFMTEVZ
IERSIFNURSA0MDA8L25zMTpzdHJlZXRBZGRyZXNzPgogICAgICAgICAgICAgIDxu
czE6Y2l0eT5IRVJORE9OPC9uczE6Y2l0eT4KICAgICAgICAgICAgICA8bnMxOnN0
YXRlIG5hbWU9IlZJUkdJTklBIj5WQTwvbnMxOnN0YXRlPgogICAgICAgICAgICAg
IDxuczE6WklQQ29kZT4yMDE3MTYxMjY8L25zMTpaSVBDb2RlPgogICAgICAgICAg
ICAgIDxuczE6Y291bnRyeUNvZGUgbmFtZT0iVU5JVEVEIFNUQVRFUyI+VVNBPC9u
czE6Y291bnRyeUNvZGU+CiAgICAgICAgICAgICAgPG5zMTpjb25ncmVzc2lvbmFs
RGlzdHJpY3RDb2RlPjEwPC9uczE6Y29uZ3Jlc3Npb25hbERpc3RyaWN0Q29kZT48
L25zMTp2ZW5kb3JMb2NhdGlvbj4KICAgICAgICAgICAgPG5zMTp2ZW5kb3JTaXRl
Q29kZT43ODY0NjgxOTkwMDAwUFI8L25zMTp2ZW5kb3JTaXRlQ29kZT4KICAgICAg
ICAgICAgPG5zMTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4yMDE3MTYxMjY8L25z
MTp2ZW5kb3JBbHRlcm5hdGVTaXRlQ29kZT4KICAgICAgICAgICAgPG5zMTp2ZW5k
b3JEVU5TSW5mb3JtYXRpb24+CiAgICAgICAgICAgICAgPG5zMTpEVU5TTnVtYmVy
Pjc4NjQ2ODE5OTwvbnMxOkRVTlNOdW1iZXI+CiAgICAgICAgICAgICAgPG5zMTp2
ZW5kb3JOYW1lPkRMVCBTT0xVVElPTlMgSU5DT1JQT1JBVEVEPC9uczE6dmVuZG9y
TmFtZT4KICAgICAgICAgICAgICA8bnMxOmdsb2JhbFBhcmVudERVTlNOdW1iZXI+
Nzg2NDY4MTk5PC9uczE6Z2xvYmFsUGFyZW50RFVOU051bWJlcj4KICAgICAgICAg
ICAgICA8bnMxOmdsb2JhbFBhcmVudERVTlNOYW1lPkRMVCBTT0xVVElPTlMgIExM
QzwvbnMxOmdsb2JhbFBhcmVudERVTlNOYW1lPjwvbnMxOnZlbmRvckRVTlNJbmZv
cm1hdGlvbj4KICAgICAgICAgICAgPG5zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxz
PgogICAgICAgICAgICAgIDxuczE6cmVnaXN0cmF0aW9uRGF0ZT4yMDAyLTAzLTE0
IDAwOjAwOjAwPC9uczE6cmVnaXN0cmF0aW9uRGF0ZT4KICAgICAgICAgICAgICA8
bnMxOnJlbmV3YWxEYXRlPjIwMDgtMTEtMTYgMDA6MDA6MDA8L25zMTpyZW5ld2Fs
RGF0ZT48L25zMTpjY3JSZWdpc3RyYXRpb25EZXRhaWxzPjwvbnMxOnZlbmRvclNp
dGVEZXRhaWxzPgogICAgICAgICAgPG5zMTpjb250cmFjdGluZ09mZmljZXJCdXNp
bmVzc1NpemVEZXRlcm1pbmF0aW9uIGRlc2NyaXB0aW9uPSJTTUFMTCBCVVNJTkVT
UyI+UzwvbnMxOmNvbnRyYWN0aW5nT2ZmaWNlckJ1c2luZXNzU2l6ZURldGVybWlu
YXRpb24+PC9uczE6dmVuZG9yPgogICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1h
bmNlPgogICAgICAgICAgPG5zMTpwcmluY2lwYWxQbGFjZU9mUGVyZm9ybWFuY2U+
CiAgICAgICAgICAgIDxuczE6bG9jYXRpb25Db2RlPjE2MDAwPC9uczE6bG9jYXRp
b25Db2RlPgogICAgICAgICAgICA8bnMxOnN0YXRlQ29kZSBuYW1lPSJPSElPIj5P
SDwvbnMxOnN0YXRlQ29kZT4KICAgICAgICAgICAgPG5zMTpjb3VudHJ5Q29kZSBu
YW1lPSJVTklURUQgU1RBVEVTIj5VU0E8L25zMTpjb3VudHJ5Q29kZT48L25zMTpw
cmluY2lwYWxQbGFjZU9mUGVyZm9ybWFuY2U+CiAgICAgICAgICA8bnMxOnBsYWNl
T2ZQZXJmb3JtYW5jZVpJUENvZGUgY291bnR5PSJDVVlBSE9HQSIgY2l0eT0iQ0xF
VkVMQU5EIj40NDE5OTIwNTU8L25zMTpwbGFjZU9mUGVyZm9ybWFuY2VaSVBDb2Rl
PgogICAgICAgICAgPG5zMTpwbGFjZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFs
RGlzdHJpY3Q+MTE8L25zMTpwbGFjZU9mUGVyZm9ybWFuY2VDb25ncmVzc2lvbmFs
RGlzdHJpY3Q+PC9uczE6cGxhY2VPZlBlcmZvcm1hbmNlPgogICAgICAgIDxuczE6
Y29tcGV0aXRpb24+CiAgICAgICAgICA8bnMxOmV4dGVudENvbXBldGVkIGRlc2Ny
aXB0aW9uPSJGVUxMIEFORCBPUEVOIENPTVBFVElUSU9OIj5BPC9uczE6ZXh0ZW50
Q29tcGV0ZWQ+CiAgICAgICAgICA8bnMxOnNvbGljaXRhdGlvblByb2NlZHVyZXMg
ZGVzY3JpcHRpb249IlNVQkpFQ1QgVE8gTVVMVElQTEUgQVdBUkQgRkFJUiBPUFBP
UlRVTklUWSI+TUFGTzwvbnMxOnNvbGljaXRhdGlvblByb2NlZHVyZXM+CiAgICAg
ICAgICA8bnMxOnR5cGVPZlNldEFzaWRlIGRlc2NyaXB0aW9uPSJOTyBTRVQgQVNJ
REUgVVNFRC4iPk5PTkU8L25zMTp0eXBlT2ZTZXRBc2lkZT4KICAgICAgICAgIDxu
czE6ZXZhbHVhdGVkUHJlZmVyZW5jZSBkZXNjcmlwdGlvbj0iTk8gUFJFRkVSRU5D
RSBVU0VEIj5OT05FPC9uczE6ZXZhbHVhdGVkUHJlZmVyZW5jZT4KICAgICAgICAg
IDxuczE6c3RhdHV0b3J5RXhjZXB0aW9uVG9GYWlyT3Bwb3J0dW5pdHkgZGVzY3Jp
cHRpb249IkZBSVIgT1BQT1JUVU5JVFkgR0lWRU4iPkZBSVI8L25zMTpzdGF0dXRv
cnlFeGNlcHRpb25Ub0ZhaXJPcHBvcnR1bml0eT4KICAgICAgICAgIDxuczE6bnVt
YmVyT2ZPZmZlcnNSZWNlaXZlZD4xPC9uczE6bnVtYmVyT2ZPZmZlcnNSZWNlaXZl
ZD4KICAgICAgICAgIDxuczE6Y29tbWVyY2lhbEl0ZW1BY3F1aXNpdGlvblByb2Nl
ZHVyZXMgZGVzY3JpcHRpb249IkNPTU1FUkNJQUwgSVRFTSI+QTwvbnMxOmNvbW1l
cmNpYWxJdGVtQWNxdWlzaXRpb25Qcm9jZWR1cmVzPgogICAgICAgICAgPG5zMTpj
b21tZXJjaWFsSXRlbVRlc3RQcm9ncmFtIGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMx
OmNvbW1lcmNpYWxJdGVtVGVzdFByb2dyYW0+CiAgICAgICAgICA8bnMxOnNtYWxs
QnVzaW5lc3NDb21wZXRpdGl2ZW5lc3NEZW1vbnN0cmF0aW9uUHJvZ3JhbT5mYWxz
ZTwvbnMxOnNtYWxsQnVzaW5lc3NDb21wZXRpdGl2ZW5lc3NEZW1vbnN0cmF0aW9u
UHJvZ3JhbT4KICAgICAgICAgIDxuczE6QTc2QWN0aW9uIGRlc2NyaXB0aW9uPSJO
TyI+TjwvbnMxOkE3NkFjdGlvbj4KICAgICAgICAgIDxuczE6ZmVkQml6T3BwcyBk
ZXNjcmlwdGlvbj0iTk9UIEFQUExJQ0FCTEUiPlg8L25zMTpmZWRCaXpPcHBzPgog
ICAgICAgICAgPG5zMTpwcmljZUV2YWx1YXRpb25QZXJjZW50RGlmZmVyZW5jZT4w
LjAwPC9uczE6cHJpY2VFdmFsdWF0aW9uUGVyY2VudERpZmZlcmVuY2U+PC9uczE6
Y29tcGV0aXRpb24+CiAgICAgICAgPG5zMTpwcmVmZXJlbmNlUHJvZ3JhbXM+CiAg
ICAgICAgICA8bnMxOnN1YmNvbnRyYWN0UGxhbiBkZXNjcmlwdGlvbj0iUExBTiBO
T1QgUkVRVUlSRUQgIj5CPC9uczE6c3ViY29udHJhY3RQbGFuPjwvbnMxOnByZWZl
cmVuY2VQcm9ncmFtcz4KICAgICAgICA8bnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRp
b24+CiAgICAgICAgICA8bnMxOmNyZWF0ZWRCeT5MSU5EQS5CQVJWSU5DSEFLLkhR
MDQyM0BERkFTLk1JTDwvbnMxOmNyZWF0ZWRCeT4KICAgICAgICAgIDxuczE6Y3Jl
YXRlZERhdGU+MjAwNy0wMS0xNCAxNzozNTowNTwvbnMxOmNyZWF0ZWREYXRlPgog
ICAgICAgICAgPG5zMTpsYXN0TW9kaWZpZWRCeT5JRFZfQ09SUkVDVDwvbnMxOmxh
c3RNb2RpZmllZEJ5PgogICAgICAgICAgPG5zMTpsYXN0TW9kaWZpZWREYXRlPjIw
MTYtMDItMTYgMTM6MTA6MDU8L25zMTpsYXN0TW9kaWZpZWREYXRlPgogICAgICAg
ICAgPG5zMTpzdGF0dXMgZGVzY3JpcHRpb249IkZJTkFMIj5GPC9uczE6c3RhdHVz
PjwvbnMxOnRyYW5zYWN0aW9uSW5mb3JtYXRpb24+PC9uczE6YXdhcmQ+CiAgICA8
L2NvbnRlbnQ+CiAgPC9lbnRyeT4KICA8ZW50cnk+CiAgICA8dGl0bGU+PCFbQ0RB
VEFbTmV3IERFTElWRVJZIE9SREVSIERKREVBRVAwNzAwNTFEIGF3YXJkZWQgdG8g
RExUIFNPTFVUSU9OUyBJTkNPUlBPUkFURUQgZm9yIHRoZSBhbW91bnQgb2YgJDU0
NC4yXV0+PC90aXRsZT4KICAgIDxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJ0
ZXh0L2h0bWwiIGhyZWY9Imh0dHBzOi8vd3d3LmZwZHMuZ292L2V6c2VhcmNoL3Nl
YXJjaC5kbz9zPUZQRFMmYW1wO2luZGV4TmFtZT1hd2FyZGZ1bGwmYW1wO3RlbXBs
YXRlTmFtZT0xLjUuMSZhbXA7cT1ESkRFQUVQMDcwMDUxRCsxNTI0KyI+PC9saW5r
PgogICAgPG1vZGlmaWVkPjIwMTYtMDItMTYgMTM6MTA6MDI8L21vZGlmaWVkPgog
ICAgPGNvbnRlbnQgeG1sbnM6bnMxPSJodHRwczovL3d3dy5mcGRzLmdvdi9GUERT
IiB0eXBlPSJhcHBsaWNhdGlvbi94bWwiPgogICAgICA8bnMxOmF3YXJkIHhtbG5z
Om5zMT0iaHR0cDovL3d3dy5mcGRzbmcuY29tL0ZQRFMiIHZlcnNpb249IjEuMiI+
CiAgICAgICAgPG5zMTphd2FyZElEPgogICAgICAgICAgPG5zMTphd2FyZENvbnRy
YWN0SUQ+CiAgICAgICAgICAgIDxuczE6YWdlbmN5SUQgbmFtZT0iRFJVRyBFTkZP
UkNFTUVOVCBBRE1JTklTVFJBVElPTiI+MTUyNDwvbnMxOmFnZW5jeUlEPgogICAg
ICAgICAgICA8bnMxOlBJSUQ+REpERUFFUDA3MDA1MUQ8L25zMTpQSUlEPgogICAg
ICAgICAgICA8bnMxOm1vZE51bWJlcj4wPC9uczE6bW9kTnVtYmVyPgogICAgICAg
ICAgICA8bnMxOnRyYW5zYWN0aW9uTnVtYmVyPjA8L25zMTp0cmFuc2FjdGlvbk51
bWJlcj48L25zMTphd2FyZENvbnRyYWN0SUQ+CiAgICAgICAgICA8bnMxOnJlZmVy
ZW5jZWRJRFZJRD4KICAgICAgICAgICAgPG5zMTphZ2VuY3lJRCBuYW1lPSJGRURF
UkFMIEFDUVVJU0lUSU9OIFNFUlZJQ0UiPjQ3MzA8L25zMTphZ2VuY3lJRD4KICAg
ICAgICAgICAgPG5zMTpQSUlEPkdTMzVGNDU0M0c8L25zMTpQSUlEPgogICAgICAg
ICAgICA8bnMxOm1vZE51bWJlcj4wPC9uczE6bW9kTnVtYmVyPjwvbnMxOnJlZmVy
ZW5jZWRJRFZJRD48L25zMTphd2FyZElEPgogICAgICAgIDxuczE6cmVsZXZhbnRD
b250cmFjdERhdGVzPgogICAgICAgICAgPG5zMTpzaWduZWREYXRlPjIwMDctMDQt
MjUgMDA6MDA6MDA8L25zMTpzaWduZWREYXRlPgogICAgICAgICAgPG5zMTplZmZl
Y3RpdmVEYXRlPjIwMDctMDQtMjUgMDA6MDA6MDA8L25zMTplZmZlY3RpdmVEYXRl
PgogICAgICAgICAgPG5zMTpjdXJyZW50Q29tcGxldGlvbkRhdGU+MjAwNy0wOS0z
MCAwMDowMDowMDwvbnMxOmN1cnJlbnRDb21wbGV0aW9uRGF0ZT4KICAgICAgICAg
IDxuczE6dWx0aW1hdGVDb21wbGV0aW9uRGF0ZT4yMDA4LTA5LTI5IDAwOjAwOjAw
PC9uczE6dWx0aW1hdGVDb21wbGV0aW9uRGF0ZT48L25zMTpyZWxldmFudENvbnRy
YWN0RGF0ZXM+CiAgICAgICAgPG5zMTpkb2xsYXJWYWx1ZXM+CiAgICAgICAgICA8
bnMxOm9ibGlnYXRlZEFtb3VudD41NDQuMjA8L25zMTpvYmxpZ2F0ZWRBbW91bnQ+
CiAgICAgICAgICA8bnMxOmJhc2VBbmRFeGVyY2lzZWRPcHRpb25zVmFsdWU+NTQ0
LjIwPC9uczE6YmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4KICAgICAgICAg
IDxuczE6YmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT41NDQuMjA8L25zMTpiYXNlQW5k
QWxsT3B0aW9uc1ZhbHVlPjwvbnMxOmRvbGxhclZhbHVlcz4KICAgICAgICA8bnMx
OnRvdGFsRG9sbGFyVmFsdWVzPgogICAgICAgICAgPG5zMTp0b3RhbE9ibGlnYXRl
ZEFtb3VudD41NDQuMjA8L25zMTp0b3RhbE9ibGlnYXRlZEFtb3VudD4KICAgICAg
ICAgIDxuczE6dG90YWxCYXNlQW5kRXhlcmNpc2VkT3B0aW9uc1ZhbHVlPjU0NC4y
MDwvbnMxOnRvdGFsQmFzZUFuZEV4ZXJjaXNlZE9wdGlvbnNWYWx1ZT4KICAgICAg
ICAgIDxuczE6dG90YWxCYXNlQW5kQWxsT3B0aW9uc1ZhbHVlPjU0NC4yMDwvbnMx
OnRvdGFsQmFzZUFuZEFsbE9wdGlvbnNWYWx1ZT48L25zMTp0b3RhbERvbGxhclZh
bHVlcz4KICAgICAgICA8bnMxOnB1cmNoYXNlckluZm9ybWF0aW9uPgogICAgICAg
ICAgPG5zMTpjb250cmFjdGluZ09mZmljZUFnZW5jeUlEIG5hbWU9IkRSVUcgRU5G
T1JDRU1FTlQgQURNSU5JU1RSQVRJT04iIGRlcGFydG1lbnRJRD0iMTUwMCIgZGVw
YXJ0bWVudE5hbWU9IkpVU1RJQ0UsIERFUEFSVE1FTlQgT0YiPjE1MjQ8L25zMTpj
b250cmFjdGluZ09mZmljZUFnZW5jeUlEPgogICAgICAgICAgPG5zMTpjb250cmFj
dGluZ09mZmljZUlEIG5hbWU9IkRJVklTSU9OLUVMIFBBU08gSU5URUxMSUdFTkNF
IENFTlRFUiIgY291bnRyeT0iVVNBIj5ERUFFUDwvbnMxOmNvbnRyYWN0aW5nT2Zm
aWNlSUQ+CiAgICAgICAgICA8bnMxOmZvcmVpZ25GdW5kaW5nIGRlc2NyaXB0aW9u
PSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmZvcmVpZ25GdW5kaW5nPjwvbnMxOnB1
cmNoYXNlckluZm9ybWF0aW9uPgogICAgICAgIDxuczE6Y29udHJhY3RNYXJrZXRp
bmdEYXRhPgogICAgICAgICAgPG5zMTpmZWVQYWlkRm9yVXNlT2ZTZXJ2aWNlPjAu
MDA8L25zMTpmZWVQYWlkRm9yVXNlT2ZTZXJ2aWNlPjwvbnMxOmNvbnRyYWN0TWFy
a2V0aW5nRGF0YT4KICAgICAgICA8bnMxOmNvbnRyYWN0RGF0YT4KICAgICAgICAg
IDxuczE6Y29udHJhY3RBY3Rpb25UeXBlIGRlc2NyaXB0aW9uPSJERUxJVkVSWSBP
UkRFUiI+QzwvbnMxOmNvbnRyYWN0QWN0aW9uVHlwZT4KICAgICAgICAgIDxuczE6
dHlwZU9mQ29udHJhY3RQcmljaW5nIGRlc2NyaXB0aW9uPSJGSVhFRCBQUklDRSI+
SjwvbnMxOnR5cGVPZkNvbnRyYWN0UHJpY2luZz4KICAgICAgICAgIDxuczE6bmF0
aW9uYWxJbnRlcmVzdEFjdGlvbkNvZGUgZGVzY3JpcHRpb249Ik5PTkUiPk5PTkU8
L25zMTpuYXRpb25hbEludGVyZXN0QWN0aW9uQ29kZT4KICAgICAgICAgIDxuczE6
Y29zdEFjY291bnRpbmdTdGFuZGFyZHNDbGF1c2UgZGVzY3JpcHRpb249Ik5PVCBB
UFBMSUNBQkxFIEVYRU1QVCBGUk9NIENBUyI+WDwvbnMxOmNvc3RBY2NvdW50aW5n
U3RhbmRhcmRzQ2xhdXNlPgogICAgICAgICAgPG5zMTpkZXNjcmlwdGlvbk9mQ29u
dHJhY3RSZXF1aXJlbWVudD5SRU5FV0FMIE9GIFNPRlRXQVJFIE1BSU5URU5BTkNF
IEFORCBURUNITklDQUwgU1VQUE9SVCBGT1IgS05PV0xFREdFIFhQRVJUIEZPUiBQ
TC9TUUwgREVWRUxPUE1FTlQuIEVTU0VOVElBTCBUTyBFSVMgU09GVFdBUkUgQVBQ
TElDQVRJT048L25zMTpkZXNjcmlwdGlvbk9mQ29udHJhY3RSZXF1aXJlbWVudD4K
ICAgICAgICAgIDxuczE6R0ZFLUdGUCBkZXNjcmlwdGlvbj0iVHJhbnNhY3Rpb24g
ZG9lcyBub3QgdXNlIEdGRS9HRlAiPk48L25zMTpHRkUtR0ZQPgogICAgICAgICAg
PG5zMTp1bmRlZmluaXRpemVkQWN0aW9uIGRlc2NyaXB0aW9uPSJOTyI+WDwvbnMx
OnVuZGVmaW5pdGl6ZWRBY3Rpb24+CiAgICAgICAgICA8bnMxOmNvbnNvbGlkYXRl
ZENvbnRyYWN0IGRlc2NyaXB0aW9uPSJOTyI+TjwvbnMxOmNvbnNvbGlkYXRlZENv
bnRyYWN0PgogICAgICAgICAgPG5zMTpwZXJmb3JtYW5jZUJhc2VkU2VydmljZUNv
bnRyYWN0IGRlc2NyaXB0aW9uPSJOTyAtIFNFUlZJQ0UgV0hFUkUgUEJBIElTIE5P
VCBVU0VELiI+TjwvbnMxOnBlcmZvcm1hbmNlQmFzZWRTZXJ2aWNlQ29udHJhY3Q+
CiAgICAgICAgICA8bnMxOm11bHRpWWVhckNvbnRyYWN0IGRlc2NyaXB0aW9uPSJO
TyI+TjwvbnMxOm11bHRpWWVhckNvbnRyYWN0PgogICAgICAgICAgPG5zMTpwdXJj
aGFzZUNhcmRBc1BheW1lbnRNZXRob2QgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6
cHVyY2hhc2VDYXJkQXNQYXltZW50TWV0aG9kPgogICAgICAgICAgPG5zMTpudW1i
ZXJPZkFjdGlvbnM+MTwvbnMxOm51bWJlck9mQWN0aW9ucz48L25zMTpjb250cmFj
dERhdGE+CiAgICAgICAgPG5zMTpsZWdpc2xhdGl2ZU1hbmRhdGVzPgogICAgICAg
ICAgPG5zMTpDbGluZ2VyQ29oZW5BY3QgZGVzY3JpcHRpb249Ik5PIj5OPC9uczE6
Q2xpbmdlckNvaGVuQWN0PgogICAgICAgICAgPG5zMTptYXRlcmlhbHNTdXBwbGll
c0FydGljbGVzRXF1aXBtZW50IGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+
WDwvbnMxOm1hdGVyaWFsc1N1cHBsaWVzQXJ0aWNsZXNFcXVpcG1lbnQ+CiAgICAg
ICAgICA8bnMxOmxhYm9yU3RhbmRhcmRzIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElD
QUJMRSI+WDwvbnMxOmxhYm9yU3RhbmRhcmRzPgogICAgICAgICAgPG5zMTpjb25z
dHJ1Y3Rpb25XYWdlUmF0ZVJlcXVpcmVtZW50cyBkZXNjcmlwdGlvbj0iTk9UIEFQ
UExJQ0FCTEUiPlg8L25zMTpjb25zdHJ1Y3Rpb25XYWdlUmF0ZVJlcXVpcmVtZW50
cz4KICAgICAgICAgIDxuczE6bGlzdE9mQWRkaXRpb25hbFJlcG9ydGluZ1ZhbHVl
cz48L25zMTpsaXN0T2ZBZGRpdGlvbmFsUmVwb3J0aW5nVmFsdWVzPgogICAgICAg
ICAgPG5zMTppbnRlcmFnZW5jeUNvbnRyYWN0aW5nQXV0aG9yaXR5IGRlc2NyaXB0
aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmludGVyYWdlbmN5Q29udHJhY3Rp
bmdBdXRob3JpdHk+PC9uczE6bGVnaXNsYXRpdmVNYW5kYXRlcz4KICAgICAgICA8
bnMxOnByb2R1Y3RPclNlcnZpY2VJbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6
cHJvZHVjdE9yU2VydmljZUNvZGUgZGVzY3JpcHRpb249IkFEUCBCQUNLVVAgQU5E
IFNFQ1VSSVRZIFNFUlZJQ0VTIiBwcm9kdWN0T3JTZXJ2aWNlVHlwZT0iU0VSVklD
RSI+RDMxMDwvbnMxOnByb2R1Y3RPclNlcnZpY2VDb2RlPgogICAgICAgICAgPG5z
MTpjb250cmFjdEJ1bmRsaW5nIGRlc2NyaXB0aW9uPSJOT1QgQSBCVU5ETEVEIFJF
UVVJUkVNRU5UIj5EPC9uczE6Y29udHJhY3RCdW5kbGluZz4KICAgICAgICAgIDxu
czE6cHJpbmNpcGFsTkFJQ1NDb2RlIGRlc2NyaXB0aW9uPSJPVEhFUiBDT01QVVRF
UiBSRUxBVEVEIFNFUlZJQ0VTIj41NDE1MTk8L25zMTpwcmluY2lwYWxOQUlDU0Nv
ZGU+CiAgICAgICAgICA8bnMxOnVzZU9mRVBBRGVzaWduYXRlZFByb2R1Y3RzIGRl
c2NyaXB0aW9uPSJOT1QgUkVRVUlSRUQiPkU8L25zMTp1c2VPZkVQQURlc2lnbmF0
ZWRQcm9kdWN0cz48L25zMTpwcm9kdWN0T3JTZXJ2aWNlSW5mb3JtYXRpb24+CiAg
ICAgICAgPG5zMTp2ZW5kb3I+CiAgICAgICAgICA8bnMxOnZlbmRvckhlYWRlcj4K
ICAgICAgICAgICAgPG5zMTp2ZW5kb3JOYW1lPkRMVCBTT0xVVElPTlMgSU5DT1JQ
T1JBVEVEPC9uczE6dmVuZG9yTmFtZT48L25zMTp2ZW5kb3JIZWFkZXI+CiAgICAg
ICAgICA8bnMxOnZlbmRvclNpdGVEZXRhaWxzPgogICAgICAgICAgICA8bnMxOnZl
bmRvclNvY2lvRWNvbm9taWNJbmRpY2F0b3JzPgogICAgICAgICAgICAgIDxuczE6
aXNBbGFza2FuTmF0aXZlT3duZWRDb3Jwb3JhdGlvbk9yRmlybT5mYWxzZTwvbnMx
OmlzQWxhc2thbk5hdGl2ZU93bmVkQ29ycG9yYXRpb25PckZpcm0+CiAgICAgICAg
ICAgICAgPG5zMTppc0FtZXJpY2FuSW5kaWFuT3duZWQ+ZmFsc2U8L25zMTppc0Ft
ZXJpY2FuSW5kaWFuT3duZWQ+CiAgICAgICAgICAgICAgPG5zMTppc0luZGlhblRy
aWJlPmZhbHNlPC9uczE6aXNJbmRpYW5UcmliZT4KICAgICAgICAgICAgICA8bnMx
OmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT5mYWxzZTwv
bnMxOmlzTmF0aXZlSGF3YWlpYW5Pd25lZE9yZ2FuaXphdGlvbk9yRmlybT4KICAg
ICAgICAgICAgICA8bnMxOmlzVHJpYmFsbHlPd25lZEZpcm0+ZmFsc2U8L25zMTpp
c1RyaWJhbGx5T3duZWRGaXJtPgogICAgICAgICAgICAgIDxuczE6aXNWZXRlcmFu
T3duZWQ+ZmFsc2U8L25zMTppc1ZldGVyYW5Pd25lZD4KICAgICAgICAgICAgICA8
bnMxOmlzU2VydmljZVJlbGF0ZWREaXNhYmxlZFZldGVyYW5Pd25lZEJ1c2luZXNz
PmZhbHNlPC9uczE6aXNTZXJ2aWNlUmVsYXRlZERpc2FibGVkVmV0ZXJhbk93bmVk
QnVzaW5lc3M+CiAgICAgICAgICAgICAgPG5zMTppc1dvbWVuT3duZWQ+ZmFsc2U8
L25zMTppc1dvbWVuT3duZWQ+CiAgICAgICAgICAgICAgPG5zMTptaW5vcml0eU93
bmVkPgogICAgICAgICAgICAgICAgPG5zMTppc01pbm9yaXR5T3duZWQ+ZmFsc2U8
L25zMTppc01pbm9yaXR5T3duZWQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzU3Vi
Q29udGluZW50QXNpYW5BbWVyaWNhbk93bmVkQnVzaW5lc3M+ZmFsc2U8L25zMTpp
c1N1YkNvbnRpbmVudEFzaWFuQW1lcmljYW5Pd25lZEJ1c2luZXNzPgogICAgICAg
ICAgICAgICAgPG5zMTppc0FzaWFuUGFjaWZpY0FtZXJpY2FuT3duZWRCdXNpbmVz
cz5mYWxzZTwvbnMxOmlzQXNpYW5QYWNpZmljQW1lcmljYW5Pd25lZEJ1c2luZXNz
PgogICAgICAgICAgICAgICAgPG5zMTppc0JsYWNrQW1lcmljYW5Pd25lZEJ1c2lu
ZXNzPmZhbHNlPC9uczE6aXNCbGFja0FtZXJpY2FuT3duZWRCdXNpbmVzcz4KICAg
ICAgICAgICAgICAgIDxuczE6aXNIaXNwYW5pY0FtZXJpY2FuT3duZWRCdXNpbmVz
cz5mYWxzZTwvbnMxOmlzSGlzcGFuaWNBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAg
ICAgICAgICAgICAgICA8bnMxOmlzTmF0aXZlQW1lcmljYW5Pd25lZEJ1c2luZXNz
PmZhbHNlPC9uczE6aXNOYXRpdmVBbWVyaWNhbk93bmVkQnVzaW5lc3M+CiAgICAg
ICAgICAgICAgICA8bnMxOmlzT3RoZXJNaW5vcml0eU93bmVkPmZhbHNlPC9uczE6
aXNPdGhlck1pbm9yaXR5T3duZWQ+PC9uczE6bWlub3JpdHlPd25lZD4KICAgICAg
ICAgICAgICA8bnMxOmlzVmVyeVNtYWxsQnVzaW5lc3M+ZmFsc2U8L25zMTppc1Zl
cnlTbWFsbEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNXb21lbk93bmVk
U21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzV29tZW5Pd25lZFNtYWxsQnVzaW5l
c3M+CiAgICAgICAgICAgICAgPG5zMTppc0Vjb25vbWljYWxseURpc2FkdmFudGFn
ZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMxOmlzRWNvbm9taWNh
bGx5RGlzYWR2YW50YWdlZFdvbWVuT3duZWRTbWFsbEJ1c2luZXNzPgogICAgICAg
ICAgICAgIDxuczE6aXNKb2ludFZlbnR1cmVXb21lbk93bmVkU21hbGxCdXNpbmVz
cz5mYWxzZTwvbnMxOmlzSm9pbnRWZW50dXJlV29tZW5Pd25lZFNtYWxsQnVzaW5l
c3M+CiAgICAgICAgICAgICAgPG5zMTppc0pvaW50VmVudHVyZUVjb25vbWljYWxs
eURpc2FkdmFudGFnZWRXb21lbk93bmVkU21hbGxCdXNpbmVzcz5mYWxzZTwvbnMx
OmlzSm9pbnRWZW50dXJlRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZFdvbWVuT3du
ZWRTbWFsbEJ1c2luZXNzPjwvbnMxOnZlbmRvclNvY2lvRWNvbm9taWNJbmRpY2F0
b3JzPgogICAgICAgICAgICA8bnMxOnZlbmRvckJ1c2luZXNzVHlwZXM+CiAgICAg
ICAgICAgICAgPG5zMTppc0NvbW11bml0eURldmVsb3BlZENvcnBvcmF0aW9uT3du
ZWRGaXJtPmZhbHNlPC9uczE6aXNDb21tdW5pdHlEZXZlbG9wZWRDb3Jwb3JhdGlv
bk93bmVkRmlybT4KICAgICAgICAgICAgICA8bnMxOmlzTGFib3JTdXJwbHVzQXJl
YUZpcm0+ZmFsc2U8L25zMTppc0xhYm9yU3VycGx1c0FyZWFGaXJtPgogICAgICAg
ICAgICAgIDxuczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8
bnMxOmlzRmVkZXJhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0ZlZGVyYWxHb3Zl
cm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0ZlZGVyYWxseUZ1bmRlZFJl
c2VhcmNoQW5kRGV2ZWxvcG1lbnRDb3JwPmZhbHNlPC9uczE6aXNGZWRlcmFsbHlG
dW5kZWRSZXNlYXJjaEFuZERldmVsb3BtZW50Q29ycD4KICAgICAgICAgICAgICAg
IDxuczE6aXNGZWRlcmFsR292ZXJubWVudEFnZW5jeT5mYWxzZTwvbnMxOmlzRmVk
ZXJhbEdvdmVybm1lbnRBZ2VuY3k+PC9uczE6ZmVkZXJhbEdvdmVybm1lbnQ+CiAg
ICAgICAgICAgICAgPG5zMTppc1N0YXRlR292ZXJubWVudD5mYWxzZTwvbnMxOmlz
U3RhdGVHb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6bG9jYWxHb3Zlcm5t
ZW50PgogICAgICAgICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJubWVudD5mYWxz
ZTwvbnMxOmlzTG9jYWxHb3Zlcm5tZW50PgogICAgICAgICAgICAgICAgPG5zMTpp
c0NpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc0NpdHlMb2NhbEdvdmVy
bm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ291bnR5TG9jYWxHb3Zlcm5t
ZW50PmZhbHNlPC9uczE6aXNDb3VudHlMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAg
ICAgICAgICA8bnMxOmlzSW50ZXJNdW5pY2lwYWxMb2NhbEdvdmVybm1lbnQ+ZmFs
c2U8L25zMTppc0ludGVyTXVuaWNpcGFsTG9jYWxHb3Zlcm5tZW50PgogICAgICAg
ICAgICAgICAgPG5zMTppc0xvY2FsR292ZXJubWVudE93bmVkPmZhbHNlPC9uczE6aXNM
b2NhbEdvdmVybm1lbnRPd25lZD4KICAgICAgICAgICAgICAgIDxuczE6aXNNdW5p
Y2lwYWxpdHlMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc011bmljaXBhbGl0
eUxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICAgIDxuczE6aXNTY2hvb2xE
aXN0cmljdExvY2FsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzU2Nob29sRGlzdHJp
Y3RMb2NhbEdvdmVybm1lbnQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzVG93bnNo
aXBMb2NhbEdvdmVybm1lbnQ+ZmFsc2U8L25zMTppc1Rvd25zaGlwTG9jYWxHb3Zl
cm5tZW50PjwvbnMxOmxvY2FsR292ZXJubWVudD4KICAgICAgICAgICAgICA8bnMx
OmlzVHJpYmFsR292ZXJubWVudD5mYWxzZTwvbnMxOmlzVHJpYmFsR292ZXJubWVu
dD4KICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbkdvdmVybm1lbnQ+ZmFsc2U8
L25zMTppc0ZvcmVpZ25Hb3Zlcm5tZW50PgogICAgICAgICAgICAgIDxuczE6YnVz
aW5lc3NPck9yZ2FuaXphdGlvblR5cGU+CiAgICAgICAgICAgICAgICA8bnMxOmlz
Q29ycG9yYXRlRW50aXR5Tm90VGF4RXhlbXB0PmZhbHNlPC9uczE6aXNDb3Jwb3Jh
dGVFbnRpdHlOb3RUYXhFeGVtcHQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzQ29y
cG9yYXRlRW50aXR5VGF4RXhlbXB0PmZhbHNlPC9uczE6aXNDb3Jwb3JhdGVFbnRp
dHlUYXhFeGVtcHQ+CiAgICAgICAgICAgICAgICA8bnMxOmlzUGFydG5lcnNoaXBP
ckxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcD5mYWxzZTwvbnMxOmlzUGFydG5l
cnNoaXBPckxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcD4KICAgICAgICAgICAg
ICAgIDxuczE6aXNTb2xlUHJvcHJlaXRvcnNoaXA+ZmFsc2U8L25zMTppc1NvbGVQ
cm9wcmVpdG9yc2hpcD4KICAgICAgICAgICAgICAgIDxuczE6aXNTbWFsbEFncmlj
dWx0dXJhbENvb3BlcmF0aXZlPmZhbHNlPC9uczE6aXNTbWFsbEFncmljdWx0dXJh
bENvb3BlcmF0aXZlPgogICAgICAgICAgICAgICAgPG5zMTppc0ludGVybmF0aW9u
YWxPcmdhbml6YXRpb24+ZmFsc2U8L25zMTppc0ludGVybmF0aW9uYWxPcmdhbml6
YXRpb24+CiAgICAgICAgICAgICAgICA8bnMxOmlzVVNHb3Zlcm5tZW50RW50aXR5
PmZhbHNlPC9uczE6aXNVU0dvdmVybm1lbnRFbnRpdHk+PC9uczE6YnVzaW5lc3NP
ck9yZ2FuaXphdGlvblR5cGU+PC9uczE6dmVuZG9yQnVzaW5lc3NUeXBlcz4KICAg
ICAgICAgICAgPG5zMTp2ZW5kb3JMaW5lT2ZCdXNpbmVzcz4KICAgICAgICAgICAg
ICA8bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcG1lbnRDb3Jwb3JhdGlvbj5mYWxzZTwv
bnMxOmlzQ29tbXVuaXR5RGV2ZWxvcG1lbnRDb3Jwb3JhdGlvbj4KICAgICAgICAg
ICAgICA8bnMxOmlzRG9tZXN0aWNTaGVsdGVyPmZhbHNlPC9uczE6aXNEb21lc3Rp
Y1NoZWx0ZXI+CiAgICAgICAgICAgICAgPG5zMTppc0VkdWNhdGlvbmFsSW5zdGl0
dXRpb24+ZmFsc2U8L25zMTppc0VkdWNhdGlvbmFsSW5zdGl0dXRpb24+CiAgICAg
ICAgICAgICAgPG5zMTppc0ZvdW5kYXRpb24+ZmFsc2U8L25zMTppc0ZvdW5kYXRp
b24+CiAgICAgICAgICAgICAgPG5zMTppc0hvc3BpdGFsPmZhbHNlPC9uczE6aXNI
b3NwaXRhbD4KICAgICAgICAgICAgICA8bnMxOmlzTWFudWZhY3R1cmVyT2ZHb29k
cz5mYWxzZTwvbnMxOmlzTWFudWZhY3R1cmVyT2ZHb29kcz4KICAgICAgICAgICAg
ICA8bnMxOmlzVmV0ZXJpbmFyeUhvc3BpdGFsPmZhbHNlPC9uczE6aXNWZXRlcmlu
YXJ5SG9zcGl0YWw+CiAgICAgICAgICAgICAgPG5zMTppc0hpc3BhbmljU2Vydmlj
aW5nSW5zdGl0dXRpb24+ZmFsc2U8L25zMTppc0hpc3BhbmljU2VydmljaW5nSW5z
dGl0dXRpb24+PC9uczE6dmVuZG9yTGluZU9mQnVzaW5lc3M+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yUmVsYXRpb25zaGlwV2l0aEZlZGVyYWxHb3Zlcm5tZW50Pgog
ICAgICAgICAgICAgIDxuczE6cmVjZWl2ZXNDb250cmFjdHM+ZmFsc2U8L25zMTpy
ZWNlaXZlc0NvbnRyYWN0cz4KICAgICAgICAgICAgICA8bnMxOnJlY2VpdmVzR3Jh
bnRzPmZhbHNlPC9uczE6cmVjZWl2ZXNHcmFudHM+CiAgICAgICAgICAgICAgPG5z
MTpyZWNlaXZlc0NvbnRyYWN0c0FuZEdyYW50cz5mYWxzZTwvbnMxOnJlY2VpdmVz
Q29udHJhY3RzQW5kR3JhbnRzPjwvbnMxOnZlbmRvclJlbGF0aW9uc2hpcFdpdGhG
ZWRlcmFsR292ZXJubWVudD4KICAgICAgICAgICAgPG5zMTp0eXBlT2ZHb3Zlcm5t
ZW50RW50aXR5PgogICAgICAgICAgICAgIDxuczE6aXNBaXJwb3J0QXV0aG9yaXR5
PmZhbHNlPC9uczE6aXNBaXJwb3J0QXV0aG9yaXR5PgogICAgICAgICAgICAgIDxu
czE6aXNDb3VuY2lsT2ZHb3Zlcm5tZW50cz5mYWxzZTwvbnMxOmlzQ291bmNpbE9m
R292ZXJubWVudHM+CiAgICAgICAgICAgICAgPG5zMTppc0hvdXNpbmdBdXRob3Jp
dGllc1B1YmxpY09yVHJpYmFsPmZhbHNlPC9uczE6aXNIb3VzaW5nQXV0aG9yaXRp
ZXNQdWJsaWNPclRyaWJhbD4KICAgICAgICAgICAgICA8bnMxOmlzSW50ZXJzdGF0
ZUVudGl0eT5mYWxzZTwvbnMxOmlzSW50ZXJzdGF0ZUVudGl0eT4KICAgICAgICAg
ICAgICA8bnMxOmlzUGxhbm5pbmdDb21taXNzaW9uPmZhbHNlPC9uczE6aXNQbGFu
bmluZ0NvbW1pc3Npb24+CiAgICAgICAgICAgICAgPG5zMTppc1BvcnRBdXRob3Jp
dHk+ZmFsc2U8L25zMTppc1BvcnRBdXRob3JpdHk+CiAgICAgICAgICAgICAgPG5z
MTppc1RyYW5zaXRBdXRob3JpdHk+ZmFsc2U8L25zMTppc1RyYW5zaXRBdXRob3Jp
dHk+PC9uczE6dHlwZU9mR292ZXJubWVudEVudGl0eT4KICAgICAgICAgICAgPG5z
MTp2ZW5kb3JPcmdhbml6YXRpb25GYWN0b3JzPgogICAgICAgICAgICAgIDxuczE6
aXNTdWJjaGFwdGVyU0NvcnBvcmF0aW9uPmZhbHNlPC9uczE6aXNTdWJjaGFwdGVy
U0NvcnBvcmF0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNMaW1pdGVkTGlhYmls
aXR5Q29ycG9yYXRpb24+ZmFsc2U8L25zMTppc0xpbWl0ZWRMaWFiaWxpdHlDb3Jw
b3JhdGlvbj4KICAgICAgICAgICAgICA8bnMxOmlzRm9yZWlnbk93bmVkQW5kTG9j
YXRlZD5mYWxzZTwvbnMxOmlzRm9yZWlnbk93bmVkQW5kTG9jYXRlZD4KICAgICAg
ICAgICAgICA8bnMxOnByb2ZpdFN0cnVjdHVyZT4KICAgICAgICAgICAgICAgIDxu
czE6aXNGb3JQcm9maXRPcmdhbml6YXRpb24+ZmFsc2U8L25zMTppc0ZvclByb2Zp
dE9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxuczE6aXNOb25wcm9maXRP
cmdhbml6YXRpb24+ZmFsc2U8L25zMTppc05vbnByb2ZpdE9yZ2FuaXphdGlvbj4K
ICAgICAgICAgICAgICAgIDxuczE6aXNPdGhlck5vdEZvclByb2ZpdE9yZ2FuaXph
dGlvbj5mYWxzZTwvbnMxOmlzT3RoZXJOb3RGb3JQcm9maXRPcmdhbml6YXRpb24+
PC9uczE6cHJvZml0U3RydWN0dXJlPgogICAgICAgICAgICAgIDxuczE6aXNTaGVs
dGVyZWRXb3Jrc2hvcD5mYWxzZTwvbnMxOmlzU2hlbHRlcmVkV29ya3Nob3A+CiAg
ICAgICAgICAgICAgPG5zMTpudW1iZXJPZkVtcGxveWVlcz4xNzM8L25zMTpudW1i
ZXJPZkVtcGxveWVlcz4KICAgICAgICAgICAgICA8bnMxOmFubnVhbFJldmVudWU+
MjY8L25zMTphbm51YWxSZXZlbnVlPjwvbnMxOnZlbmRvck9yZ2FuaXphdGlvbkZh
Y3RvcnM+CiAgICAgICAgICAgIDxuczE6dHlwZU9mRWR1Y2F0aW9uYWxFbnRpdHk+
CiAgICAgICAgICAgICAgPG5zMTppczE4NjJMYW5kR3JhbnRDb2xsZWdlPmZhbHNl
PC9uczE6aXMxODYyTGFuZEdyYW50Q29sbGVnZT4KICAgICAgICAgICAgICA8bnMx
OmlzMTg5MExhbmRHcmFudENvbGxlZ2U+ZmFsc2U8L25zMTppczE4OTBMYW5kR3Jh
bnRDb2xsZWdlPgogICAgICAgICAgICAgIDxuczE6aXMxOTk0TGFuZEdyYW50Q29s
bGVnZT5mYWxzZTwvbnMxOmlzMTk5NExhbmRHcmFudENvbGxlZ2U+CiAgICAgICAg
ICAgICAgPG5zMTppc0hpc3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0
eT5mYWxzZTwvbnMxOmlzSGlzdG9yaWNhbGx5QmxhY2tDb2xsZWdlT3JVbml2ZXJz
aXR5PgogICAgICAgICAgICAgIDxuczE6aXNNaW5vcml0eUluc3RpdHV0aW9uPmZh
bHNlPC9uczE6aXNNaW5vcml0eUluc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxu
czE6aXNQcml2YXRlVW5pdmVyc2l0eU9yQ29sbGVnZT5mYWxzZTwvbnMxOmlzUHJp
dmF0ZVVuaXZlcnNpdHlPckNvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc1Nj
aG9vbE9mRm9yZXN0cnk+ZmFsc2U8L25zMTppc1NjaG9vbE9mRm9yZXN0cnk+CiAg
ICAgICAgICAgICAgPG5zMTppc1N0YXRlQ29udHJvbGxlZEluc3RpdHV0aW9ub2ZI
aWdoZXJMZWFybmluZz5mYWxzZTwvbnMxOmlzU3RhdGVDb250cm9sbGVkSW5zdGl0
dXRpb25vZkhpZ2hlckxlYXJuaW5nPgogICAgICAgICAgICAgIDxuczE6aXNUcmli
YWxDb2xsZWdlPmZhbHNlPC9uczE6aXNUcmliYWxDb2xsZWdlPgogICAgICAgICAg
ICAgIDxuczE6aXNWZXRlcmluYXJ5Q29sbGVnZT5mYWxzZTwvbnMxOmlzVmV0ZXJp
bmFyeUNvbGxlZ2U+CiAgICAgICAgICAgICAgPG5zMTppc0FsYXNrYW5OYXRpdmVT
ZXJ2aWNpbmdJbnN0aXR1dGlvbj5mYWxzZTwvbnMxOmlzQWxhc2thbk5hdGl2ZVNl
cnZpY2luZ0luc3RpdHV0aW9uPgogICAgICAgICAgICAgIDxuczE6aXNOYXRpdmVI
YXdhaWlhblNlcnZpY2luZ0luc3RpdHV0aW9uPmZhbHNlPC9uczE6aXNOYXRpdmVI
YXdhaWlhblNlcnZpY2luZ0luc3RpdHV0aW9uPjwvbnMxOnR5cGVPZkVkdWNhdGlv
bmFsRW50aXR5PgogICAgICAgICAgICA8bnMxOnZlbmRvckNlcnRpZmljYXRpb25z
PgogICAgICAgICAgICAgIDxuczE6aXNET1RDZXJ0aWZpZWREaXNhZHZhbnRhZ2Vk
QnVzaW5lc3NFbnRlcnByaXNlPmZhbHNlPC9uczE6aXNET1RDZXJ0aWZpZWREaXNh
ZHZhbnRhZ2VkQnVzaW5lc3NFbnRlcnByaXNlPgogICAgICAgICAgICAgIDxuczE6
aXNTZWxmQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3M+ZmFsc2U8
L25zMTppc1NlbGZDZXJ0aWZpZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzcz4K
ICAgICAgICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkU21hbGxEaXNhZHZhbnRh
Z2VkQnVzaW5lc3M+ZmFsc2U8L25zMTppc1NCQUNlcnRpZmllZFNtYWxsRGlzYWR2
YW50YWdlZEJ1c2luZXNzPgogICAgICAgICAgICAgIDxuczE6aXNTQkFDZXJ0aWZp
ZWQ4QVByb2dyYW1QYXJ0aWNpcGFudD5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVk
OEFQcm9ncmFtUGFydGljaXBhbnQ+CiAgICAgICAgICAgICAgPG5zMTppc1NlbGZD
ZXJ0aWZpZWRIVUJab25lSm9pbnRWZW50dXJlPmZhbHNlPC9uczE6aXNTZWxmQ2Vy
dGlmaWVkSFVCWm9uZUpvaW50VmVudHVyZT4KICAgICAgICAgICAgICA8bnMxOmlz
U0JBQ2VydGlmaWVkSFVCWm9uZT5mYWxzZTwvbnMxOmlzU0JBQ2VydGlmaWVkSFVC
Wm9uZT4KICAgICAgICAgICAgICA8bnMxOmlzU0JBQ2VydGlmaWVkOEFKb2ludFZl
bnR1cmU+ZmFsc2U8L25zMTppc1NCQUNlcnRpZmllZDhBSm9pbnRWZW50dXJlPjwv
bnMxOnZlbmRvckNlcnRpZmljYXRpb25zPgogICAgICAgICAgICA8bnMxOnZlbmRv
ckxvY2F0aW9uPgogICAgICAgICAgICAgIDxuczE6c3RyZWV0QWRkcmVzcz4xMzg2
MSBTVU5SSVNFIFZBTExFWSBEUiBTVEUgNDAwPC9uczE6c3RyZWV0QWRkcmVzcz4K
ICAgICAgICAgICAgICA8bnMxOmNpdHk+SEVSTkRPTjwvbnMxOmNpdHk+CiAgICAg
ICAgICAgICAgPG5zMTpzdGF0ZSBuYW1lPSJWSVJHSU5JQSI+VkE8L25zMTpzdGF0
ZT4KICAgICAgICAgICAgICA8bnMxOlpJUENvZGU+MjAxNzE2MTI2PC9uczE6WklQ
Q29kZT4KICAgICAgICAgICAgICA8bnMxOmNvdW50cnlDb2RlIG5hbWU9IlVOSVRF
RCBTVEFURVMiPlVTQTwvbnMxOmNvdW50cnlDb2RlPgogICAgICAgICAgICAgIDxu
czE6Y29uZ3Jlc3Npb25hbERpc3RyaWN0Q29kZT4xMDwvbnMxOmNvbmdyZXNzaW9u
YWxEaXN0cmljdENvZGU+PC9uczE6dmVuZG9yTG9jYXRpb24+CiAgICAgICAgICAg
IDxuczE6dmVuZG9yU2l0ZUNvZGU+Nzg2NDY4MTk5MDAwMFBSPC9uczE6dmVuZG9y
U2l0ZUNvZGU+CiAgICAgICAgICAgIDxuczE6dmVuZG9yQWx0ZXJuYXRlU2l0ZUNv
ZGU+MjAxNzE2MTI2PC9uczE6dmVuZG9yQWx0ZXJuYXRlU2l0ZUNvZGU+CiAgICAg
ICAgICAgIDxuczE6dmVuZG9yRFVOU0luZm9ybWF0aW9uPgogICAgICAgICAgICAg
IDxuczE6RFVOU051bWJlcj43ODY0NjgxOTk8L25zMTpEVU5TTnVtYmVyPgogICAg
ICAgICAgICAgIDxuczE6dmVuZG9yTmFtZT5ETFQgU09MVVRJT05TIElOQ09SUE9S
QVRFRDwvbnMxOnZlbmRvck5hbWU+CiAgICAgICAgICAgICAgPG5zMTpnbG9iYWxQ
YXJlbnREVU5TTnVtYmVyPjc4NjQ2ODE5OTwvbnMxOmdsb2JhbFBhcmVudERVTlNO
dW1iZXI+CiAgICAgICAgICAgICAgPG5zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT5E
TFQgU09MVVRJT05TICBMTEM8L25zMTpnbG9iYWxQYXJlbnREVU5TTmFtZT48L25z
MTp2ZW5kb3JEVU5TSW5mb3JtYXRpb24+CiAgICAgICAgICAgIDxuczE6Y2NyUmVn
aXN0cmF0aW9uRGV0YWlscz4KICAgICAgICAgICAgICA8bnMxOnJlZ2lzdHJhdGlv
bkRhdGU+MjAwMi0wMy0xNCAwMDowMDowMDwvbnMxOnJlZ2lzdHJhdGlvbkRhdGU+
CiAgICAgICAgICAgICAgPG5zMTpyZW5ld2FsRGF0ZT4yMDA4LTExLTE2IDAwOjAw
OjAwPC9uczE6cmVuZXdhbERhdGU+PC9uczE6Y2NyUmVnaXN0cmF0aW9uRGV0YWls
cz48L25zMTp2ZW5kb3JTaXRlRGV0YWlscz4KICAgICAgICAgIDxuczE6Y29udHJh
Y3RpbmdPZmZpY2VyQnVzaW5lc3NTaXplRGV0ZXJtaW5hdGlvbiBkZXNjcmlwdGlv
bj0iU01BTEwgQlVTSU5FU1MiPlM8L25zMTpjb250cmFjdGluZ09mZmljZXJCdXNp
bmVzc1NpemVEZXRlcm1pbmF0aW9uPjwvbnMxOnZlbmRvcj4KICAgICAgICA8bnMx
OnBsYWNlT2ZQZXJmb3JtYW5jZT4KICAgICAgICAgIDxuczE6cHJpbmNpcGFsUGxh
Y2VPZlBlcmZvcm1hbmNlPgogICAgICAgICAgICA8bnMxOmxvY2F0aW9uQ29kZT4y
NDAwMDwvbnMxOmxvY2F0aW9uQ29kZT4KICAgICAgICAgICAgPG5zMTpzdGF0ZUNv
ZGUgbmFtZT0iVEVYQVMiPlRYPC9uczE6c3RhdGVDb2RlPgogICAgICAgICAgICA8
bnMxOmNvdW50cnlDb2RlIG5hbWU9IlVOSVRFRCBTVEFURVMiPlVTQTwvbnMxOmNv
dW50cnlDb2RlPjwvbnMxOnByaW5jaXBhbFBsYWNlT2ZQZXJmb3JtYW5jZT4KICAg
ICAgICAgIDxuczE6cGxhY2VPZlBlcmZvcm1hbmNlWklQQ29kZSBjb3VudHk9IkVM
IFBBU08iIGNpdHk9IkVMIFBBU08iPjc5OTA4ODA5ODwvbnMxOnBsYWNlT2ZQZXJm
b3JtYW5jZVpJUENvZGU+CiAgICAgICAgICA8bnMxOnBsYWNlT2ZQZXJmb3JtYW5j
ZUNvbmdyZXNzaW9uYWxEaXN0cmljdD4xNjwvbnMxOnBsYWNlT2ZQZXJmb3JtYW5j
ZUNvbmdyZXNzaW9uYWxEaXN0cmljdD48L25zMTpwbGFjZU9mUGVyZm9ybWFuY2U+
CiAgICAgICAgPG5zMTpjb21wZXRpdGlvbj4KICAgICAgICAgIDxuczE6c29saWNp
dGF0aW9uUHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iU0lNUExJRklFRCBBQ1FVSVNJ
VElPTiI+U1AxPC9uczE6c29saWNpdGF0aW9uUHJvY2VkdXJlcz4KICAgICAgICAg
IDxuczE6dHlwZU9mU2V0QXNpZGUgZGVzY3JpcHRpb249Ik5PIFNFVCBBU0lERSBV
U0VELiI+Tk9ORTwvbnMxOnR5cGVPZlNldEFzaWRlPgogICAgICAgICAgPG5zMTpl
dmFsdWF0ZWRQcmVmZXJlbmNlIGRlc2NyaXB0aW9uPSJOTyBQUkVGRVJFTkNFIFVT
RUQiPk5PTkU8L25zMTpldmFsdWF0ZWRQcmVmZXJlbmNlPgogICAgICAgICAgPG5z
MTpudW1iZXJPZk9mZmVyc1JlY2VpdmVkPjE8L25zMTpudW1iZXJPZk9mZmVyc1Jl
Y2VpdmVkPgogICAgICAgICAgPG5zMTpjb21tZXJjaWFsSXRlbUFjcXVpc2l0aW9u
UHJvY2VkdXJlcyBkZXNjcmlwdGlvbj0iQ09NTUVSQ0lBTCBJVEVNIj5BPC9uczE6
Y29tbWVyY2lhbEl0ZW1BY3F1aXNpdGlvblByb2NlZHVyZXM+CiAgICAgICAgICA8
bnMxOmNvbW1lcmNpYWxJdGVtVGVzdFByb2dyYW0gZGVzY3JpcHRpb249Ik5PIj5O
PC9uczE6Y29tbWVyY2lhbEl0ZW1UZXN0UHJvZ3JhbT4KICAgICAgICAgIDxuczE6
c21hbGxCdXNpbmVzc0NvbXBldGl0aXZlbmVzc0RlbW9uc3RyYXRpb25Qcm9ncmFt
PmZhbHNlPC9uczE6c21hbGxCdXNpbmVzc0NvbXBldGl0aXZlbmVzc0RlbW9uc3Ry
YXRpb25Qcm9ncmFtPgogICAgICAgICAgPG5zMTpBNzZBY3Rpb24gZGVzY3JpcHRp
b249Ik5PIj5OPC9uczE6QTc2QWN0aW9uPgogICAgICAgICAgPG5zMTpmZWRCaXpP
cHBzIGRlc2NyaXB0aW9uPSJOT1QgQVBQTElDQUJMRSI+WDwvbnMxOmZlZEJpek9w
cHM+PC9uczE6Y29tcGV0aXRpb24+CiAgICAgICAgPG5zMTpwcmVmZXJlbmNlUHJv
Z3JhbXM+PC9uczE6cHJlZmVyZW5jZVByb2dyYW1zPgogICAgICAgIDxuczE6dHJh
bnNhY3Rpb25JbmZvcm1hdGlvbj4KICAgICAgICAgIDxuczE6Y3JlYXRlZEJ5PkVM
RU5BLkEuQkVTQVdAVVNET0ouR09WPC9uczE6Y3JlYXRlZEJ5PgogICAgICAgICAg
PG5zMTpjcmVhdGVkRGF0ZT4yMDA3LTA1LTAzIDE1OjIxOjM5PC9uczE6Y3JlYXRl
ZERhdGU+CiAgICAgICAgICA8bnMxOmxhc3RNb2RpZmllZEJ5PklEVl9DT1JSRUNU
PC9uczE6bGFzdE1vZGlmaWVkQnk+CiAgICAgICAgICA8bnMxOmxhc3RNb2RpZmll
ZERhdGU+MjAxNi0wMi0xNiAxMzoxMDowMjwvbnMxOmxhc3RNb2RpZmllZERhdGU+
CiAgICAgICAgICA8bnMxOnN0YXR1cyBkZXNjcmlwdGlvbj0iRklOQUwiPkY8L25z
MTpzdGF0dXM+PC9uczE6dHJhbnNhY3Rpb25JbmZvcm1hdGlvbj48L25zMTphd2Fy
ZD4KICAgIDwvY29udGVudD4KICA8L2VudHJ5Pgo8L2ZlZWQ+
+"
+2,"","",,""
diff --git a/wtptst/WTP/WT_SELF_TEST.ctl b/wtptst/WTP/WT_SELF_TEST.ctl
new file mode 100644
index 0000000..3f60666
--- /dev/null
+++ b/wtptst/WTP/WT_SELF_TEST.ctl
@@ -0,0 +1,12 @@
+OPTIONS (SKIP=1)
+LOAD DATA
+APPEND INTO TABLE "WTP"."WT_SELF_TEST"
+FIELDS CSV WITH EMBEDDED
+TRAILING NULLCOLS
+ (ID FLOAT EXTERNAL
+ ,TEMP_CLOB CHAR(1048576)
+ ,TEMP_NCLOB CHAR(1048576)
+ ,TEMP_XML CHAR(1048576)
+ -- BLOB data must be decoded from Base64 after loading
+ ,TEMP_BLOB CHAR(1572864)
+ )
diff --git a/wtptst/WTP/WT_SELF_TEST.tab b/wtptst/WTP/WT_SELF_TEST.tab
new file mode 100644
index 0000000..d98114f
--- /dev/null
+++ b/wtptst/WTP/WT_SELF_TEST.tab
@@ -0,0 +1,43 @@
+
+--
+-- Create WTP.WT_SELF_TEST Table
+--
+-- NOTE: Foreign keys are in a different script
+-- Indexes are in a different script
+-- Triggers are in a different script
+--
+
+set define off
+
+
+--DBMS_METADATA:WTP.WT_SELF_TEST
+
+ CREATE TABLE "WTP"."WT_SELF_TEST"
+ ( "ID" NUMBER,
+ "TEMP_CLOB" CLOB,
+ "TEMP_NCLOB" NCLOB,
+ "TEMP_XML" "XMLTYPE",
+ "TEMP_BLOB" BLOB
+ ) SEGMENT CREATION IMMEDIATE LOGGING;
+ALTER TABLE "WTP"."WT_SELF_TEST" ADD CONSTRAINT "WT_SELF_TEST_PK" PRIMARY KEY ("ID")
+ USING INDEX ENABLE;
+
+-- Comments
+
+--DBMS_METADATA:WTP.WT_SELF_TEST
+
+ COMMENT ON COLUMN "WTP"."WT_SELF_TEST"."ID" IS 'Primary Key';
+ COMMENT ON COLUMN "WTP"."WT_SELF_TEST"."TEMP_CLOB" IS 'CLOB test data';
+ COMMENT ON COLUMN "WTP"."WT_SELF_TEST"."TEMP_NCLOB" IS 'NCLOB test data';
+ COMMENT ON COLUMN "WTP"."WT_SELF_TEST"."TEMP_XML" IS 'XML test data';
+ COMMENT ON COLUMN "WTP"."WT_SELF_TEST"."TEMP_BLOB" IS 'BLOB test data';
+ COMMENT ON TABLE "WTP"."WT_SELF_TEST" IS 'Test Data for unit testing of WTPLSQL.';
+
+
+-- Grants
+
+
+-- Synonyms
+
+
+set define on
diff --git a/wtptst/WTP/WT_SELF_TEST.tabtrg b/wtptst/WTP/WT_SELF_TEST.tabtrg
new file mode 100644
index 0000000..af4e87d
--- /dev/null
+++ b/wtptst/WTP/WT_SELF_TEST.tabtrg
@@ -0,0 +1,25 @@
+
+--
+-- Create Triggers for WTP.WT_SELF_TEST TABLE
+--
+
+set define off
+
+
+-- NOTE: This is a "TARGET" Trigger
+
+--DBMS_METADATA:WTP.WT_SELF_TEST$TEST
+
+ CREATE OR REPLACE EDITIONABLE TRIGGER "WTP"."WT_SELF_TEST$TEST"
+ before insert on wt_self_test
+ for each row
+declare
+ l_junk number;
+begin
+ l_junk := 1;
+end;
+
+/
+ALTER TRIGGER "WTP"."WT_SELF_TEST$TEST" ENABLE;
+
+set define on
diff --git a/wtptst/alter_foreign_keys.sql b/wtptst/alter_foreign_keys.sql
new file mode 100644
index 0000000..be2b565
--- /dev/null
+++ b/wtptst/alter_foreign_keys.sql
@@ -0,0 +1,88 @@
+
+--
+-- Alter "wtptst" Install Type Foreign Keys
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure missing_parent_sql
+ (in_owner sys.dba_constraints.owner%TYPE
+ ,in_constraint sys.dba_constraints.constraint_name%TYPE)
+ is
+ TYPE fk_rec_type is record
+ (child_owner sys.dba_constraints.owner%TYPE
+ ,child_table sys.dba_constraints.table_name%TYPE
+ ,child_column sys.dba_cons_columns.column_name%TYPE
+ ,parent_owner sys.dba_constraints.owner%TYPE
+ ,parent_table sys.dba_constraints.table_name%TYPE
+ ,parent_column sys.dba_cons_columns.column_name%TYPE);
+ TYPE fk_nt_type is table of fk_rec_type;
+ fk_nt fk_nt_type;
+ sql_txt varchar2(1000);
+ begin
+ select ctab.owner child_owner, ctab.table_name child_table, ccol.column_name child_column,
+ ptab.owner parent_owner, ptab.table_name parent_table, pcol.column_name parent_column
+ bulk collect into fk_nt
+ from sys.dba_constraints ctab
+ join sys.dba_cons_columns ccol
+ on ccol.owner = ctab.owner and ccol.constraint_name = ctab.constraint_name
+ join sys.dba_constraints ptab
+ on ptab.owner = ctab.r_owner and ptab.constraint_name = ctab.r_constraint_name
+ join sys.dba_cons_columns pcol
+ on pcol.owner = ptab.owner and pcol.constraint_name = ptab.constraint_name
+ and pcol.position = ccol.position
+ where ctab.owner = in_owner and ctab.constraint_name = in_constraint
+ order by ccol.position;
+ if SQL%NOTFOUND then return; end if;
+ dbms_output.put_line('-- ORA-20000: Query to find missing parent keys:');
+ -- ORA-20000: select "CHILD_KEY" from from "CHILD_OWNER"."CHILD_TABLE" group by "CHILD_KEY"
+ sql_txt := '-- ORA-20000: select "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).child_owner || '"."' || fk_nt(1).child_table ||
+ '" group by "' || fk_nt(1).child_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).child_column;
+ end loop;
+ dbms_output.put_line (sql_txt || '"');
+ -- ORA-20000: MINUS select "PARENT_KEY" from "PARENT_OWNER"."PARENT_TABLE";
+ sql_txt := '-- ORA-20000: MINUS select "' || fk_nt(1).parent_column;
+ for i in 2 .. fk_nt.LAST
+ loop
+ sql_txt := sql_txt || '", "' || fk_nt(i).parent_column;
+ end loop;
+ sql_txt := sql_txt || '" from "' || fk_nt(1).parent_owner || '"."' || fk_nt(1).parent_table || '";';
+ dbms_output.put_line (sql_txt);
+ end missing_parent_sql;
+ procedure do_it (in_schema in varchar2)
+ is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, table_name, constraint_name from dba_constraints
+ where constraint_type = 'R' and owner = in_schema
+ order by owner, table_name, constraint_name)
+ loop
+ sql_txt := 'alter table "' || buff.owner || '"."' || buff.table_name ||
+ '" &1. constraint "' || buff.constraint_name || '"';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- *');
+ dbms_output.put_line('-- ERROR at line :');
+ dbms_output.put_line('-- ' || SQLERRM);
+ missing_parent_sql(buff.owner,buff.constraint_name);
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Foreign Keys is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Foreign Keys for wtptst Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/alter_queues.sql b/wtptst/alter_queues.sql
new file mode 100644
index 0000000..b89e6c2
--- /dev/null
+++ b/wtptst/alter_queues.sql
@@ -0,0 +1,36 @@
+
+--
+-- Alter "wtptst" Install Type Queues
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, name from dba_queues
+ where owner = in_schema and queue_type != 'EXCEPTION_QUEUE'
+ order by owner, name)
+ loop
+ sql_txt := 'begin DBMS_AQADM.' ||
+ case '&1.' when 'ENABLE' then 'START_QUEUE'
+ else 'STOP_QUEUE'
+ end ||
+ '(QUEUE_NAME => ''' || buff.owner || '.' || buff.name ||
+ ''', ENQUEUE => TRUE, DEQUEUE => TRUE); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Queues is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Queues for wtptst Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/alter_scheduler_jobs.sql b/wtptst/alter_scheduler_jobs.sql
new file mode 100644
index 0000000..efca82a
--- /dev/null
+++ b/wtptst/alter_scheduler_jobs.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtptst" Install Type Scheduler Jobs
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, job_name from dba_scheduler_jobs
+ where owner = in_schema
+ order by owner, job_name)
+ loop
+ sql_txt := 'begin DBMS_SCHEDULER.&1.(NAME => ''' ||
+ buff.owner || '.' || buff.job_name || '''); end;';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Scheduler Jobs is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Scheduler Jobs for wtptst Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/alter_triggers.sql b/wtptst/alter_triggers.sql
new file mode 100644
index 0000000..5a975cb
--- /dev/null
+++ b/wtptst/alter_triggers.sql
@@ -0,0 +1,32 @@
+
+--
+-- Alter "wtptst" Install Type Triggers
+--
+-- Command Line Parameters:
+-- 1 - ENABLE/DISABLE
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select owner, trigger_name from dba_triggers
+ where table_owner = in_schema
+ order by owner, trigger_name)
+ loop
+ sql_txt := 'alter trigger "' || buff.owner || '"."' ||
+ buff.trigger_name || '" &1.';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema || ' Alter Triggers is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Alter Triggers for wtptst Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/compile_all.sql b/wtptst/compile_all.sql
new file mode 100644
index 0000000..f98fcae
--- /dev/null
+++ b/wtptst/compile_all.sql
@@ -0,0 +1,36 @@
+
+--
+-- Compile All "wtptst" Install Type Objects
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ sql_txt varchar2(1000);
+ begin
+ for buff in (select object_name
+ from sys.dba_objects
+ where owner = in_schema
+ and object_type = 'JAVA SOURCE'
+ order by object_name )
+ loop
+ sql_txt := 'alter java source "' || in_schema || '"."' || buff.object_name || '" compile';
+ dbms_output.put_line(sql_txt || ';');
+ begin
+ execute immediate sql_txt;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end;
+ end loop;
+ begin
+ DBMS_UTILITY.compile_schema(schema => in_schema, compile_all => FALSE);
+ dbms_output.put_line('-- ' || in_schema || ' Compile All is done.');
+ exception when others then
+ dbms_output.put_line('Compiling Schema ' || in_schema || CHR(10) || SQLERRM);
+ dbms_output.put_line('');
+ end;
+ end do_it;
+begin
+ dbms_output.put_line('Compile All for wtptst Install Type');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/db_build_junit_report.sql b/wtptst/db_build_junit_report.sql
new file mode 100644
index 0000000..35be61e
--- /dev/null
+++ b/wtptst/db_build_junit_report.sql
@@ -0,0 +1,112 @@
+
+--
+-- Create JUnit XML Report of Database Build Status for "wtptst" Install Type
+--
+
+declare
+ --
+ procedure ot (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end ot;
+ --
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for tsuite in (
+ with q1 as (
+ select obj.owner
+ ,count(obj.owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = in_schema
+ group by obj.owner
+ UNION
+ select syn.table_owner OWNER
+ ,count(syn.table_owner) NUM_TESTS
+ ,sum(decode(obj.status, 'VALID', 0, 1)) NUM_FAILURES
+ ,min(obj.last_ddl_time) TSTAMP
+ -- Jenkins JUnit Plugin adds all these times together
+ -- round((max(obj.last_ddl_time) - min(obj.last_ddl_time))*24*60*60)
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ group by syn.table_owner
+ )
+ select owner -- TESTSUITE
+ ,sum(NUM_TESTS) NUM_TESTS
+ ,sum(NUM_FAILURES) NUM_FAILURES
+ ,max(TSTAMP) TSTAMP
+ ,sum(ELAPSED_SECS) ELAPSED_SECS
+ from q1
+ group by owner
+ order by owner)
+ loop
+ ot(' ');
+ for tcase in (
+ select obj.object_type -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_objects obj
+ where obj.owner = tsuite.owner
+ UNION ALL
+ select 'PUBLIC_SYNONYM' OBJECT_TYPE -- TESTCASE
+ ,replace(obj.object_name,'.','_') OBJECT_NAME -- CLASS
+ ,obj.STATUS
+ ,0 ELAPSED_SECS
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = tsuite.owner
+ order by 1,2 )
+ loop
+ if tcase.status = 'VALID'
+ then
+ ot(' ' );
+ else
+ ot(' ' );
+ ot(' ');
+ ot('** Object Status is ' || tcase.status);
+ for terror in (
+ select 'Line ' || line ||
+ ', Col ' || position ||
+ ': ' || UTL_I18N.ESCAPE_REFERENCE(text, 'us7ascii') ERROR_TXT
+ from dba_errors
+ where owner = tsuite.owner
+ and type = decode(tcase.object_type,'PUBLIC_SYNONYM','SYNONYM',tcase.object_type)
+ and name = tcase.object_name
+ order by sequence )
+ loop
+ ot(terror.error_txt);
+ end loop;
+ ot(' ');
+ ot(' ');
+ end if;
+ end loop;
+ ot(' ');
+ end loop;
+ end do_it;
+begin
+ ot('');
+ ot('');
+ do_it('WTP');
+ ot('');
+end;
+/
diff --git a/wtptst/db_install.sql b/wtptst/db_install.sql
new file mode 100644
index 0000000..8fab835
--- /dev/null
+++ b/wtptst/db_install.sql
@@ -0,0 +1,57 @@
+
+-- Database Installation Assist
+-- Wrapper for Database Installation Scripts
+--
+-- Parameters
+-- 1) Script Name
+-- 2) Schema Name
+-- 3) System Connect String
+
+prompt === DBI Started: &1.
+
+define DBI_SCRIPT_NAME="&1."
+define DBI_SCHEMA_NAME="&2."
+define DBI_SYSTEM_CONNECT="&3."
+
+variable dbi_beg_dtm varchar2(40)
+variable dbi_beg_secs number
+
+set feedback off
+begin
+ -- Initialize Timer
+ :dbi_beg_dtm := to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS');
+ :dbi_beg_secs := dbms_utility.get_time;
+ -- Set Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "&DBI_SCHEMA_NAME."';
+ end if;
+end;
+/
+
+set feedback on
+set blockterminator off
+set sqlblanklines on
+
+@"&DBI_SCRIPT_NAME." "&DBI_SYSTEM_CONNECT." "" ""
+set serveroutput on size unlimited format wrapped
+
+set sqlblanklines off
+set blockterminator on
+set feedback off
+begin
+ -- Reset Current Schema
+ if length('&DBI_SCHEMA_NAME.') > 0
+ then
+ execute immediate 'alter session set current_schema = "' || USER || '"';
+ end if;
+ -- Show Timer Results
+ dbms_output.put_line('=== DBI Completed at ' || to_char(systimestamp,'YYYY-MM-DD') || 'T' ||
+ to_char(systimestamp,'HH24:MI:SS') ||
+ ' for a duration of ' || trim( (dbms_utility.get_time - :dbi_beg_secs) / 100 ) ||
+ ' seconds (started at ' || :dbi_beg_dtm || ')');
+end;
+/
+
+set feedback on
diff --git a/wtptst/fix_invalid_public_synonyms.sql b/wtptst/fix_invalid_public_synonyms.sql
new file mode 100644
index 0000000..ef70282
--- /dev/null
+++ b/wtptst/fix_invalid_public_synonyms.sql
@@ -0,0 +1,49 @@
+
+--
+-- Re-create Invalid Public Synonyms
+--
+
+----------------------------------------
+prompt
+prompt Re-create Invalid Public Synonyms
+set serveroutput on size unlimited format wrapped
+set linesize 2499
+
+Declare
+ sql_txt varchar(2000);
+Begin
+ for buff in (with q1 as (
+ select owner, object_name, editionable
+ from dba_objects
+ where status != 'VALID'
+ )
+ select syn.synonym_name, syn.table_owner, syn.table_name,
+ case q1.editionable when 'Y' then ' EDITIONABLE'
+ when NULL then ''
+ else ' NONEDITIONABLE'
+ end EDITIONABLE
+ from dba_synonyms syn
+ join q1
+ on q1.owner = syn.owner
+ and q1.object_name = syn.synonym_name
+ join dba_users usr
+ on usr.username = syn.table_owner
+ and ( usr.oracle_maintained is null
+ OR usr.oracle_maintained != 'Y')
+ where syn.owner = 'PUBLIC' )
+ loop
+ begin
+ sql_txt := 'CREATE OR REPLACE' || buff.EDITIONABLE || ' PUBLIC SYNONYM "' ||
+ buff.synonym_name || '" for "' || buff.table_owner || '"."' ||
+ buff.table_name ||'"';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;
+ exception
+ when others then
+ dbms_output.put_line('ERROR:' || CHR(10) || SQLERRM || CHR(10));
+ dbms_output.put_line('----------------------------------------');
+ end;
+ end loop;
+end;
+/
+
diff --git a/wtptst/install.sql b/wtptst/install.sql
new file mode 100644
index 0000000..20e761f
--- /dev/null
+++ b/wtptst/install.sql
@@ -0,0 +1,76 @@
+
+--
+-- Master Installation Script
+-- All scripts created by "https://ODBCapture.org", Version V2.1
+--
+-- Must be run as SYS
+--
+-- Command Line Parameters:
+-- 1 - TO_PDB_SYSTEM: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the pluggable database.
+-- The Data Load installation requires this connection information.
+--
+
+-- NOTE: If running in a Linux based Docker Container from a Windows FileSystem Mount, run this first:
+-- dos2unix -f -o ../install/*/*.csv ../install/*/*/*.csv
+
+define TOP_PDB_SYSTEM="&1."
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt Identify this Module in V$SESSION
+set appinfo "wtptst Installation"
+
+----------------------------------------
+prompt Setup Abort on Error
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+WHENEVER OSERROR EXIT
+
+----------------------------------------
+prompt
+prompt **************************
+prompt * Run SYS Installation *
+prompt **************************
+prompt
+@install_sys.sql "" "" ""
+
+----------------------------------------
+prompt Setup Continue on Error
+WHENEVER SQLERROR CONTINUE
+WHENEVER OSERROR CONTINUE
+
+----------------------------------------
+prompt
+prompt *****************************
+prompt * Run SYSTEM Installation *
+prompt *****************************
+prompt
+connect &TOP_PDB_SYSTEM.
+execute DBMS_JAVA.SET_OUTPUT(1000000);
+set serveroutput on size unlimited format wrapped
+@install_system.sql "" "" ""
+
+----------------------------------------
+prompt
+prompt *************************
+prompt * Install Application *
+prompt *************************
+prompt
+@install_wtptst.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+prompt
+prompt *****************
+prompt * Run Reports *
+prompt *****************
+prompt
+@report_status.sql "&TOP_PDB_SYSTEM." "" ""
+
+----------------------------------------
+set appinfo "Null"
+set appinfo off
+prompt
+prompt "wtptst" Installation is Done.
+
diff --git a/wtptst/install_sys.sql b/wtptst/install_sys.sql
new file mode 100644
index 0000000..c53ba1c
--- /dev/null
+++ b/wtptst/install_sys.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYS Installation Script
+--
+-- Must be run as SYS
+--
+
+spool install_sys.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtptst/install_system.sql b/wtptst/install_system.sql
new file mode 100644
index 0000000..dd64dd5
--- /dev/null
+++ b/wtptst/install_system.sql
@@ -0,0 +1,18 @@
+
+--
+-- SYSTEM Installation Script
+--
+-- Must be run as SYSTEM
+--
+
+spool install_system.log
+
+set blockterminator off
+set sqlblanklines on
+
+----------------------------------------
+set sqlblanklines off
+set blockterminator on
+
+spool off
+
diff --git a/wtptst/install_wtptst.sql b/wtptst/install_wtptst.sql
new file mode 100644
index 0000000..46db2be
--- /dev/null
+++ b/wtptst/install_wtptst.sql
@@ -0,0 +1,49 @@
+
+--
+-- wtptst Installation Script
+--
+-- Must be run as a SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - INSTALL_SYSTEM_CONNECT: SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+spool install_wtptst.log
+
+define INSTALL_SYSTEM_CONNECT="&1."
+
+-- Must Set SQLPREFIX away from "#" Oracle Change Data Capture packages
+set sqlprefix "~"
+
+-- Using "^P", CHR(16), DLE as an escape character
+set escape OFF
+set escape ""
+
+----------------------------------------
+-- Prepare for Install
+@db_install.sql "./installation_prepare.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TABLE Install
+
+@db_install.sql "WTP/WT_SELF_TEST.tab" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- DATA_LOAD Install
+
+@db_install.sql "WTP/WT_SELF_TEST.cdl" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- TRIGGER Install
+
+@db_install.sql "WTP/WT_SELF_TEST.tabtrg" "WTP" "&INSTALL_SYSTEM_CONNECT."
+
+----------------------------------------
+-- Finalize Installation
+@db_install.sql "./installation_finalize.sql" "" "&INSTALL_SYSTEM_CONNECT."
+
+spool off
+
diff --git a/wtptst/installation_finalize.sql b/wtptst/installation_finalize.sql
new file mode 100644
index 0000000..7660714
--- /dev/null
+++ b/wtptst/installation_finalize.sql
@@ -0,0 +1,48 @@
+
+--
+-- Finalize Installation
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+define FINAL_SYSTEM_CONNECT="&1."
+
+prompt
+prompt Drop_Temp_Publicly_Updateable_Table_SQL
+drop table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE purge;
+
+prompt
+prompt fix_invalid_public_synonyms
+@"fix_invalid_public_synonyms.sql" ""
+
+prompt
+prompt compile_all
+@"compile_all.sql" ""
+
+prompt
+prompt alter_foreign_keys_ENABLE
+@"alter_foreign_keys.sql" "ENABLE"
+
+prompt
+prompt alter_triggers_ENABLE
+@"alter_triggers.sql" "ENABLE"
+
+prompt
+prompt update_id_sequences
+@"update_id_sequences.sql" ""
+
+--prompt
+--prompt alter_queues_ENABLE
+--@"alter_queues.sql" "ENABLE"
+
+--prompt
+--prompt alter_scheduler_jobs_ENABLE
+--@"alter_scheduler_jobs.sql" "ENABLE"
+
+prompt
+prompt Load Installation Files
+@"odbcapture_installation_logs.cdl" "&FINAL_SYSTEM_CONNECT."
diff --git a/wtptst/installation_prepare.sql b/wtptst/installation_prepare.sql
new file mode 100644
index 0000000..265eb55
--- /dev/null
+++ b/wtptst/installation_prepare.sql
@@ -0,0 +1,9 @@
+
+--
+-- Prepare for View Install
+--
+
+prompt
+prompt Create_Temp_Publicly_Updateable_Table_SQL
+create table SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE (c1 number);
+grant all on SYSTEM.TEMP_PUBLICLY_UPDATEABLE_TABLE to PUBLIC with grant option;
diff --git a/wtptst/list_invalids.csv b/wtptst/list_invalids.csv
new file mode 100644
index 0000000..e2d4f25
--- /dev/null
+++ b/wtptst/list_invalids.csv
@@ -0,0 +1 @@
+"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"
diff --git a/wtptst/list_invalids.sql b/wtptst/list_invalids.sql
new file mode 100644
index 0000000..6f53240
--- /dev/null
+++ b/wtptst/list_invalids.sql
@@ -0,0 +1,47 @@
+
+--
+-- List Invalid Objects for "wtptst" Install Type
+--
+
+declare
+ procedure do_it (in_schema in varchar2) is
+ begin
+ for buff in (
+ with q1 as (
+ select owner
+ ,object_name
+ ,object_type
+ ,status
+ from dba_objects obj
+ where obj.owner = in_schema
+ and ( obj.object_type != 'TYPE'
+ or obj.object_name not like 'SYSTP%==')
+ and obj.status != 'VALID'
+ UNION ALL
+ select syn.table_owner
+ ,syn.synonym_name
+ ,'PUBLIC_SYNONYM' OBJECT_TYPE
+ ,obj.status
+ from dba_synonyms syn
+ join dba_objects obj
+ on obj.object_name = syn.synonym_name
+ and obj.owner = syn.owner
+ and obj.status != 'VALID'
+ where syn.owner = 'PUBLIC'
+ and syn.table_owner = in_schema
+ )
+ select '"' || owner || '",' ||
+ '"' || object_name || '",' ||
+ '"' || object_type || '",' ||
+ '"' || status || '"' RECORD_DATA
+ from q1
+ order by RECORD_DATA)
+ loop
+ dbms_output.put_line(buff.RECORD_DATA);
+ end loop;
+ end do_it;
+begin
+ dbms_output.put_line('"OWNER","OBJECT_NAME","OBJECT_TYPE","STATUS"');
+ do_it('WTP');
+end;
+/
diff --git a/wtptst/log_files_junit_report.sql b/wtptst/log_files_junit_report.sql
new file mode 100644
index 0000000..73adf6c
--- /dev/null
+++ b/wtptst/log_files_junit_report.sql
@@ -0,0 +1,282 @@
+
+--
+-- Create JUnit XML Report of Database Log Files for "wtptst" Schema
+--
+
+--Element | Description
+-------------|-------------
+--TestSuite | install_SYS, install_SYSTEM, and install_wtptst
+--Hostname | Database Name
+--Property | name="Source Version" value="https://github.com/DMSTEX/DMSTEX.git at f2c736d0cc6fd80d961414dcae37df2bed0d69e2 (Branch: main)"
+--Testcase | Script Name
+--Classname | "Schema Name"."Object Type"
+--Assertions | Number of PL/SQL Statements
+--Status | PASS/FAIL/ERROR/DISABLE
+--Time | Testcase Duration
+--Timestamp | Testcase Runtime (ISO 8601 format)
+--Errors | Number of Test Errors
+
+declare
+ --
+ -- Process CLOB Contents from odbcapture_installation_logs
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ --
+ -- Varchar2 Associative Array
+ TYPE vc2_aa_type is table of varchar2(4000)
+ index by pls_integer;
+ --
+ -- Testcases
+ TYPE tc_rec_type is record
+ (schema_name varchar2(128)
+ ,script_ext varchar2(10) -- Script Name Extension
+ ,num_statements number(3) -- Number of statements executed in a script
+ ,status varchar2(10) -- PASS/FAIL
+ ,duration_secs number(5)
+ ,t_timestamp varchar2(20) -- 2014-01-21T16:17:18
+ ,error_message varchar2(4000)
+ ,tc_err_aa vc2_aa_type
+ ,tc_sys_out_aa vc2_aa_type
+ );
+ TYPE tc_aa_type is table of tc_rec_type
+ index by varchar2(256); -- Testcase Name (Script Name with Path)
+ tc_aa tc_aa_type;
+ tc_name varchar2(256); -- Testcase Name (Script Name with Path)
+ prev_tc_name varchar2(256); -- Previous Testcase Name
+ --
+ tc_buff_aa vc2_aa_type; -- Buffer Array for Testcases
+ sys_buff_aa vc2_aa_type; -- Buffer Array for System
+ sys_err boolean := FALSE; -- System Error Found
+ --
+ total_tests number(4);
+ total_errors number(4);
+ total_duration number(6);
+ --
+ procedure initialize_testcase (in_buff in varchar2) is begin
+ -- === DBI Started: "ODBCAPTURE/OBJ_INSTALL_COMMENTS_TAB.tab"
+ tc_name := replace(substr(in_buff, 18, 256),'"','');
+ tc_aa(tc_name).schema_name := substr(tc_name, 1, instr(tc_name,'/',1)-1);
+ tc_aa(tc_name).script_ext := substr(tc_name, instr(tc_name,'.',-1)+1,10);
+ tc_aa(tc_name).status := 'PASS';
+ end initialize_testcase;
+ --
+ procedure finalize_testcase (in_buff in varchar2) is begin
+ if tc_name is null then return; end if;
+ tc_aa(tc_name).t_timestamp := substr(in_buff,22,19);
+ tc_aa(tc_name).duration_secs := substr(in_buff,60,length(in_buff)-60-40);
+ total_duration := total_duration + tc_aa(tc_name).duration_secs;
+ if regexp_like(tc_name, '[.]cdl$')
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := '### SQL*Loader Log File: ' || replace(tc_name,'.cdl','.log');
+ begin
+ select substr(replace(contents,CHR(10)||CHR(10),CHR(10)),1,4000)
+ into tc_buff_aa(tc_buff_aa.COUNT + 1)
+ from odbcapture_installation_logs
+ where file_name = replace(tc_name,'.cdl','.log');
+ exception when others then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := SQLERRM;
+ end;
+ end if;
+ if tc_aa(tc_name).status = 'FAIL'
+ then
+ tc_aa(tc_name).num_statements := 1;
+ total_errors := total_errors + 1;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_err_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ else
+ tc_aa(tc_name).num_statements := tc_buff_aa.COUNT;
+ if tc_buff_aa.COUNT > 0
+ then
+ for i in tc_buff_aa.FIRST .. tc_buff_aa.LAST
+ loop
+ tc_aa(tc_name).tc_sys_out_aa(i) := tc_buff_aa(i);
+ end loop;
+ end if;
+ end if;
+ total_tests := total_tests + 1;
+ prev_tc_name := tc_name;
+ tc_buff_aa.DELETE;
+ tc_name := '';
+ end finalize_testcase;
+ --
+ procedure process_contents_line (in_txt in varchar2) is
+ ldr_txt varchar2(4000);
+ begin
+ if in_txt is null then return; end if;
+ case
+ when regexp_like(in_txt, '^=== DBI Started: ')
+ then
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ finalize_testcase('');
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ initialize_testcase(in_txt);
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ end if;
+ when regexp_like(in_txt, '^=== DBI Completed at ')
+ then
+ -- === DBI Completed at 2024-03-05T02:54:49 for a duration of 1.25 seconds (started at 2024-03-05T02:54:48)
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ finalize_testcase(in_txt);
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := 'Unexpected Testcase End: ' || in_txt;
+ end if;
+ when regexp_like(in_txt, '^(-- ){0,1}(PL[/]SQL:|(PLS|OCI|ORA|SP2|SQL|TNS)-[[:digit:]])')
+ then
+ -- (-- ){0,1}: "-- " may or may not be present
+ -- PL/SQL: PL/SQL Message
+ -- PLS-"digit" PL/SQL Errors
+ -- OCI-"digit" Oracle Call Interface
+ -- ORA-"digit" Oracle Database Errors
+ -- SP2-"digit" SQL*Plus Errors
+ -- SQL-"digit" SQL Errors
+ -- TNS-"digit" Transparent Network Substrate Errors
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ tc_aa(tc_name).status := 'FAIL';
+ if tc_aa(tc_name).error_message is null
+ then
+ tc_aa(tc_name).error_message := in_txt;
+ end if;
+ else
+ sys_err := TRUE;
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ else
+ if tc_name is not null
+ then
+ tc_buff_aa(tc_buff_aa.COUNT + 1) := in_txt;
+ else
+ sys_buff_aa(sys_buff_aa.COUNT + 1) := '(' || prev_tc_name || ') ' || in_txt;
+ end if;
+ end case;
+ end process_contents_line;
+ --
+ procedure p (in_txt in varchar2) is begin
+ dbms_output.put_line(in_txt);
+ end p;
+begin
+ --
+ prev_tc_name := 'Initializing';
+ -- JUnit XML Format for Jenkins: "https://llg.cubic.org/docs/junit/"
+ p('');
+ p('');
+ for buf1 in (select rownum TS_ID
+ ,l.file_name
+ ,to_char(l.load_dtm,'YYYY-MM-DD') || 'T' ||
+ to_char(l.load_dtm,'HH24:MI:SS') TSTAMP
+ ,db.db_unique_name
+ ,l.contents
+ from odbcapture_installation_logs l
+ cross join v$database db
+ where l.install_type = 'wtptst'
+ and l.file_name like 'install%'
+ and l.load_dtm > trunc(sysdate,'DD') - 2
+ order by l.file_name, l.load_dtm)
+ loop
+ -- Initialize
+ tc_aa.DELETE;
+ tc_buff_aa.DELETE;
+ sys_buff_aa.DELETE;
+ tc_name := '';
+ total_tests := 0;
+ total_errors := 0;
+ total_duration := 0;
+ -- Fill the Testcase Array
+ so_far := 0;
+ loop
+ end_pos := instr(buf1.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buf1.contents, so_far + 1, end_pos - so_far - 1);
+ process_contents_line(line_txt);
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buf1.contents, so_far + 1, 4000);
+ process_contents_line(line_txt);
+ -- testsuite can appear multiple times, if contained in a testsuites element. It can also be the root element.
+ p(' ');
+ tc_name := tc_aa.FIRST;
+ while tc_name is not null
+ loop
+ -- testcase can appear multiple times, see /testsuites/testsuite@tests
+ p(' ');
+ if tc_aa(tc_name).status = 'PASS'
+ then
+ if tc_aa(tc_name).tc_sys_out_aa.COUNT > 0
+ then
+ -- Data that was written to standard out while the test was executed. optional
+ p(' ');
+ for i in tc_aa(tc_name).tc_sys_out_aa.FIRST .. tc_aa(tc_name).tc_sys_out_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_sys_out_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ else
+ -- Indicates that the test errored. An errored test is one that had an unanticipated problem. For example an unchecked throwable or a problem with the implementation of the test. Contains as a text node relevant data for the error, for example a stack trace. optional
+ p(' ' ); -- The error message. e.g., if a java exception is thrown, the return value of getMessage()
+ if tc_aa(tc_name).tc_err_aa.COUNT > 0
+ then
+ for i in tc_aa(tc_name).tc_err_aa.FIRST .. tc_aa(tc_name).tc_err_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(tc_aa(tc_name).tc_err_aa(i)));
+ end loop;
+ end if;
+ p(' ');
+ end if;
+ p(' ');
+ exit when tc_name = tc_aa.LAST;
+ tc_name := tc_aa.NEXT(tc_name);
+ end loop;
+ if sys_buff_aa.COUNT > 0
+ then
+ if sys_err
+ then
+ -- Data that was written to standard error while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ else
+ -- Data that was written to standard out while the test suite was executed. optional
+ p(' ');
+ for i in sys_buff_aa.FIRST .. sys_buff_aa.LAST
+ loop
+ p(DBMS_XMLGEN.CONVERT(sys_buff_aa(i)));
+ end loop;
+ p(' ');
+ end if;
+ end if;
+ p(' ');
+ end loop;
+ p('');
+end;
+/
diff --git a/wtptst/odbcapture_installation_logs.cdl b/wtptst/odbcapture_installation_logs.cdl
new file mode 100644
index 0000000..efb09a6
--- /dev/null
+++ b/wtptst/odbcapture_installation_logs.cdl
@@ -0,0 +1,71 @@
+
+--
+-- Consolidated Data Load script for odbcapture_installation_logs data
+--
+-- Must be run as SYSTEM
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+
+prompt
+prompt Confirm/Create odbcapture_installation_logs Table
+declare
+ jnk number := 0;
+ procedure run_sql (in_sql in varchar2) is begin
+ dbms_output.put_line(in_sql || ';');
+ execute immediate in_sql;
+ exception when others then
+ dbms_output.put_line('-- ' || SQLERRM || CHR(10));
+ end run_sql;
+begin
+ begin
+ execute immediate 'insert into odbcapture_installation_logs(load_dtm, install_type, file_name)' ||
+ ' values(sysdate, ''Test'', ''Test'')';
+ rollback;
+ jnk := 1;
+ exception when others then
+ if SQLERRM != 'ORA-00942: table or view does not exist'
+ then
+ dbms_output.put_line('odbcapture_installation_logs table: ' || SQLERRM);
+ end if;
+ jnk := -1;
+ end;
+ if jnk = -1
+ then
+ run_sql('create table odbcapture_installation_logs' || CHR(10) ||
+ ' (load_dtm date' || CHR(10) ||
+ ' ,install_type varchar2(10)' || CHR(10) ||
+ ' ,file_name varchar2(512)' || CHR(10) ||
+ ' ,contents clob)');
+ run_sql('comment on column odbcapture_installation_logs.load_dtm is ''Date/Time the installation log file was loaded.''');
+ run_sql('comment on column odbcapture_installation_logs.install_type is ''Type of installation (from TYPE_CONF).''');
+ run_sql('comment on column odbcapture_installation_logs.file_name is ''Name of installation log file.''');
+ run_sql('comment on column odbcapture_installation_logs.contents is ''Contents/Text of the installation log file.''');
+ run_sql('comment on table odbcapture_installation_logs is ''ODBCAPTURE installation log files.''');
+ run_sql('grant select on odbcapture_installation_logs to public');
+ run_sql('create public synonym odbcapture_installation_logs for odbcapture_installation_logs');
+ end if;
+end;
+/
+
+
+-- NOTE: Additional file extensions for SQL*Loader include
+-- .bad - Bad Records
+-- .dsc - Discard Records
+-- .log - Log File
+
+prompt
+prompt sqlldr_control=./odbcapture_installation_logs.ctl
+host sqlldr '&1.' control=odbcapture_installation_logs.ctl data=odbcapture_installation_logs.csv log=odbcapture_installation_logs.log silent=HEADER,FEEDBACK
+
+begin
+ if '&_RC.' != '0' then
+ raise_application_error(-20000, 'Control file "odbcapture_installation_logs.ctl" returned error: &_RC.');
+ end if;
+end;
+/
+
diff --git a/wtptst/odbcapture_installation_logs.csv b/wtptst/odbcapture_installation_logs.csv
new file mode 100644
index 0000000..75cedb6
--- /dev/null
+++ b/wtptst/odbcapture_installation_logs.csv
@@ -0,0 +1,4 @@
+"wtptst","install_sys.log"
+"wtptst","install_system.log"
+"wtptst","install_wtptst.log"
+"wtptst","WTP/WT_SELF_TEST.log"
diff --git a/wtptst/odbcapture_installation_logs.ctl b/wtptst/odbcapture_installation_logs.ctl
new file mode 100644
index 0000000..3a1cf46
--- /dev/null
+++ b/wtptst/odbcapture_installation_logs.ctl
@@ -0,0 +1,8 @@
+LOAD DATA
+APPEND INTO TABLE "ODBCAPTURE_INSTALLATION_LOGS"
+FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ (LOAD_DTM SYSDATE
+ ,INSTALL_TYPE char(10)
+ ,FILE_NAME char(512)
+ ,CONTENTS LOBFILE(FILE_NAME) TERMINATED BY EOF
+ )
diff --git a/wtptst/report_status.sql b/wtptst/report_status.sql
new file mode 100644
index 0000000..b606658
--- /dev/null
+++ b/wtptst/report_status.sql
@@ -0,0 +1,114 @@
+
+--
+-- Report Status Script
+--
+-- Must be run as SYSTEM User (DBA)
+--
+-- Command Line Parameters:
+-- 1 - SYSTEM/password@TNSALIAS
+-- i.e. pass the username and password for the SYSTEM user
+-- and the TNSALIAS for the connection to the database.
+-- The Data Load installation requires this connection information.
+--
+-- Note: odbcapture_installation_logs table will be created
+-- to load installation logs (if not already available).
+--
+
+----------------------------------------
+-- Setup for Reports
+set linesize 2499
+set trimspool on
+set echo off
+set verify off
+set termout on
+set serveroutput on size unlimited format wrapped
+
+----------------------------------------
+prompt
+prompt Reporting Summary of Install Type Log Errors
+declare
+ TYPE err_aa_type is table of pls_integer index by varchar2(4000);
+ err_aa err_aa_type;
+ line_txt varchar2(4000);
+ so_far pls_integer;
+ end_pos pls_integer;
+ procedure add_line is
+ begin
+ if regexp_like(line_txt, '(ORA-|SQL-|SP2-|PLS-|PL2-|TNS-|(object|mmap) failed)')
+ then
+ begin
+ err_aa(line_txt) := err_aa(line_txt) + 1;
+ exception when NO_DATA_FOUND then
+ err_aa(line_txt) := 1;
+ end;
+ end if;
+ end add_line;
+begin
+ for buff in (select file_name, load_dtm, contents
+ from odbcapture_installation_logs
+ where install_type = 'wtptst'
+ and load_dtm > trunc(sysdate,'DD') - 2
+ order by file_name, load_dtm)
+ loop
+ dbms_output.put_line('Processing file ' || buff.file_name ||
+ ' (' || to_char(buff.load_dtm,'YYYY-MM-DD HH24:MI:SS') || ')');
+ err_aa.DELETE;
+ so_far := 0;
+ loop
+ end_pos := instr(buff.contents, chr(10), so_far + 1);
+ exit when end_pos = 0;
+ line_txt := substr(buff.contents, so_far + 1, end_pos - so_far - 1);
+ add_line;
+ so_far := end_pos;
+ end loop;
+ line_txt := substr(buff.contents, so_far + 1, 4000);
+ add_line;
+ if err_aa.COUNT = 0 then continue; end if;
+ line_txt := err_aa.FIRST;
+ loop
+ dbms_output.put_line(line_txt);
+ dbms_output.put_line(' ' || err_aa(line_txt) || ' lines: ' || line_txt);
+ exit when line_txt = err_aa.LAST;
+ line_txt := err_aa.NEXT(line_txt);
+ end loop;
+ end loop;
+end;
+/
+
+----------------------------------------
+prompt
+prompt Reporting Invalid Objects
+set feedback off
+set termout off
+spool list_invalids.csv
+@"list_invalids.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reporting JUnit XML Database Build Status
+set feedback off
+set termout off
+spool db_build_junit_report.xml
+@"db_build_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+prompt
+prompt Reorting JUnit XML Installation Log
+set feedback off
+set termout off
+spool log_files_junit_report.xml
+@"log_files_junit_report.sql" ""
+spool off
+set termout on
+set feedback on
+
+----------------------------------------
+-- Done with Reports
+set linesize 80
+set verify on
diff --git a/wtptst/update_id_sequences.sql b/wtptst/update_id_sequences.sql
new file mode 100644
index 0000000..a7861bc
--- /dev/null
+++ b/wtptst/update_id_sequences.sql
@@ -0,0 +1,59 @@
+
+--
+-- Update "wtptst" IDENTITY SEQUENCES
+--
+
+declare
+ UNDEFINED_SEQUENCE EXCEPTION; -- sequence not yet defined in this session
+ PRAGMA EXCEPTION_INIT (UNDEFINED_SEQUENCE, -8002);
+ l_last_seq number;
+ l_max_val number;
+ sql_txt varchar2(4000);
+ procedure do_it (in_schema_name in varchar2) is
+ begin
+ for buff in (
+ select tic.owner
+ ,tic.table_name
+ ,tic.column_name
+ ,tic.sequence_name
+ from dba_tab_identity_cols tic
+ where tic.owner = in_schema_name)
+ loop
+ -- Find the Current Sequence Value
+ sql_txt := 'select ' || buff.owner || '.' || buff.sequence_name ||
+ '.currval from dual';
+ begin
+ execute immediate sql_txt into l_last_seq;
+ exception when UNDEFINED_SEQUENCE
+ then
+ -- Find the Last Number for the Sequence
+ select ds.last_number into l_last_seq
+ from dba_sequences ds
+ where ds.sequence_owner = buff.owner
+ and ds.sequence_name = buff.sequence_name;
+ end;
+ -- Find the maximum IDENTITY column value
+ sql_txt := 'select max(' || buff.column_name || ')' ||
+ ' from ' || buff.owner || '.' || buff.table_name;
+ execute immediate sql_txt into l_max_val;
+ -- Display values found
+ dbms_output.put_line(buff.owner || '.' || buff.sequence_name || ' Last Sequence: ' || l_last_seq ||
+ ', ' || buff.owner || '.' || buff.table_name || ' max(' || buff.column_name || ') = ' || l_max_val);
+ if l_last_seq < l_max_val
+ then
+ -- Increment the sequence as necessary
+ sql_txt := 'begin' ||
+ ' while ' || buff.owner || '.' || buff.sequence_name || '.nextval < ' || l_max_val ||
+ ' loop null; end loop;' ||
+ 'end;';
+ dbms_output.put_line(sql_txt);
+ execute immediate sql_txt;-- using l_last_seq;
+ end if;
+ end loop;
+ dbms_output.put_line('-- ' || in_schema_name || ' Identity Sequence Updates is done.');
+ end do_it;
+begin
+ dbms_output.put_line('Update ID Sequences for wtptst Install Type');
+ do_it('WTP');
+end;
+/